mail: 在linux上通过命令行发送邮件

2019-06-04


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

安装

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

1
sudo apt install mailutils

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

添加发件人

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

1
vim /etc/mail.rc

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

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

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

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

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

多账户

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

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

account gmail {
...
}

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

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

邮件内容

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

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

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

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

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

添加附件

添加附件使用-a参数

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

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

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

错误信息

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

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

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

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

account gmail {
...
}

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

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

用途

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



评论