POP3/SMTP协议
smtp默认端口是:25
接收邮件服务器:pop.exmail.qq.com ,使用SSL,端口号995
发送邮件服务器:smtp.exmail.qq.com ,使用SSL,端口号465
海外用户可使用以下服务器
接收邮件服务器:hwpop.exmail.qq.com ,使用SSL,端口号995
发送邮件服务器:hwsmtp.exmail.qq.com ,使用SSL,端口号465
废话不多说,直接上代码
if (useSSL == true) {
String smtpPort = "465";
props.setProperty("mail.transport.protocol", "smtp"); // 使用的协议(JavaMail规范要求)
props.setProperty("mail.smtp.host", smtphost);
props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.smtp.port", smtpPort);
props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.setProperty("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.socketFactory.port", smtpPort);
// props.put("mail.smtp.starttls.enable", "true");
props.setProperty("mail.smtp.ssl.enable", "true");
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
props.put("mail.smtp.ssl.socketFactory", sf);
} else {
String smtpPort = "25";
props.setProperty("mail.transport.protocol", "smtp");
props.setProperty("mail.smtp.host", smtphost);
props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.smtp.port", smtpPort);
props.setProperty("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.socketFactory.port", smtpPort);
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
props.put("mail.smtp.ssl.socketFactory", sf);
}
Authenticator authenticator = new Authenticator() {
@Override
protected javax.mail.PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(sendmail, sendpassword);
}
};
Session session = Session.getDefaultInstance(props, authenticator);
// 2. 根据配置创建会话对象, 用于和邮件服务器交互
// Session session = Session.getDefaultInstance(props);
session.setDebug(true); // 设置为debug模式, 可以查看详细的发送 log
System.getProperties().setProperty("mail.mime.splitlongparameters", "false");
以上方法已经可以处理大部分的邮件发送业务了,但是今天遇到一个坑爹的问题,客户使用的是office365的邮箱,上面的方法用不了了,郁闷......
经过和客户确认,他们使用的office365邮箱,
端口是:587
SMTP服务器是:smtp.office365.com
加密方法是:STARTTLS
于是我就改了代码将上面的465端口全部改为了587,结果还是不行,连接超时
查看资料发现如果要使用365邮箱需要注释一些配置
//props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory")
// props.setProperty("mail.smtp.ssl.enable", "true");
按网上说的改了以后,信心满满的去测试,结果还是不行,报了下面的错误
javax.mail.AuthenticationFailedException: 535 5.7.3 Authentication unsuccessful [HK2PR0401CA0024.apcprd04.prod.outlook.com]
at com.sun.mail.smtp.SMTPTransport$Authenticator.authenticate(SMTPTransport.java:965)
at com.sun.mail.smtp.SMTPTransport.authenticate(SMTPTransport.java:876)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:780)
at javax.mail.Service.connect(Service.java:366)
at javax.mail.Service.connect(Service.java:246)
at com.vamtoo.dsm.common.util.EmailUtil.testConnectBySmtp(EmailUtil.java:201)
at com.vamtoo.dsm.controller.SysParamController.save(SysParamController.java:100)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
接着找原因,发现还要添加一个配置
props.put("mail.smtp.starttls.enable", "true");
添加完以后测试发现还是报错
com.sun.mail.smtp.SMTPSendFailedException: 451 5.7.3 STARTTLS is required to send mail.......
需要在ssl配置中再添加一个配置
props.put("mail.smtp.starttls.required", "true");
至此问题解决