文档章节

阿里云ECS发送邮件时SMTP协议25端口异常,更换为SMTPS协议465端口

哼_哼
 哼_哼
发布于 2017/05/27 13:45
字数 846
阅读 1574
收藏 1

问题描述

今天公司一台服务器无法发送邮件给客户

于是看了一下日志报了以下错误

org.springframework.mail.MailSendException: Mail server connection failed; nested exception is javax.mail.MessagingException: Could not connect to SMTP host: smtp.aliyun.com, port: 25;

telnet 了一下邮箱的确不通

不对呀,公司其他几台ECS服务器上面的为什么好使?至此本人已懵逼

中间折腾了好几个小时,又提了工单,闹心的过程不说了。

最后确定问题是由于阿里云ECS服务器把25端口封锁了

那为什么只有这一台不好使?原因在于2016年9月底以后新购买的服务器才会封锁此端口,这台是后买的其他几台都是老服务器。

 

解决方法

如果想继续发送邮件只能使用SMTPS协议465端口

简单解释一下SMTPS协议是什么鬼

25端口(SMTP):25端口为SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)服务所开放的,是用于发送邮件。

465端口(SMTPS):465端口是为SMTPS(SMTP-over-SSL)协议服务开放的,这是SMTP协议基于SSL安全协议之上的一种变种协议,它继承了SSL安全协议的非对称加密的高度安全可靠性,可防止邮件泄露。SMTPS和SMTP协议一样,也是用来发送邮件的,只是更安全些,防止邮件被黑客截取泄露,还可实现邮件发送者抗抵赖功能。防止发送者发送之后删除已发邮件,拒不承认发送过这样一份邮件。

好吧,现在开始代码改造吧。

package com.plsoft.pmall.utils;

import com.plsoft.pmall.ProjectEnvironment;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;

import javax.mail.*;
import javax.mail.internet.MimeMessage;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;


/** SendMail - 发送邮件
 *
 * @version 1.0
 */
public class SendMail {
    private static Logger logger = LoggerFactory.getLogger(SendMail.class);

    //单例模式
    private static SendMail sendMail = null;
    //发送设置 由于始终从公司邮箱发送,所以只创建一套发送设置
    private JavaMailSenderImpl sender = new JavaMailSenderImpl();
    //发件人邮箱
    private String from = "";

    /**
     *  私有化构造函数
     */
    private SendMail(){
        try{
            //从配置文件获取参数
            InputStream inputStream = SendMail.class.getClassLoader().getResourceAsStream(ProjectEnvironment.getPropertiesFileName("application"));
            Properties applicationProperties = new Properties();
            applicationProperties.load(inputStream);
            String host = applicationProperties.getProperty("host");
            String username = applicationProperties.getProperty("user");
            String password = applicationProperties.getProperty("pwd");
            from = applicationProperties.getProperty("from");

            sender.setHost(host);//SMTP服务器地址
            sender.setPort(465); //使用SMTPS协议465端口
            sender.setUsername(username);//邮箱登陆用户名
            sender.setPassword(password);//邮箱登录密码
            Properties properties = new Properties();
            properties.put("mail.smtp.auth", "true");//登录服务器是否需要认证
            properties.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");//SSL证书Socket工厂
            properties.setProperty("mail.smtp.socketFactory.port", "465"); //使用SMTPS协议465端口

            sender.setJavaMailProperties(properties);
        }catch (IOException e){
            e.printStackTrace();
        }
    }

    /**
     * 获取实例
     * @return
     * @throws IOException
     */
    public static SendMail getSendMail(){
        if(sendMail == null){
            return new SendMail();
        }else{
            return sendMail;
        }
    }

