阿里云服务器坑之邮件无法发送


title: 阿里云服务器坑之邮件无法发送 tags:

  • ecs
  • 25
  • email
  • mail
  • 邮件发送失败 categories: 工作日志 date: 2017-12-14 10:10:38

背景

随着F6规模的扩大 系统也是越做越多!最近也上了保险项目。出于部分机器分配考虑 ‘临时’将保险项目放置在jenkins服务器上【jenkins服务器是最新申请的机器】

由于放置在jenkins服务器上导致的问题 小伙伴可以阅读上一篇Jenkins小坑之执行Shell

本篇需要来说明一下关于邮件发送的坑!

问题

保险项目上线后 发现线上错误不会发送错误邮件 当时同期毕业的报表项目可以成功发送邮件!

由于我们目前使用QQ企业邮箱发送邮件 会发生发送频率过高导致被邮件发不出来。但是事实证明并没有!

于是调查logback的配置

    <springProperty scope="context" name="myAppName" source="spring.application.name"
                    defaultValue="zeus"/>
    <springProperty scope="context" name="email.username" source="logging.email.username"
                    defaultValue="***@f6car.com"/>
    <springProperty scope="context" name="email.password" source="logging.email.password"
                    defaultValue="***"/>
    <springProperty scope="context" name="email.from" source="logging.email.from"
                    defaultValue="***@f6car.com"/>
    <springProperty scope="context" name="email.to" source="logging.email.to"
                    defaultValue="***@f6car.com"/>
    <springProperty scope="context" name="email.subject" source="logging.email.subject"
                    defaultValue="ZEUS-NOTICE-DEV-%m{30}"/>
    <springProperty scope="context" name="email.smtp.host" source="logging.email.smtp.host"
                    defaultValue="smtp.exmail.qq.com"/>
    <springProperty scope="context" name="email.pattern" source="logging.email.pattern"
                    defaultValue="%d [%level] [%thread] %logger{15}:%line %msg%n"/>
    <springProperty scope="context" name="email.filter" source="logging.email.ThresholdFilter"
                    defaultValue="ERROR"/>
    <appender name="MAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        <To>${email.to}</To>
        <username>${email.username}</username>
        <subject>${email.subject}</subject>
        <from>${email.from}</from>
        <Name>${email.smtp.host}</Name>
        <password>${email.password}</password>
        <SMTPHost>${email.smtp.host}</SMTPHost>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>${email.pattern}</pattern>
        </layout>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>${email.filter}</level>
        </filter>
    </appender>
复制代码

上述配置由于不同机器和环境会从springboot不同的profile读取

但是现状是测试环境均可以发送 但是生产环境无法发送!

调查

  1. 首先考虑对应阿里云机器的网络
       PING smtp.exmail.qq.com (163.177.72.143) 56(84) bytes of data.
       64 bytes from 163.177.72.143 (163.177.72.143): icmp_seq=1 ttl=50 time=34.1 ms
       64 bytes from 163.177.72.143 (163.177.72.143): icmp_seq=2 ttl=50 time=34.3 ms
       64 bytes from 163.177.72.143 (163.177.72.143): icmp_seq=3 ttl=50 time=34.2 ms
       ^C
       --- smtp.exmail.qq.com ping statistics ---
       3 packets transmitted, 3 received, 0% packet loss, time 2002ms
复制代码
 
