【腾讯云】记录一次Could not connect to SMTP host: smtp.163.com, port: 25的解决办法[通俗易懂]

2022-11-09 16:46:43 浏览数 (2)

问题描述

最近准备将一个项目发布到腾讯云,在本地所有的功能都能够实现的很好,但是一到腾讯云上面就出现了一个问题:

错误报告内容:Could not connect to SMTP host: smtp.163.com, port: 25

翻译起来就是:不能连接到smtp.163.com,因为25号端口的原因。

问题解决

这是因为腾讯云(阿里云)基于安全考虑,会禁用25端口。

下面是腾讯云的后台:

解决的办法有:

  1. 解封25号端口(不推荐);
  2. 使用其他端口(465号端口,推荐)。

下面是163邮箱的截图:

也就是说,可以修改为:

代码语言:javascript复制
public static void main(String[] args) throws Exception {
        Properties prop = new Properties();
        //协议
        prop.setProperty("mail.transport.protocol", "smtp");
        //服务器
        prop.setProperty("mail.smtp.host", "smtp.exmail.qq.com");
        //端口
        prop.setProperty("mail.smtp.port", "465");
        //使用smtp身份验证
        prop.setProperty("mail.smtp.auth", "true");

        //获取Session对象
        Session s = Session.getDefaultInstance(prop,new Authenticator() {
            //此访求返回用户和密码的对象
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                PasswordAuthentication pa = new PasswordAuthentication("***", "********");
                return pa;
            }
        });
        //设置session的调试模式,发布时取消
        s.setDebug(true);
        MimeMessage mimeMessage = new MimeMessage(s);
        try {
            mimeMessage.setFrom(new InternetAddress("***@163.com"));
            mimeMessage.addRecipient(Message.RecipientType.TO, new InternetAddress("********@**.com"));
            //设置主题
            mimeMessage.setSubject("账户密码重置");
            mimeMessage.setSentDate(new Date());
            //设置内容
            mimeMessage.setText("您使用了密码重置功能");
            mimeMessage.saveChanges();
            //发送
            Transport.send(mimeMessage);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
        
    }

更优的解决方案

在上面的腾讯云的后台上,写明了还有一个解决方案(推荐):腾讯企业邮箱

也就是说:我们可以使用域名作为邮箱的后缀!

比如:我的域名是lvchademiao.com,这样可以使用message.lvchademiao.com作为邮箱来进行发送邮件!

这是一个不错的操作,而且这个功能是免费的!

附上地址:腾讯企业邮箱。

接下来就是一堆注册等步骤。注册完之后,申请到了一个邮箱message.lvchademiao.com。

接下来,又一个问题出来了:

错误报告内容:535 Error: ÇëʹÓÃÊÚȨÂëµÇ¼(一堆乱码)

网上的解决办法都是说没有使用授权码!

大哥,用邮箱的SMTP功能我能不知道使用授权码嘛!!

最终关键点在于:发件人账号是个人免费邮箱时username可以不加@及其后面的,但是如果发件人账号是企业邮箱时,发件人账号必须加@及其后面的。

即个人免费邮箱可以如下:ms.setAuth(“111111111”, “password1”);

但是企业邮箱必须是这样:ms.setAuth(“111111111@xxx.com”,”password1″);

也就是说:

代码语言:javascript复制
public static void main(String[] args) throws Exception {
        Properties prop = new Properties();
        //协议
        prop.setProperty("mail.transport.protocol", "smtp");
        //服务器
        prop.setProperty("mail.smtp.host", "smtp.exmail.qq.com");
        //端口
        prop.setProperty("mail.smtp.port", "465");
        //使用smtp身份验证
        prop.setProperty("mail.smtp.auth", "true");

        //使用SSL,企业邮箱必需!
        //开启安全协议,如果出错显示类不存在,就更新mail的jar包
        MailSSLSocketFactory sf = null;
        try {
            sf = new MailSSLSocketFactory();
            sf.setTrustAllHosts(true);
        } catch (GeneralSecurityException e1) {
            e1.printStackTrace();
        }
        prop.put("mail.smtp.ssl.enable", "true");
        prop.put("mail.smtp.ssl.socketFactory", sf);

        //获取Session对象
        Session s = Session.getDefaultInstance(prop,new Authenticator() {
            //此访求返回用户和密码的对象
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                PasswordAuthentication pa = new PasswordAuthentication("message@lvchademiao.com", "********");
                return pa;
            }
        });
        //设置session的调试模式,发布时取消
        s.setDebug(true);
        MimeMessage mimeMessage = new MimeMessage(s);
        try {
            mimeMessage.setFrom(new InternetAddress("message@lvchademiao.com"));
            mimeMessage.addRecipient(Message.RecipientType.TO, new InternetAddress("********@**.com"));
            //设置主题
            mimeMessage.setSubject("账户密码重置");
            mimeMessage.setSentDate(new Date());
            //设置内容
            mimeMessage.setText("您使用了密码重置功能");
            mimeMessage.saveChanges();
            //发送
            Transport.send(mimeMessage);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
        
    }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/186131.html原文链接:https://javaforall.cn

0 人点赞