CentOS 7 发送邮件

工作中我们会碰到服务器上的各种各样错误,这些错误我们可以做各种各样的捕获、打印、记录。但是光这些是不够的的,对应的负责人员要怎么知道这件事?最简单的办法就是发一封邮件(当然也可以使用其他的系统监控软件进行报警通知,这里不做讨论)

  CentOS 7 内置了 mail,可以直接使用,如果觉得依赖库太老可以自己删除掉重新 yum 安装即可。

  • 删除
# 查找已存在的
$ rpm -qa | grep mailx
$ rpm -qa | grep sendmail
# 删除
$ rpm -e xxx   

# 安装
$ yum -y install mailx sendmail

# 配置发件人信息
$ vim /etc/mail.rc
......
# 这里配置的是网易企业免费邮箱的 SMTP 服务地址
set from=我的服务器<xxxx@163.com>
set smtp=smtp.ym.163.com
set smtp-auth-user=xxxx@163.com
set smtp-auth-password=xxxxxxxxx
set smtp-auth=login
......
  • 发送邮件测试
$ echo '内容' | mail -s '标题' xxxxxx@163.com

  正常情况下这里已经可以发送邮件了,也有可能你使用的服务器是阿里云或者其他服务提供商的,他们会封禁 25 端口,导致出现以下错误:

could not connect: 连接超时
"/root/dead.letter" 11/356
. . . message not sent.

或者

contains invalid character ‘\342’
Resolving host smtp.163.com . . . done.
Connecting to 220.181.12.17 . . .Connecting to 220.181.12.18 . . .

  163 邮箱的协议以及端口

  因端口被封禁,导致连接超时,这里改用 SSL 协议下的端口即可,使用 SSL 协议需要先请求证书支持。

  • 构建证书
# 创建存放证书目录
mkdir -p ~/.certs
# 向 163 请求证书
echo -n | openssl s_client -connect smtp.ym.163.com:994 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.certs/163.crt
# 添加一个 SSL 证书到证书数据库中
certutil -A -n "GeoTrust SSL CA" -t "C,," -d ~/.certs -i ~/.certs/163.crt
# 添加一个 Global 证书到证书数据库中
certutil -A -n "GeoTrust Global CA" -t "C,," -d ~/.certs -i ~/.certs/163.crt
# 列出目录下证书
certutil -L -d ~/.certs
  • 重新配置发件人信息
$ vim /etc/mail.rc
set from=我的服务器<xxxx@163.com>
set smtp=smtps://smtp.ym.163.com:994
set smtp-auth-user=xxxx@163.com
set smtp-auth-password=xxxxxx
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/root/.certs

# 配置完毕应该即可避免端口 25 被封禁问题

  还有一种情况就是证书不被信任,执行下面命令即可

$ certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ./ -i 163.crt
Notice: Trust flag u is set automatically if the private key is present.

发表评论

电子邮件地址不会被公开。 必填项已用*标注