title: 阿里云服务器坑之邮件无法发送 tags:
- ecs
- 25
- 邮件发送失败 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读取
但是现状是测试环境均可以发送 但是生产环境无法发送!
调查
- 首先考虑对应阿里云机器的网络
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
复制代码
复制代码
- 证实网络是通的 同时由于该台服务器是jenkins服务器【由运维人员配置过jenkins发送邮件功能 可以成功发送邮件】
- 网络没有问题 那么有否可能端口被封呢?但是jenkins服务器可以发送邮件有如何解释?调查陷入了僵局
- 于是找到jenkins管理员账号查看邮箱设定
- 发现jenkins配置制定了端口号 但是我们的配置中没有端口号的指定
- 那么默认的端口号是啥呢?
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;
}
复制代码
复制代码
-
可以看到默认端口号是25 并且ssl是false
-
因此使用telnet确认是否25端口不通
-
但是同期的报表工程如下
-
很明显25端口在新的机器上无法使用!!!
-
那么我们更换使用465端口
-
因此思路如下 我们在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>
复制代码
复制代码
- 默认值使用25和false 但是当部署在新机器上可以使用配置成465和true 这样就可以发送邮件
- 网上检索了 不止一个倒霉蛋碰到了此问题 www.100cm.cn/article-126…
- 阿里云官方说明help.aliyun.com/knowledge_d… 新的机器上默认禁止25端口!!! 新的机器上默认禁止25端口!!!新的机器上默认禁止25端口!!!