1、错误描述:
java在本机(windows)发送邮件正常,布置在linux上报错误:Could not connect to SMTP host: smtp.163.com, port: 25
2、产生原因:
ECS基于安全考虑,目前已经禁用25端口
如果您的程序部署在阿里云ECS服务器上,建议您不勾选SSL时,使用80端口,勾选ssl时,使用465端口
3、解决方法
1)首先,在linux上启动465端口
2)代码修改如下:
package cn.j0.app.shuoba.util;
import com.sun.mail.util.MailSSLSocketFactory;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.security.GeneralSecurityException;
import java.util.Properties;
/**
* FileName: SendEmailUtils
* Author: 作者
* Date: 2019/1/31 14:58
* Description: 发送邮件
*/
public class SendEmailUtils {
public static void sendMail(String email, String emailMsg) throws MessagingException, GeneralSecurityException {
// 1.创建一个程序与邮件服务器会话对象 Session 解决linux上发送邮件失败问题,需要下面的配置
MailSSLSocketFactory sf = new MailSSLSocketFactory();
// 设置信任所有的主机
sf.setTrustAllHosts( true );
Properties props = new Properties();
props.setProperty( "mail.transport.protocol", "SMTP" );
props.setProperty( "mail.host", "smtp.163.com" );
props.setProperty( "mail.smtp.auth", "true" );// 指定验证为true是否需要身份验证
props.setProperty( "mail.smtp.ssl.enable", "true" );
props.put( "mail.smtp.ssl.socketFactory",sf );
// 创建验证器
Authenticator auth = new Authenticator() {
public PasswordAuthentication getPasswordAuthentication() {
// 密码验证,第一个参数:邮箱名不包括@163.com,第二个参数:授权码
return new PasswordAuthentication( "邮箱名不包括@163.com", "授权码" );
}
};
Session session = Session.getInstance( props, auth );
// 开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
session.setDebug( true );
// 2.创建一个Message,它相当于是邮件内容
Message message = new MimeMessage( session );
message.setFrom( new InternetAddress( "发送者的邮箱地址" ) ); // 设置发送者
message.setRecipient( MimeMessage.RecipientType.TO, new InternetAddress( email ) ); // 设置发送方式与接收者
message.setSubject( "单词大赛结果" );
//message.setText("这是一封激活邮件,请<a href='#'>点击</a>");
message.setContent( emailMsg, "text/html;charset=utf-8" );
// 3.创建 Transport用于将邮件发送
Transport.send( message );
}
}