『壹』 javaMail如何能保证邮件发送成功
当javamail使用smtp服务发送邮件时,当你把邮件发送到服务器的时候,你只能得到已经发送到smtp的队列中的状态,但是邮件服务器是否能发送成功,你是得不到的。就是说,你不能保证邮件发送一定成功。 这就取决于SMTP协议的内容传输了。
但是SMTP协议如果传输失败,是会报错的。SMTP由TCP提供的可靠的数据传输服务把邮件消息从发信人的邮件服务器传送到收信人的邮件服务器。
所以我们可以认为当我们调用JavaMail发送邮件时,如果程序没有报错则表示邮件发送成功。
SMTP通常有两种工作模式:发送SMTP和接收SMTP。
具体工作方式为:发送SMTP在接到用户的邮件请求后,判断此邮件是否为本地邮件,若是直接投送到用户的邮箱,否则向dns查询远端邮件服务器的 MX纪录,并建立与远端接收SMTP之间的一个双向传送通道,此后SMTP命令由发送SMTP发出,由接收SMTP接收,而应答则反方面传送。一旦传送通 道建立,SMTP发送者发送MAIL命令指明邮件发送者。如果SMTP接收者可以接收邮件则返回OK应答。SMTP发送者再发出RCPT命令确认邮件是否 接收到。如果SMTP接收者接收,则返回OK应答;如果不能接收到,则发出拒绝接收应答(但不中止整个邮件操作),双方将如此重复多次。当接收者收到全部 邮件后会接收到特别的序列,如果接收者成功处理了邮件,则返回OK应答即可。
『贰』 用spring和javamail实现代理服务器发邮件时,报异常MailSendException: Mail server connection failed
javamail是不支持HTTP代理的,只支持socks代理。具体要怎么做请参阅。网页链接
『叁』 如何使用JavaMail删除QQ邮件服务器上的邮件
JavaMail是提供给开发者处理电子邮件相关的编程接口。它是Sun发布的用来处理email的API。可以方便地执行一些常用的邮件传输。
如果需要使用JavaMail编程来实现删除QQ邮件服务器上的邮件,可以参考以下代码,在调用deleteMessages方法时,只需要传入邮件服务器地址、端口、邮箱登录用户名、登录密码以及需要删除的邮件主题五个参数即可:
packagecom.what21.network.mail;
importjava.util.Properties;
importjavax.mail.Flags;
importjavax.mail.Folder;
importjavax.mail.Message;
importjavax.mail.MessagingException;
importjavax.mail.NoSuchProviderException;
importjavax.mail.Session;
importjavax.mail.Store;
{
/**
*删除主题中包含subjectToDelete字符串的所有邮件
*
*@param邮箱服务器地址
*@param邮箱服务器端口
*@param登录用户名
*@param登录密码
*@param如果邮件主题包含这个字符串就会对其进行删除操作
*/
publicvoiddeleteMessages(Stringhost,Stringport,StringuserName,
Stringpassword,StringsubjectToDelete){
Propertiesproperties=newProperties();
//邮箱服务器配置
properties.put("mail.imap.host",host);
properties.put("mail.imap.port",port);
//SSL连接配置
properties.setProperty("mail.imap.socketFactory.class",
"javax.net.ssl.SSLSocketFactory");
properties.setProperty("mail.imap.socketFactory.fallback","false");
properties.setProperty("mail.imap.socketFactory.port",
String.valueOf(port));
Sessionsession=Session.getDefaultInstance(properties);
try{
//连接邮箱服务器
Storestore=session.getStore("imap");
store.connect(userName,password);
//打开收件箱
FolderfolderInbox=store.getFolder("INBOX");
folderInbox.open(Folder.READ_WRITE);
//从服务器获取新邮件
Message[]arrayMessages=folderInbox.getMessages();
for(inti=0;i<arrayMessages.length;i++){
Messagemessage=arrayMessages[i];
Stringsubject=message.getSubject();
if(subject.contains(subjectToDelete)){
//给需要删除的邮件打上标签
message.setFlag(Flags.Flag.DELETED,true);
System.out.println("MarkedDELETEformessage:"+subject);
}
}
//删除指定的邮件
booleanexpunge=true;
folderInbox.close(expunge);
//anotherway:
//folderInbox.expunge();
//folderInbox.close(false);
//断开连接
store.close();
}catch(NoSuchProviderExceptionex){
System.out.println("Noprovider.");
ex.printStackTrace();
}catch(MessagingExceptionex){
System.out.println(".");
ex.printStackTrace();
}
}
/**
*测试-Gmail邮箱
*protocol.
*/
publicstaticvoidmain(String[]args){
Stringhost="imap.gmail.com";
Stringport="993";
StringuserName="your_email";
Stringpassword="your_password";
EmailMessageRemoverremover=newEmailMessageRemover();
StringsubjectToDelete="Newsletter";
remover.deleteMessages(host,port,userName,password,subjectToDelete);
}
}
『肆』 SpringBoot使用JavaMailSender发送邮件
在Spring Boot项目中使用JavaMailSender进行邮件发送已成为一种高效便捷的方式。随着技术发展,早期使用JavaMail API编写邮件发送代码变得相对繁琐。为解决这一问题,Spring框架推出了JavaMailSender接口,进一步简化了邮件发送过程。在此基础上,Spring Boot通过引入spring-boot-starter-mail依赖包,为开发者提供了一站式的邮件发送解决方案。
JavaMail是由Sun定义的用于发送和接收电子邮件的API,广泛适用于不同厂商的实现。虽然它未被包含在JDK中,但却是Java EE的重要组成部分。JavaMailSender底层基于JavaMail jar包,实现邮件发送功能。
邮件通信协议分为SMTP、POP3和IMAP三种。对于加密传输,有SMTPS、POP3S和IMAPS等协议,确保数据安全。此外,JavaMail服务提供程序需要配合JAF(JavaBeansActivationFramework)处理非文本邮件内容,包括MIME(多用途互联网邮件扩展)、URL页面和文件附件等。
在Spring Boot中,发送邮件流程可概括为以下几个步骤:
1. **添加依赖**:在pom.xml文件中引入spring-boot-starter-mail依赖。
2. **配置参数**:在application.properties(或application.yml)文件中加入相应的配置信息,例如邮箱服务器地址、端口号、用户名、密码等。
示例配置(以网易邮箱为例):
mail.smtp.host=smtp.163.com
mail.smtp.auth=true
mail.smtp.starttls.enable=true
mail.debug=true
端口号默认为25,根据实际情况调整。
3. **编写邮件服务接口**:定义一个接口并实现发送邮件功能。
4. **封装在Controller层**:在Controller层中调用邮件服务接口,完成邮件发送。
至此,发送邮件的流程完整结束。启动项目并调用相关接口,即可成功发送邮件。
Spring Boot的starter模块提供了自动化配置,引入spring-boot-starter-mail依赖后,系统会根据配置文件中的信息创建JavaMailSender实例。因此,开发者只需在需要使用邮件发送功能的代码中使用@Autowired注解引入JavaMailSender对象即可。