复制代码
  1. 证实网络是通的 同时由于该台服务器是jenkins服务器【由运维人员配置过jenkins发送邮件功能 可以成功发送邮件】
  2. 网络没有问题 那么有否可能端口被封呢?但是jenkins服务器可以发送邮件有如何解释?调查陷入了僵局
  3. 于是找到jenkins管理员账号查看邮箱设定
  4. 发现jenkins配置制定了端口号 但是我们的配置中没有端口号的指定
  5. 那么默认的端口号是啥呢?
        public abstract class SMTPAppenderBase<E> extends AppenderBase<E> {
         
            static InternetAddress[] EMPTY_IA_ARRAY = new InternetAddress[0];
            // ~ 14 days
            static final long MAX_DELAY_BETWEEN_STATUS_MESSAGES = 1228800 * CoreConstants.MILLIS_IN_ONE_SECOND;
         
            long lastTrackerStatusPrint = 0;
            long delayBetweenStatusMessages = 300 * CoreConstants.MILLIS_IN_ONE_SECOND;
         
            protected Layout<E> subjectLayout;
            protected Layout<E> layout;
         
            private List<PatternLayoutBase<E>> toPatternLayoutList = new ArrayList<PatternLayoutBase<E>>();
            private String from;
            private String subjectStr = null;
            private String smtpHost;
            private int smtpPort = 25;
            private boolean starttls = false;
            private boolean ssl = false;
            private boolean sessionViaJNDI = false;
            private String jndiLocation = CoreConstants.JNDI_COMP_PREFIX + "/mail/Session";
         
            String username;
            String password;
            String localhost;
         
            boolean asynchronousSending = true;
         
            private String charsetEncoding = "UTF-8";
         
            protected Session session;
         
            protected EventEvaluator<E> eventEvaluator;
         
            protected Discriminator<E> discriminator = new DefaultDiscriminator<E>();
            protected CyclicBufferTracker<E> cbTracker;
         
            private int errorCount = 0;
        }
复制代码
 
复制代码
  1. 可以看到默认端口号是25 并且ssl是false

  2. 因此使用telnet确认是否25端口不通

  3. 但是同期的报表工程如下

  4. 很明显25端口在新的机器上无法使用!!!

  5. 那么我们更换使用465端口

  6. 因此思路如下 我们在logback中增加对应配置用来设置端口和ssl

 <springProperty scope="context" name="myAppName" source="spring.application.name"
                        defaultValue="zeus"/>
        <springProperty scope="context" name="email.username" source="logging.email.username"
                        defaultValue="***@f6car.com"/>
        <springProperty scope="context" name="email.password" source="logging.email.password"
                        defaultValue="***"/>
        <springProperty scope="context" name="email.from" source="logging.email.from"
                        defaultValue="***@f6car.com"/>
        <springProperty scope="context" name="email.to" source="logging.email.to"
                        defaultValue="***@f6car.com"/>
        <springProperty scope="context" name="email.subject" source="logging.email.subject"
                        defaultValue="ZEUS-NOTICE-DEV-%m{30}"/>
        <springProperty scope="context" name="email.smtp.host" source="logging.email.smtp.host"
                        defaultValue="smtp.exmail.qq.com"/>
        <springProperty scope="context" name="email.smtp.port" source="logging.email.smtp.port"
                        defaultValue="25"/>
        <springProperty scope="context" name="email.ssl" source="logging.email.ssl"
                        defaultValue="false"/>
        <springProperty scope="context" name="email.pattern" source="logging.email.pattern"
                        defaultValue="%d [%level] [%thread] %logger{15}:%line %msg%n"/>
        <springProperty scope="context" name="email.filter" source="logging.email.ThresholdFilter"
                        defaultValue="ERROR"/>
        <appender name="MAIL" class="ch.qos.logback.classic.net.SMTPAppender">
            <To>${email.to}</To>
            <username>${email.username}</username>
            <subject>${email.subject}</subject>
            <from>${email.from}</from>
            <Name>${email.smtp.host}</Name>
            <password>${email.password}</password>
            <SMTPHost>${email.smtp.host}</SMTPHost>
            <SMTPPort>${email.smtp.port}</SMTPPort>
            <SSL>${email.ssl}</SSL>
            <layout class="ch.qos.logback.classic.PatternLayout">
                <pattern>${email.pattern}</pattern>
            </layout>
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>${email.filter}</level>
            </filter>
        </appender>
复制代码
 
复制代码
  1. 默认值使用25和false 但是当部署在新机器上可以使用配置成465和true 这样就可以发送邮件
  2. 网上检索了 不止一个倒霉蛋碰到了此问题 www.100cm.cn/article-126…
  3. 阿里云官方说明help.aliyun.com/knowledge_d… 新的机器上默认禁止25端口!!! 新的机器上默认禁止25端口!!!新的机器上默认禁止25端口!!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值