使用mail命令发送邮件
当你需要定时获取服务器上的信息,又或者在满足一定条件后对你进行通知时,使用命令行发送邮件会非常有用。我的个人服务器上就配置了定时任务,每小时会自动汇总服务器的资源信息,然后发到我的邮箱里。
本文将会介绍在Linux中如何使用mail命令用163邮箱给126的邮箱发送邮件。
命令mail是如何工作的?
在使用mail命令发送邮件之前,最好是先了解以下mail命令是如何工作的。如果不知道的话,就会像我当初一样,花了很长时间才搞明白为什么邮件总是发送不成功。我在网上看了很多教程,很多教程都可以概括为一句话:在某个配置文件里加点东西,然后执行以下mail命令,嗒嗒,邮件就发送成功了。然而我测试了半天都不好用。当我弄明白mail命令是如何工作的以后,我才知道我最初的理解是错误的。
实际上,mail命令调用标准的sendmail程序(通常是/usr/sbin/sendmail),sendmail又连接到本地的邮件传输代理(MTA)以将邮件发送到目的地址。本地邮件传输代理(MTA)是一个在本地运行的smtp服务器,它接受端口25上的邮件。大致的原理如下图:
这就表示本地必须运行一个SMTP服务器,比如Postfix、Exim4等等。如果没有运行,使用mail命令时,会得到一个”send-mail: Cannot open mail:25″的错误提示。
这就表示,使用mail命令的第一步是应该先搭建本地邮件传输代理。本教程使用的Exim4。
系统环境
操作系统
Kali GNU/Linux Rolling
使用的mail命令
本文使用的mail命令来自于mailutils软件包。当然使用heirloom-mailx、bsd-mailx等等其他的软件包也是可以的,他们都提供了mail命令,再用法上大同小异,只有细微的差别。
邮件传输代理(MTA)
如上说述,本地需要配置邮件传输代理(MTA)。本文使用的Exim4。当然你也可以使用Postfix,又或者其他的邮件传输代理,虽然配置上不同,但是原理上是相同的。
配置本地的邮件传输代理
安装本地的邮件传输代理
执行下面命令来安装Exim4服务:
#!/bin/bash apt-get install exim4 exim4-base exim4-config exim4-daemon-light
配置Exim4服务
再提一次,Exim4在这里提供的是本地邮件传输代理的功能。一共需要三步。如下所述。
(第一步)执行dpkg-reconfigure exim4-config命令来配置Exim4服务:
- 选择”mail sent by smarthost; received via SMTP or fetchmail“选项;
- 将”System mail name:”设置为“localhost”;
- 设置”IP-addresses to listen on for incoming SMTP connections”为”127.0.0.1“来拒绝外部的连接;
- 不要填写”Other destinations for which mail is accepted:”选项,值留空;
- 也不要”Machines to relay mail for:”选项,值留空;
- 设置”IP address or host name of the outgoing smarthost:”的值为”smtp.163.com:25“;
- 设置”Hide local mail name in outgoing mail?”的值为“NO“选项;
- 设置”Keep number of DNS-queries minimal (Dial-on-Demand)?”的值为”NO“选项;
- 设置”Delivery method for local mail”的值为”mbox format in /var/mail/“选项;
- 设置”Split configuration into small files?”的值为”YES“选项;
- 设置”Root and postmaster mail recipient:“的值为空,不需要填写;
(第二步)在Exim4配置结束后,然后再修改/etc/exim4/passwd.client,添加如下行:
它的结构为<163的SMTP服务器地址>:<发件人邮箱地址>:<邮箱密码>。注意,这里的邮箱密码不时网页邮箱的登录密码,而是在邮箱中设置的授权码(也是在登录Foxmial之类的邮箱客户端使用的那个授权码)。
(第三步)上一步结束后,我们需要在来配置/etc/email-addresses文件。这个文件的作用是映射本地用户到发件人邮箱账户。在该文件中添加如下行:
上面配置的含义是:当你用root用户发送邮件时,邮件的发件人为 sender@163.com 。如果没有进行配置,则发件人则会成为root@hostname,这时候容易发生的一个情况就是被系统退信,系统会告诉你发件人帐号与发件人不符合。
(最后一步)重启Exim4服务。执行下面的命令进行重启:
安装mail命令来发送邮件
安装mail命令
执行下面的命令安装mail命令:
使用mail命令发送邮件
执行下面的命令来发送邮件:
echo "This is test mail." | mail -s "Test Mail From Command Line" recipient@126.com
上面的This is test mail.是邮件的正文。mail的-s选项指定了邮件的主题。执行完上面的命令之后,你就可以到收件人的邮箱里查看邮件了。
如果要查看邮件发送日志,可以执行:
tail -f /var/log/exim4/mainlog
有关mail命令的更多选项、发送附件、抄送等等功能可以查看官方文档,或者mail命令的手册。
参考文献
Linux mail command examples – send mails from command line
DebianWiki/mailAndExim4
ArchWiki/Exim
Sendmail/Exim Error Mailing to Remote Domains Not Supported
How to get rid of “defer (-52): Retry time not yet reached” exim4 logs?