一、说明

    mail和mailx就像我们windows上的foxmail,是个客户端工具,在Linux运维环境中可能会用到一些报警之类的功能,可通过系统mail命令直接发送电子邮件到指定的邮箱用来实现告警,本文就mail客户端配置和常见使用格式做下学习。

二、不加密发送邮件

1、安装mail,使用yum install mailx即可直接安装。

2、编辑mail配置文件,对发件人身份、服务器、端口等进行基本配置,/etc/mail.rc

###vim /etc/mail.rc
## smtp服务器发信的用户名和昵称
set from
=test@tompig.cn(nickname)
## smtp服务器的地址
set smtp=smtp://smtp.mxhichina.com

## 邮件认证的方式 set smtp-auth=login

## smtp服务器认证的用户名 set smtp-auth-user=test@tompig.cn
## smtp服务器认证的用户密码(授权码) set smtp
-auth-password=password

至此,配置文件配置完成,可使用下面的命令进行发信测试

echo "mail warning test,this is a test email" | mail -s "mail report" 150xxxxxxxx@139.com

注意:1)smtp发信需要邮件系统管理员配置该认证账户的发信权限,允许使用smtp协议发信,认证密码根据实际情况填写,有的云邮箱可能是个动态授权码。

   2)有些云邮箱本身自带反垃圾功能,如果由于邮件内容写的比较简单或其他原因导致被识别为垃圾邮件,可能会出现报错“Unexpected EOF on SMTP connection”,也可能本地没有报错,但是登陆到邮箱网页会收到退信,此退信并不是最终的收件人邮箱服务器产生的退信,而是发信服务器在发信之前就判断成了垃圾邮件,产生退信。可以适当修改邮件内容、主题等信息,避免因为内容被识别成垃圾邮件。加密传输也可能出现”Unexpected EOF on SMTP connection”,基本上是由于端口只支持SMTPS导致,将协议改成smtps://,参考下文配置。

三、加密发送邮件

上述情况在使用smtp发信时用的是25端口,而有些邮件服务器端是不允许开启25端口的,可能会使用smtps(465)、starttls(587)等加密端口发信,这里以465端口举例。

修改配置文件(/etc/mail.rc)如下:

## smtp服务器发信的用户名
set from=test@tompig.cn
## smtp服务器的地址,注意"smtps"协议名和后面的端口号
set smtp=smtps://smtp.mxhichina.com:465
## 邮件认证的方式 set smtp-auth=login

## smtp服务器认证的用户名 set smtp-auth-user=test@tompig.cn
## smtp服务器认证的用户密码(授权码) set smtp
-auth-password=password

## 忽略验证错误 set ssl-verify=ignore
##指定证书文件存放目录,自定义 set nss
-config-dir=/root/.cert/

这里在配置文件中多加入验证配置和证书文件存放目录配置2行,需要手动导入认证邮件服务器的证书,添加信任。

执行步骤如下:

##创建自定义目录
mkdir /root/.certs
##进入证书目录 cd
/root/.certs ##获取邮件服务器证书秘钥(465端口) echo -n "" | openssl s_client -connect smtp.mxhichina.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > aliyun_smtps.crt
##附:获取邮件服务器证书秘钥(587端口) #
echo -n | openssl s_client -starttls smtp -connect smtp.mxhichina.com:587 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > aliyun_starttls.crt

##将证书添加到受信任列表 certutil
-A -n 'aliyun' -t "P,P,P" -d . -i ./aliyun_smtps.crt

上述certutil命令中-A表示添加,-n是nickname(昵称),可以随意取,例如126或qq;-t表示受信任的标签,可取值是t/c/p三种或者其组合;-d表示证书所在目录,-i指示证书文件的位置。

至此,配置完成,可使用mail命令直接发信,这里简单说明一下:

1)如果是465端口,需要加上smtps://协议;如果是587端口,不需要加smtps://或者写smtp://;
2)如果使用587端口通讯,应当显示设置smtp-use-starttls;
3)邮件的来源应当与邮箱相同,或者将发信人姓名写在邮箱后的括号中。例如:set from=user@xxxx.com或set from=user@xxx.com(nickname);如果邮箱与认证的不一致,将出现“smtp-server: 553 Mail from must equal authorized user”的错误;
4)有些邮件服务器的587端口不是使用STARTTLS而是SMTPS,此时仍需加上smtps://协议,例如126邮箱

四、mail常用命令简介

1、在标准输入中输入邮件内容:

~]# mail -s 'mail test' xxx@139.com

this is a test email

输入完成后成按Ctrl+D结束并发送邮件。连按两次Ctrl+C键则中断工作,不送此信件。

2、通过管道传送邮件正文

~]# echo 'test mail' | mail -s 'mail test' xxx@139.com

其中echo值为邮件内容,-s参数指定邮件主题,最后面跟收件人邮箱地址

3、使用输入重定向,从文件中获取邮件内容

mail -s 'mail test' xxx@139.com < file.txt

4、如果需要发送给多个收件人,收件人之间用逗号隔开即可。如下:

mail -s 'mail test' xxx@139.com,xxx@126.com < file.txt

5、其他参数补充

-b<地址>:指定密件副本的收信人地址;
-c<地址>:指定副本的收信人地址;
-f<邮件文件>:读取指定邮件文件中的邮件;
-i:不显示终端发出的信息;
-I:使用互动模式;
-n:程序使用时,不使用mail.rc文件中的设置;
-N:阅读邮件时,不显示邮件的标题;
-s<邮件主题>:指定邮件的主题;
-u<用户帐号>:读取指定用户的邮件;
-v:执行时,显示详细的信息。

参考资料:

https://tlanyan.me/config-mail-use-smtp/