Linux使用mail发送电子邮件
一、说明
mail和mailx就像我们windows上的foxmail,是个客户端工具,在Linux运维环境中可能会用到一些报警之类的功能,可通过系统mail命令直接发送电子邮件到指定的邮箱用来实现告警,本文就mail客户端配置和常见使用格式做下学习。
二、不加密发送邮件
1、安装mail,使用yum install mailx即可直接安装。
2、编辑mail配置文件,对发件人身份、服务器、端口等进行基本配置,/etc/mail.rc
###vim /etc/mail.rc
## smtp服务器发信的用户名和昵称 set from=nickname<test@tompig.cn>
## 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=/etc/mailxcert
这里在配置文件中多加入验证配置和证书文件存放目录配置2行,需要手动导入认证邮件服务器的证书,添加信任。
执行步骤如下:
##创建自定义目录 mkdir /etc/mailxcert
##进入证书目录 cd /etc/mailxcert ##获取邮件服务器证书秘钥(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 "Pu,Pu,Pu" -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邮箱
5) 证书目录不要放在/root/目录下,如放在此目录,亲测即便所有证书文件赋予777权限,仍会报“Error initializing NSS: Unknown error -8015.”错误
四、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/