关于将web项目从本地部署到阿里云服务器,不能使用stmp协议发送邮件的bug

问题阐述与解决方式

最近写的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]", "机器学习是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组", "什么是机器学习?");
		}
}
发布了61 篇原创文章 · 获赞 16 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41427568/article/details/103753323
今日推荐