    /**
     * 发送邮件
     * @param to 收件人邮箱
     * @param subject 邮件标题
     * @param content 邮件内容
     */
    public void send(String to,String subject,String content) {
        try {
            MimeMessage mailMessage = sender.createMimeMessage();
            MimeMessageHelper messageHelper = new MimeMessageHelper(mailMessage,"utf-8");
            messageHelper.setFrom(from);//发件人邮箱
            messageHelper.setTo(to);//收件人邮箱
            messageHelper.setSubject(subject);//邮件标题
            messageHelper.setText(content,true);//邮件内容,true表示启动HTML格式的邮件
            sender.send(mailMessage);//发送邮件
            logger.info("邮件\"" + subject + "\"已发送至" + to + "邮箱");
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}

 

改造后经测试组测试邮件发送正常!

这理其实顺带还解决了另一个问题,原来使用SMTP协议时QQ邮箱总判定为垃圾邮件,自从换了SMTPS协议之后就不会再被误判为垃圾邮件了。

© 著作权归作者所有

哼_哼

哼_哼

粉丝 11
博文 63
码字总数 87158
作品 0
哈尔滨
私信 提问
javamail使用SSL加密方式465端口

目前使用javamail发送邮件一般使用25端口,由于25端口是一个简单的邮件发送协议,所以经常会被滥用发送垃圾邮件,因此在一些服务器比如阿里云上会封禁该端口的使用. 解决的办法就是使用465端口:...

竹竿先生
2016/12/13
976
1
Centos7使用smtps 465端口发送邮件

系统:Centos7 环境:阿里云ECS 描述: 使用/etc/mail.rc配置发送邮件,想必大部分运维都配置过,这次新搭建了zabbix-server在配置邮件报警的时候,使用之前的配置方式,但是卡在连接到smtp服...

SA_小科
2018/05/31
0
0
centos7(linux)系统下利用自带的mail发送邮件服务

centos7(linux)系统下利用自带的mail发送邮件服务 2018年07月14日 09:55:53 hbqhzx123 阅读数:2956 本章三部分,一是基于虚拟机下的centos7环境搭建,二是基于在阿里云购买的centos7服务器环...

linjin200
04/15
0
0
阿里云邮免费企业邮箱使用smtp发送邮件失败(SMTP开启、配置问题)

阿里云邮免费企业邮箱使用smtp发送邮件失败(SMTP开启、配置问题) 企业邮箱 在Foxmail 7.0上POP3/IMAP协议设置方法 Foxmail 7.0 POP3/IMAP 设置方法如下: 1.单击 工具 > 账号管理 > 新建 ...

优惠码发放
2018/08/12
0
0
sendmail邮件加密与身份验证

Mail协议加密 邮件在发送接收时的协议决定了邮件不可避免的安全问题,解决的方法有两个: 1.协议安全 a)邮件发送协议 smtp 【tcp 25端口】 b)邮件接受协议 pop3 【tcp 110端口 离线方式】 im...

lining_at_HERE
2013/11/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot 2 快速教程:WebFlux 集成 Mongodb(四)

摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 这是泥瓦匠的第104篇原创 文章工程: * JDK 1.8 * Maven 3.5.2 * Spring Boot 2.1....

泥瓦匠BYSocket
45分钟前
3
0
$_ENV

$_ENV数组中的内容是在PHP解析器运行时,从PHP所在服务器中的环境变量, 导入到PHP的全局命名空间, 转变为PHP全局变量。 这些变量很多是由支持 PHP 运行的 Shell 提供的,并且不同的系统很可能...

vinci321
59分钟前
2
0
Guava RateLimiter + AOP注解实现单机限流、统计QPS

1、基于springboot项目pom.xml添加如下依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId></dependency><d......

铁骨铮铮
今天
3
0
JAVA NIO Connection reset by peer 异常

客户端主动断开与服务端的连接,但是如果客户端掉线,服务端就接收不到了。。 异常信息 java.io.IOException: Connection reset by peerat java.base/sun.nio.ch.FileDispatcherImpl.read...

Jeremy_pan
今天
2
0
龙芯版办公软件下载

金山wps office   rpm包:http://ftp.loongnix.org/os/loongnix/1.0/os/Packages/w/wps-office-10.8.0.6472-1.a20p1.mips64el.rpm   deb包:http://packages.deepin.com/loongson/pool/......

gugudu
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部