相关文章推荐
爱吹牛的大熊猫  ·  WebBrowser.DocumentTex ...·  1 月前    · 
爱旅游的帽子  ·  20.1 OpenSSL ...·  5 月前    · 
紧张的柠檬  ·  python做项目日程表-掘金·  8 月前    · 

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