[基础] 通知·邮件

1,621 阅读4分钟

背景

回顾一下见过的基础通知方式,主要有四种:邮件、IM、短信、电话。最近维护的Sentry监控服务涉及邮件报警,谈了一次坑后,对邮件服务有了大致了解,这里总结一下。后面有时间再补充探索IM、短信、电话等方式。

平日我们发邮件,下载一个客户端进行配置或者登录网页然后就可以发邮件了。但是真的要在代码中写发送邮件逻辑,发现还是有点不太一样的

Sentry邮件配置

经历

我是基于百度云的CCE容器(K8S)搭建的Sentry 9.1.2版本 ,邮件可以自己选择,这个版本文档中推荐自己安装exim4本地服务,然后Sentry去连接。

基于 exim4 的docker 运行在了K8S上

Sentry对应yaml邮件如下:

# BYO Email server
# TODO: Add exim4 template
# https://docs.sentry.io/server/installation/docker/#outbound-email
email:
    
    enable_replies: false
    from_address: Sentry Mointor <root@localhost>
    host: 199.11.3.722
    password: null
    port: 25
    use_tls: false
    user: null

测试运行没问题,本想万事大吉。谁知接连发生两起悲剧:

邮件发送报错

邮件只能发送公司邮箱,想发送给126等第三方邮件报错。

通过日志发现,大概原因不合规,第三方邮件自己定义一些过滤规则,比如对ip验证。规则通过后才放行,否则直接被打会 ,网易、谷歌都这样。Sentry不支持QQ邮箱,添加用户的时候前端输入框直接拦截了。

  491   SMTP>> RCPT TO:<kevin_xxx@126.com>
  491   SMTP>> DATA
  491   SMTP<< 550 MI:IMF 126 mx38,1MmowADna7hhFA9egwknDw--.45740S3 1578046562 http://mail.163.com/help/help_spam_16.htm?ip=180.76.135.108&hostid=mx38&time=1578046562
  491   SMTP<< 503 bad sequence of commands
  491   SMTP<< 503 bad sequence of commands
  491   SMTP>> QUIT
  491   SMTP(close)>>
  
文档中错误550: 
...
•550 MI:NHD HELO命令不允许为空;
•550 MI:IMF 发信人电子邮件地址不合规范。请参考http://www.rfc-editor.org/关于电子邮件规范的定义;
•550 MI:SPF 发信IP未被发送域的SPF许可。请参考http://www.openspf.org/关于SPF规范的定义;
•550 MI:DMA 该邮件未被发信域的DMARC许可。请参考http://dmarc.org/关于DMARC规范的定义;
•550 MI:STC 发件人当天的连接数量超出了限定数量,当天不再接受该发件人的邮件。请控制连接次数;
•550 RP:FRL 网易邮箱不开放匿名转发(Open relay);
....

邮件发不出去

自建邮件服务,一段时间后发不出去了,直接返回SMTP(close)>>

我的服务是Sentry通过内网连接exim4服务,exim4通过访问外网的ip发送邮件,此ip被SPF拦截,也就是说被组织加入了黑名单,邮件的接收服务器判断是黑名单直接拦截。有个链接可以简单检查 :mxtoolbox 提供在线检测工具

小结

那只好先给公司同事发邮件了,Sentry有自己的账号系统,所以注册也需要用公司邮箱。公司邮件服务安全备案后采用了这种方法。

邮件服务

那么如果不用自己搭建的邮件,有没有服务可用呢?答案是Yes

第三方网站

我们用的QQ邮箱、网易邮箱等,除了在页面中首发邮件,还可以通过stmp协议调用来发送。其中一个注意点是:密码不是登录密码,而是登录进去邮件,设置中获取的授权码。

优点:免费,没有邮件数量限制

不足:同时发多封邮件的时候,可能被认为是乱发,有发送失败的情况。用一段时间后,也会被认为是不安全的

mailgun

跟同事了解到,mailgun提供的服务很棒,因为要绑定银行卡防止邮件乱刷,所以在业界授信很好。我注册了一下,生成一个Demo Domain,连接后直接发送,而且还有log,体验很棒。

优点: 邮件所有内容可以自定义,而且有详尽的log及使用情况

缺点: 收费(一方面是为了盈利,一方面也防止刷邮件钱用到刀刃上)

其他邮件发送方式

命令行

有以下几种,可自行查阅

  • sendmail
  • mail
  • mutt
  • ssmtp
  • telnet

语言库

一些语言也带一些库,可以安装来用,尚未用到可自行查阅

  • php phpmailer
  • go net/smtp
  • node nodemailer

总结

邮件作为最早出现的通信方式,里面学问还是挺深。涉及很多安全只是和工具,通过踩坑,了解到不同的解决方案,发生意外情况,不至于慌张,尤其是通过K8S运维项目,可以随时自由进行切换。在这里共享一下,希望可以帮到大家。