在Linux上,可以通过mail命令在命令行发邮件,直接敲下mail -s 主题 对方邮件地址即可开始写邮件,比起图形界面写邮件更方便,而且,正是因为可以通过命令行做到这一切,那么就可以将这些命令组合成脚本,满足特定条件或特定时间即可自动发送邮件,用处多多,例如可以用来发送服务器内存不足时的告警邮件。

安装

mail一般都会在服务器上安装好,如果没有预装则可以通过安装mailutils来使用,以ubuntu为例:

1sudo apt install mailutils

安装好后还需要进行发件人配置才可以使用邮箱地址发送邮件。

添加发件人

首先编辑配置文件,mail配置文件地址为/etc/mail.rc,如果只是希望自己使用,那么可以将配置文件存在~/mailrc

1vim /etc/mail.rc

然后添加发件人配置,以网易企业邮箱为例,按下G*(大写)*翻到文件最后,增加以下几行:

1set from=admin<admin@wenjinyu.me>
2set smtp=smtps://smtp.ym.163.com:994
3set smtp-auth-user=admin@wenjinyu.me
4set smtp-auth-password=*******
5set ssl-verify=ignore
6set nss-config-dir=/etc/pki/nssdb/

之后就可以用以下命令发送邮件:

1mail -v -s “主题” 收件人

回车后开始输入邮件内容,以Ctrl + D结束输入。

多账户

如果需要配置多个发件账户,则用以下形式:

 1account cn163 {
 2set from=admin<admin@wenjinyu.me>
 3set smtp=smtps://smtp.ym.163.com:994
 4set smtp-auth-user=admin@wenjinyu.me
 5set smtp-auth-password=*******
 6set ssl-verify=ignore
 7set nss-config-dir=/etc/pki/nssdb/
 8}
 9
10account gmail {
11...
12}

此时发送邮件时可以选择特定发件账户:

1mail -v -s “主题” -A cn163 收件人

邮件内容

除了上述在发送前输入邮件内容之外,还可以通过echo添加内容,方式为:

1echo "邮件内容" | mail -v -s “主题” 收件人

邮件内容可以手动输入,也可以这样将文件内容发送:

1cat /root/a.txt | mail -v -s “主题” 收件人
2
3# or
4mail -v -s “主题” 收件人 < /root/a.txt

添加附件

添加附件使用-a参数

1mail -v -s “主题” 收件人 -a 附件

也可同时将文件内容作为正文

1mail -v -s “主题” 收件人 -a 附件 < /root/a.txt

错误信息

  • Error in certificate: Peer’s certificate issuer is not recognized.

看样子是证书出了问题,所以自建一个信任的证书就行了,还是以网易企业邮箱为例:

1mkdir -p /root/.certs/
2echo -n | openssl s_client -connect smtp.ym.163.com:994 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /root/.certs/163.crt
3certutil -A -n "GeoTrust SSL CA" -t "C,," -d /root/.certs -i /root/.certs/163.crt
4certutil -A -n "GeoTrust Global CA" -t "C,," -d /root/.certs -i /root/.certs/163.crt
5certutil -L -d /root/.certs
6certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu"  -d ./ -i /root/.certs/163.crt

相应的,配置文件修改如下:

 1account cn163 {
 2set from=admin<admin@wenjinyu.me>
 3set smtp=smtps://smtp.ym.163.com:994
 4set smtp-auth-user=admin@wenjinyu.me
 5set smtp-auth-password=*******
 6set ssl-verify=ignore
 7set nss-config-dir=/root/.certs/  # 此处修改
 8}
 9
10account gmail {
11...
12}

再发送邮件就不会有证书不受信任的提示了。

  • 550 5.7.0 DT:SPM smtp-server: 550 5.7.0 DT:SPM

发送太频繁,被判定为垃圾邮件,等几分钟再发吧,更多网易企业邮箱的退信原因可参见:「企业退信的常见问题?-163邮箱常见问题

用途

配置好mail后,可以设置自动脚本发送邮件,例如,可以在特定时刻进行提醒,又或者用来监控服务器,这里就是一个监控服务器内存用量的脚本:「内存用量提醒 - 温锦瑜的笔记