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 );
啥意思呢,这儿取的是域名信息,而内网没有域名啊,而连接邮箱服务器的时候它要带上系统域名信息,才能返回连接信息,邮箱服务器通了以后要跟主机互通,可是我的linux服务器的只通内网,内网也不需要域名啊,域名把打通信息带跑偏了,一直报错。看源码感觉日志里面这EHLo host-10-211-72-238.openstackloca7有问题,就是不知道问题在哪,这就取到主机名称,调到邮箱服务器以后,服务器根据主机名称找回到发送主机。其他情况文章很多,可以找到,我这种情况独特全网没有描述,所以记录一下,可以交流。
第一种情况是阿里云限制了25端口阿里云服务器限制了25端口。问了126邮箱那边的技术客服,只支持25端口。问了阿里云的售后,他们说25端口不开放。可以考虑463端口或者他们的邮箱服务。第二种情况是linux无法解析域名是由于linux无法解析域名地址导致,需要在代码中将邮件服务器地址改成IP的,如:stmp.mail.163.com改成:220.181.72.147,如果不想改的话, 需要在lin...
本地调试时,是正常可以发送邮件的,一旦部署到linux服务器上之后就无法发送邮件,并且提示:无法连接到主机、端口
1.导致的原因是因为Linux服务器无法直接访问邮件服务地址,在本机window上ping邮件地址,得到对应的真实IP
2.进入linux服务器,修改hosts文件,将邮件服务地址的ip和域名映射好,hosts修改命令:vi /etc/hosts
3.修改后按下esc,输入:wq...
Could not connect to SMTP host: smtp.qq.com, port: 465
描述:在写邮件类的时候,一直连不上qq邮箱或者163邮箱的465端口,一直报Could not connect to SMTP host: smtp.qq.com, port: 465异常
网络上的解决方法:
1、加上如下代码:
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
2、加上如下代
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
25端口(SMTP):25端口为SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)服务所开放的,是用于发送邮件。
如今绝大多数邮件服务器都使用该协议。当你给别人发送邮件时,你的机器的某个动态端口(大于1024)就会与邮件服务器的25号端口建立一个连接,你发送的邮件就会通过这个连接传送到邮件服务器上,保存起来。
109端口(POP2):109端口是为PO