从命令行中发送邮件

维护服务器的时候,在很多脚本环境中需要从命令行中发送邮件。如果使用默认的mail命令,通常发件人会因为IP,SPF签名, DKIM认证等原因不能通过邮箱检测而进入垃圾箱甚至不能正确投递。使用SMTP协议通过第三方邮箱发信则能很好解决此问题。在这里选用的是SSMTP,供大家参考。

安装配置SSMTP

第一步:安装SSMTP

主流Linux系统目前都已经有ssmtp包,直接通过包管理安装即可,Debian下:
# apt-get install ssmtp

第二步:配置SSMTP

现在,需要对SSMTP进行配置,通常是通过独立的配置文件进行。在本文中我使用Gmail SMTP服务器。关于Gmail SMTP服务器的详情请看:https://support.google.com/a/answer/176600?hl=en
# vi /etc/ssmtp/ssmtp.conf

修改文件当中的值如下:

mailhub=smtp.gmail.com:587
UseSTARTTLS=YES
[email protected]
AuthPass=XXXXXXXXXXXXXXX
TLS_CA_File=/etc/pki/tls/certs/ca-bundle.crt

  • mailhub: SMTP服务器:服务器端口
  • UseSTARTTLS: 如果SMTP服务器使用TLS,设置为”YES”
  • AuthUser: 完整Gmail邮箱(带@gmail.com)
  • AuthPass: 邮箱对应的密码
  • TLS_CA_File: 有时候会用到,如果遇到下列错误 “send-mail: Cannot open smtp.gmail.com:587”

第三步:测试发信

现在可以用SSMTP给自己的邮箱发一封测试邮件,以确保一切正常:
# ssmtp [email protected]
Subject: This is Subject Line
Email content line 1
Email content line 2
Email content line 3
^d

编写完邮件之后按CTRL+d (^d)即可发送,检查收件箱确保收到邮件

第四步(可选):设置为默认发信程序

# alternatives --config mta

There are 2 programs which provide 'mta'.

Selection Command
-----------------------------------------------
1 /usr/sbin/sendmail.ssmtp
*+ 2 /usr/sbin/sendmail.sendmail

Enter to keep the current selection[+], or type selection number: 1

测试发信程序:
# sendmail -V
sSMTP 2.61 (Not sendmail at all)


# echo test | mail -v -s "Test mail" [email protected]

防止Crontab发送错误报告邮件

在配置完上述文件之后会收到很多邮件,仔细查看之后发现是crontab所触发的,这个时候需要编辑 /etc/crontab ,在当中加入如下代码即可解决
MAILTO=""

参考资料

  1. How to Send Email via SMTP Server from Linux Command Line (with SSMTP): https://tecadmin.net/send-email-smtp-server-linux-command-line-ssmtp/
  2. Send mail from command line with external smtp server on Linux: http://www.binarytides.com/linux-mail-with-smtp/
  3. How to stop email report from Cron: https://askubuntu.com/questions/175464

Leave a Reply

Your email address will not be published. Required fields are marked *