springboot集成javax mail使用第三方发送邮件时存在各种各样的异常,正常流程大概如下:
1. 邮箱开通smtp功能(以126邮箱为例)
2. 项目pom文件导入依赖
导入以下几个依赖时会报错
Exception in thread "main" java.lang.NoSuchMethodError: com.sun.mail.util.TraceInputStream.<init>(Ljava/io/OutputStream;Lcom/sun/mail/util/MailLogger;)V
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-email</artifactId>
<version>1.5</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>javax.mail-api</artifactId>
<version>1.6.2</version>
</dependency>
考虑使用spring-boot的起步依赖后改为导入以下依赖,成功不报异常
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-email</artifactId>
<version>1.5</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
也就是用spring-boot的起步依赖替换activation以及javax.mail-api两个依赖;
3. 编写发送邮件的接口
@Service
public class SendCodeImpl implements SendCode {
@Autowired
EmailInfoConfig emailInfoConfig;
/**
* @param address 接收邮件的邮箱地址
* @param code 外部传入的随机生成的验证码
* @return
*/
@Override
public Boolean sendCode(String address, String code) {
HtmlEmail send = new HtmlEmail();
try {
send.setSocketConnectionTimeout(25000);
send.setHostName("smtp.sina.com");
send.setCharset("utf-8");
//第一个参数是发送者的Eamil 第二个参数是发送者昵称
send.setFrom("xxxxx@sina.com", "zhangsan");
//第一个参数是发送者的Eamil 第二个参数是开通邮箱smtp功能时获取的授权码
send.setAuthentication("xxxxx@sina.com", "xxxxxxxxxx");
// 接收者的邮箱
send.addTo(address);
//Eamil的标题
send.setSubject("xxx给您送上验证码");
//Eamil的内容
send.setMsg("欢迎光临,特此送上验证: " + code + " 请您签收");
// 邮箱第三方使用的端口
send.setSmtpPort(25); // 邮箱第三方使用的端口
//send.setSSLCheckServerIdentity(true); // 开启SSL加密
send.send(); //发送
} catch (EmailException e) {
e.printStackTrace();
}
return new Boolean(true);
}
}
此处可能会报异常
org.springframework.mail.MailSendException: Failed messages: javax.mail.MessagingException: Exception reading response (java.net.SocketTimeoutException: Read timed out)
经过尝试,qq邮箱与126邮箱都会报该异常,换用以上的sina邮箱后不报异常,遇到该异常时多换用不同邮箱,不一定哪个邮箱就一定有效。