问题阐述与解决方式
最近写的javaweb项目中有用到发送邮件功能,自然会想到使用STMP协议,java也有相应的jar包,于是很快就在本地调试成功,但是部署到阿里云服务器(我的是ubuntu16.04)上总是报错:
javax.mail.MessagingException: Could not connect to SMTP host: smtp.qq.com, port: 25;
百度后才知道阿里云服务器不开放25端口,那就需要将25端口(STMP协议)换到465端口(STMPS协议),采用SSL协议加密传输邮件。
百度百科对STMPS的定义如下:
SMTPS:465端口是为SMTPS(SMTP-over-SSL)协议服务开放的,这是SMTP协议基于SSL安全协议之上的一种变种协议,它继承了SSL安全协议的非对称加密的高度安全可靠性,可防止邮件泄露。SMTPS和SMTP协议一样,也是用来发送邮件的,只是更安全些,防止邮件被黑客截取泄露,还可实现邮件发送者抗抵赖功能。防止发送者发送之后删除已发邮件,拒不承认发送过这样一份邮件。
既然找到问题了,就开始解决问题吧,具体修改后的配置代码如下:
//设置SSL加密方式
MailSSLSocketFactory sf=new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
//获取系统属性
Properties properties = new Properties();
properties.put("mail.smtp.host", "smtp.qq.com");// 主机名
properties.put("mail.smtp.port", "465");//使用465端口号
properties.put("mail.smtp.auth", "true");//开启认证
properties.put("mail.smtp.ssl.enable", "true");//启用ssl安全协议
properties.put("mail.smtp.ssl.socketFactory", sf);//设置ssl配置
properties.put("mail.debug", "true");// 显示debug信息
后来又碰到一个问题,就是我的 mail.jar 包里没有MailSSLSocketFactory这个类,想到这个jar包是两年前做比赛的时候下载的,可能是版本太老,最后在github上下载最新版本的jar包,可以正常发送邮件。最新版本的jar包链接:
javamail的github地址
完整代码
/**
* @author Author:lhy
* @version created on :2019年12月18日 下午8:43:35
*/
package utils;
import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.*;
import com.sun.mail.util.MailSSLSocketFactory;
public class EmailUtil {
private static String from = "[email protected]"; // 发件人邮箱地址
private static String user = "咕咕单车"; // 发件人称号
private static String password = "你的stmp授权码"; // 发件人邮箱客户端授权码,不是邮箱密码!!!
/* 发送邮件 */
public static boolean sendMail(String to, String text, String title) {
try {
MailSSLSocketFactory sf=new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
//获取系统属性
Properties properties = new Properties();
properties.put("mail.smtp.host", "smtp.qq.com");// 主机名
properties.put("mail.smtp.port", "465");//使用465端口号
properties.put("mail.smtp.auth", "true");//开启认证
properties.put("mail.smtp.ssl.enable", "true");//允许使用ssl加密传输
properties.put("mail.smtp.ssl.socketFactory", sf);
properties.put("mail.debug", "true");// 显示debug信息
// 得到会话对象
Session session = Session.getInstance(properties);
// 获取邮件对象
Message message = new MimeMessage(session);
// 设置发件人邮箱地址
message.setFrom(new InternetAddress(from));
// 设置收件人邮箱地址,一次向多个邮箱发送
//message.setRecipients(Message.RecipientType.TO, new InternetAddress[]{new InternetAddress("[email protected]"),new InternetAddress("[email protected]"),new InternetAddress("[email protected]")});
// 设置收件人邮箱地址,一次向一个邮箱发送
message.setRecipient(Message.RecipientType.TO, new InternetAddress(to));//一个收件人
// 设置邮件标题
message.setSubject(title);
// 设置邮件内容
message.setText(text);
// 得到邮差对象
Transport transport = session.getTransport();
// 连接自己的邮箱账户
transport.connect(from, password);// 密码为QQ邮箱开通的stmp服务后得到的客户端授权码
// 发送邮件
transport.sendMessage(message, message.getAllRecipients());
// 关闭资源
transport.close();
return true;
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return false;
}
}
public static void main(String[] args) { // 做测试用
sendMail("[email protected]", "机器学习是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组", "什么是机器学习?");
}
}