站点图标 Linux-技术共享

Linux上搭建邮件服务器

Linux上搭建邮件服务器相关笔记

 


基础知识

MUA/MTA/MDA/MRA

三个基本概念:
MUA(Mail User Agent)接收邮件所使用的邮件客户端,使用IMAP或POP3协议与服务器通信;例如Foxmail或Outlook。
MTA(Mail Transfer Agent) 通过SMTP协议发送、转发邮件;例如Linux中的sendmail和postfix。
MDA(Mail Deliver Agent)将MTA接收到的邮件保存到磁盘或指定地方,通常会进行垃圾邮件及病毒扫描;
MRA(Mail Receive Agent)负责实现IMAP与POP3协议,与MUA进行交互;

SMTP(Simple Mail Transfer Protocol) 发送邮件所使用的标准协议, SSL协议(SMTPS)使用465/994端口, 非SSL协议使用25端口;
IMAP(Internet Message Access Protocol) 接收邮件使用的标准协议之一, SSL协议(IMAPS)使用993端口, 非SSL协议使用143端口;
POP3(Post Office Protocol 3) 接收邮件使用的标准协议之一, SSL协议(POP3S)使用995端口, 非SSL协议使用110端口。

邮件服务器基本都由MTA,MDA,MRA 组成。

常用的MUA有:outlook、thunderbird、Mac Mail、Foxmail;
常用的MTA服务有:sendmail、postfix;
常用的MDA有:procmail、dropmail;
常用的MRA有:dovecot。

基础邮件原理(MUA,MTA,MDA)
https://www.cnblogs.com/yechanglv/p/6947117.html


mail/mailx与sendmail/postfix之间的关系

1、mailmailx是负责查看、编写和向MTA发送邮件的MUA,也就是一个邮件客户端应用。mailx是mail的功能加强版,或者mail命令直接就指向了mailx命令
2、sendmailpostfix是负责发送、转发邮件的MTA,也就是一个邮件服务器
3、bin/mail命令会默认使用本地sendmail发送邮件,这样要求本地的机器必须安装和启动Sendmail服务,我们可以配置本机的默认MAT为sendmail还是postfix。而通过修改配置文件/etc/mail.rc可以使用外部SMTP服务器,可以达到不使用sendmail/postfix而用外部的smtp服务器发送邮件的目的。

4、mail 命令是 mailx 命令的一个别名,最终指向 /bin/mailx, 如果没有安装,使用 yum install -y mailx 进行安装。

  1. $ which mail
  2. /bin/mail
  3. $ ls -l /bin/mail
  4. lrwxrwxrwx 1 root root 22 7 24 11:07 /bin/mail -> /etc/alternatives/mail
  5. $ ls -l /etc/alternatives/mail
  6. lrwxrwxrwx 1 root root 10 7 24 11:07 /etc/alternatives/mail -> /bin/mailx

sendmail/postfix/qmail三个主流MTA对比

几年以前,Linux环境下可以选择的可以免费邮件服务器软件只有Sendmail,但是由于Sendmail的缺陷,一些开发者先后开发了若干种其他的邮件服务器软件。当前,运行在Linux环境下免费的邮件服务器,或者称为MTA(Mail Transfer Agent)有若干种选择,比较常见的有Sendmail、Qmail、Postfix、exim及Zmailer等等。

Postfix是一个由IBM资助下由Wietse Venema 负责开发的自由软件工程的一个产物,其目的是为用户提供除sendmail之外的邮件服务器选择。
Postfix是用来替代Sendmail的,它的配置文件比Sendmail简单得多,配置相当容易。

Linux邮件服务器Postfix,qmaill,Sendmail之比拼
https://blog.csdn.net/sahusoft/article/details/6402649


邮件服务器的DNS域名解析

在DNS中有一种 MX(邮件地址转换 Mail eXchanger 的缩写)记录,专门指明了本域中由哪一台或几台主机来做邮件服务器,MX记录告诉MTA本域名哪台主机是邮件服务器,将邮件最终送到哪里。
一开始我想直接创建MX记录指向我的VPS 公网IP,发现阿里云上没法这么设置,提示MX记录的记录值必须是域名形式。


MX记录不能指向IP,只能指向域名

所以只能是先创建一个二级域名A记录,比如 mail.devgou.com 指向 公网IP,然后再创建MX记录指向 mail.devgou.com

后来发现确实是:
邮件交换(MX,Mail Exchange)记录用于指出某个DNS区域中的邮件服务器的主机名(A记录),它相当于一个指针,因此在创建MX记录之前,你必须已经为邮件服务器创建了A记录;你可以针对相同的DNS域配置多个MX记录,但是邮件服务器优先级数值越低的MX记录具有越高的优先级。


邮件服务器DNS配置

邮箱账号/系统账号

sendmail, postfix 和 dovecot 都是调用本地系统的账户和密码,所以系统用户就是邮件的用户,因此在本地系统创建常规账户即可。
一开始我单独创建了一个用于邮件的账号,后来感觉太麻烦,就用当前linux登录账号了。但最好不要用root账号,有的地方貌似root是无法远程登录的。
在vps上用的话,可能当前账号没有配置密码,因为可能从开始就一直是用密钥登录的,需要先给账号设置密码。

  1. # 创建用户
  2. $ useradd user
  3. # 设置密码,会要求输入两次密码
  4. $ passwd passwd

配置后貌似还要重启下sendmail,记不清了。


设置系统默认邮件发送代理(MTA)

查看系统当前默认MTA
alternatives --display mta

  1. $ alternatives --display mta
  2. mta - 状态为自动。
  3. 链接当前指向 /usr/sbin/sendmail.postfix
  4. /usr/sbin/sendmail.postfix - priority 30
  5. mta-mailq:/usr/bin/mailq.postfix
  6. mta-newaliases:/usr/bin/newaliases.postfix
  7. mta-pam:/etc/pam.d/smtp.postfix
  8. mta-rmail:/usr/bin/rmail.postfix
  9. mta-sendmail:/usr/lib/sendmail.postfix
  10. mta-mailqman:/usr/share/man/man1/mailq.postfix.1.gz
  11. mta-newaliasesman:/usr/share/man/man1/newaliases.postfix.1.gz
  12. mta-sendmailman:/usr/share/man/man1/sendmail.postfix.1.gz
  13. mta-aliasesman:/usr/share/man/man5/aliases.postfix.5.gz
  14. 当前“最佳”版本是 /usr/sbin/sendmail.postfix

如果系统中同时安装了 sendmail 和 postfix, 可以使用 alternatives 命令选择默认的MTA
alternatives --config mta

设置系统默认mta为postfix

  1. alternatives --config mta
  2. There are 2 programs which provide 'mta'.
  3. Selection Command
  4. -----------------------------------------------
  5. + 1 /usr/sbin/sendmail.postfix
  6. * 2 /usr/sbin/sendmail.sendmail
  7. Enter to keep the current selection[+], or type selection number: 1

输入1后回车即把MTA功能切换到postfix上,+号会显示在sendmail的行头。

在Centos7下捣鼓邮件发送软件sendmail与postfix
https://blog.csdn.net/anifans9350/article/details/78848433


sendmail邮件发送代理(MTA)

ECS搭建sendmail邮件服务器
https://www.wqblogs.com/ecs%E6%90%AD%E5%BB%BAsendmail%E9%82%AE%E4%BB%B6%E6%9C%8D%E5%8A%A1%E5%99%A8/

LINUX下邮件服务器搭建(SENDMAIL)(1.0)
https://blog.csdn.net/mez_Blog/article/details/79937864

linux下搭建邮件服务器(sendmail)
https://blog.csdn.net/shicq0225/article/details/17216571

Linux攻略—Sendmail邮件服务器搭建及测试
https://blog.51cto.com/zhaoyuqiang/1224468

第15章 使用Postfix与Dovecot部署邮件系统。
https://www.linuxprobe.com/chapter-15.html

sendmail - 鳥哥的 Linux 私房菜
http://cn.linux.vbird.org/linux_server/linux_redhat9/0380sendmail.php

安装sendmail

yum -y install sendmail sendmail-cf
安装 sendmail-cf 是为了以后使用m4命令生成sendmail的主配置文件

设置开机启动,好像安装后默认就是开机启动的

  1. $ chkconfig --list|grep sendmail
  2. sendmail 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
  3. $ sudo chkconfig sendmail on
  4. $ chkconfig --list|grep sendmail
  5. sendmail 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭

配置sendmail

《鳥哥的 Linux 私房菜》第一版中的sendmail章节关于配置文件介绍的非常详细,每个配置文件的用途、怎么配都有说明。
http://cn.linux.vbird.org/linux_server/linux_redhat9/0380sendmail.php

sendmail 的配置文件

sendmail安装完毕后,具有多个配置文件,所有文件都旋转在 /etc/mail目录下. 其中主配置文件为/etc/mail/sendmail.cf, 与它存放在同一目录下的许多文件都具有重要功能,如下所示:

sendmail.cf:sendmail核心配置文件,位于/etc/mail/sendmail/sendmail.cf
sendmail.mc:sendmail提供sendmail文件模板,通过编辑此文件后再使用m4工具将结果导入sendmail.cf完成配置sendmail核心配置文件,降低配置复杂度,位于/etc/mail/sendmail.mc
如何修改sendmail配置?
由于sendmail主配置文件/etc/mail/sendmail.cf文件的内容比较复杂,修改时的难度较大,所以我们可以先修改/etc/mail/sendmail.mc文件,然后再将该文件的内容导入到sendmail.cf文件。
方法如下:
1、vim 编辑修改 /etc/mail/sendmail.mc 临时配置文件
2、使用 m4 sendmail.mc > sendmail.cf 命令将sendmail.mc的内容导入到sendmail.cf中。

local-host-name:定义收发邮件服务器的域名和主机别名,位于 /etc/mail/local-host-name

access.db:用来设置sendmail服务器为哪些主机进行转发邮件, 位于/etc/mail/access.db

aliases.db:用来定义邮箱别名,位于/etc/mail/aliases.db
virtusertable.db:用来设置虚拟账户,位于/etc/mail/virtusertable.db

相关文件目录

/var/spool/mail: 这个是邮件『收受下来之后,每个用户信件放置的目录』,一个账号会使用掉一个档案,例如你的账号为 test ,那么你的信在 Server 中时,就是 /var/spool/mail/test 这个档案了!此外,你的 POP3 的协议亦是使用这个目录中的 mailbox 做为默认的邮件取得的档案数据。
 
/var/spool/mqueue: 当邮件由于对方主机的问题,或者是网络的问题,而无法送出去时,那么该封邮件将会暂时的存放在这个目录下,然后主机会每隔大约 30 ~ 60 分钟重新尝试传送一遍,通常设定在五天内该封信件还寄不出去,那就会退给原发信者了!
 
/var/spool/clientmqueue: 这是新的 sendmail 8.12 版本才会出现的队列目录


/etc/mail/sendmail.mc配置监听IP和域名

vi /etc/mail/sendmail.mc

  1. DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl

把Addr的值从 127.0.0.1 修改为 0.0.0.0,表示监听所有IP

  1. LOCAL_DOMAIN(`localhost.localdomain')dnl

将 localhost.localdomain 改为自己的域名

生成正式的配置文件。
sudo m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
我执行此命令说权限不够,加 sudo 也不行,后来切换到root用户才成功。
然后重新启动 sendmail
sudo service sendmail restart

/etc/mail/local-host-name配置域名和主机名

将自己的域名添加到此配置文件中:

  1. $ cat local-host-names
  2. # local-host-names - include all aliases for your machine here.
  3. devgou.com
  4. mail.devgou.com

这个档案主要用来处理一个主机同时拥有多个主机名时候的收发信件主机名问题。
这个档案的用途可大了!当你的主机拥有多个 HOSTNAME 的时候,例如我的主机拥有三、四个主机名,那么是否每个名称都可以用来做为收受信件的主机名 ( To: .. ) 呢?
并非如此!如果你的主机名为 test1.your.domain 以及 test2.your.domain ,而且这两个 hostname 您都希望可以用在收受电子邮件,果真如此,那么,你就必需将这两个名字都写入 local-host-names 这个档案当中,一个主机名字占用一行。

注意:没有写入这个档案的『你的主机名』,那信件将无法正确的寄达这部主机喔~例如:www.vbird.adsldns.org、vbird.adsldns.org这两个主机名的 ip 都是相同的,也就是指向同一台机器上。假设这台主机名预设为 vbird.adsldns.org,那在预设情况下,寄给 userid@vbird.adsldns.org 都是 ok 没有问题的!但是寄给 userid@www.vbird.adsldns.org 就会出现错误。其中原因是因为没有告诉 MTA 除了 vbird.adsldns.org 这个主机名外,还有 www.vbird.adsldns.org 也是指向这台主机上。所以寄给 userid@www.vbird.adsldns.org 会出现错误,通常就是 mail loop to me,要不然就是不允许 relay 的错误情况。


/etc/mail/access转发权限和过滤配置

这个是『规定谁可以或不可以使用本邮件服务器的数据库』,要转成这个数据库需要藉由 makemap 以及 /etc/mail/access 档案的配合!这个档案可以说是 Sendmail 里面最重要的『用户权力管理』的数据了!在后面我们会继续说明。
默认情况下 sendmail 只转发来自 localhost 的邮件, 在 /etc/mail/access 中配置可转发来自哪些ip的邮件
在默认情况下,也就是安装完系统(sendmail服务器)不做任何设置的情况下,则只能在本机上收发邮件,网络上(局域网或Internet)的任何其它主机不能向该SMTP服务器发送邮件
或者使用 SSH 登入主机后,以 mail 这个指令来发信;

access 的语法为:

  1. 规定的范围          规定可以在sendmail上面的动作
  2. IP/不完整IP/主机名/E-mail RELAY/DISCARD/REJECT

在『规定范围』与『规定可以在 sendmail 上面的动作』两项目之间最好以 tab 按键来隔开会比较正确!
或者这么描述:
[标签]:[参数]  [制约关键字]

标签Connect/From/To

Connect: 检查对象域名或IP
From: 检查对象 送信人地址
To: 检查对象 收信人地址
不加标签的默认为Connect

制约关键字

OK : 只接收发给自己/本地的邮件. 其他的全部拒绝并向送信服务器返回错误消息(未指定制约关键字的默认值为OK)。
RELAY: 允许接收允许转发。
REJECT:拒绝接收/转发,向送信服务器返回错误消息。
500: 与reject基本相同,拒绝接收/转发,并向送信服务器返回错误消息和原邮件。500 后面可以跟上要向远程主机返回的错误消息。
DISCARD:丢弃接收到的邮件,并且不向送信邮件服务器返回任何消息。
ERROR:拒绝接收/转发并向发信服务器返回指定的错误消息,格式参见前面的示例。

示例:

  1. From:spam@obenrispam.com    REJECT #拒绝某人发来的邮件
  2. From:obenrispam.com    REJECT #拒绝从obenrispam.com发来的所以邮件
  3. From:spam@    REJECT #拒绝所以名字叫spam的邮件,无论来自哪个域
  4. from:test@your-domain.com.tw REJECT
  5. to:blah@your-domain.com.tw REJECT

示例:

  1. cyberspammer.com 550 We do not accept mail from spammers
  2. FREE.STEALTH.MAILER@ 550 We do not accept mail from spammers
  3. another.source.of.spam REJECT
  4. okay.cyberspammer.com OK
  5. 128.32 RELAY

前边的两个例子给出了 sendmail 的出错处理程序检测到的错误代码。 当一个邮件与左边列表相匹配时,这个信息会被打印到远程主机上。
下一条记录拒绝来自 Internet 上的一个特别主机的邮件 another.source.of.spam。
接下来的记录允许来自 okay.cyberspammer.com 的邮件连接, 这条记录比上面那行 cyberspammer.com 更准确。更多的准确匹配使不准确的匹配无效。
最后一行允许电子邮件从主机和 128.32 开头的 IP 地址转发。 这些主机将被允许通过这台邮件服务器前往其它邮件服务器发送邮件。

我的配置

一开始我是将自己的 ip 放到配置中,允许来自这个ip的邮件被转发

  1. Connect:localhost.localdomain RELAY
  2. Connect:localhost RELAY
  3. Connect:127.0.0.1 RELAY
  4. 192.168.1.1 RELAY

后来想了想,按ip配置白名单肯定只是临时方法,换了地方或使用手机发邮件时或ip是动态的不行了,肯定得按域名或发件人地址来配置白名单,于是改为:

  1. From:ec2-user@devgou.com RELAY

但不行,每次发邮件 /var/log/maillog 日志里都报错 Relaying denied. IP name lookup failed
又改为

  1. Connect:devgou.com RELAY

也不行。

后来发现他有复杂的匹配规则:
属于本地/被允许的发送者,则RELAY
如果在relay-domains或者access文件中列出的是域名,则对发送者的IP地址先查找/etc/hosts文件(一般是如此,如果文件/etc/host.conf采用默认配置的话),如果没有,再查找DNS。查找DNS的过程是:先做IP地址的反向DNS查找,如果能够反向查找出来,且查找出来的主机的域部分属于上面两个文件中列出的域名,再对该主机名做正向DNS查找,若查找出的IP地址(主机的A记录)与发送者IP地址相同,则允许relay邮件,这表明发送者属于被允许的发送者。
如果正反向解析不一致,则会在/var/log/maillog中记录一行警告信息说”may be forged”(可能被伪造的)。如果收信人也不在access文件列表中,则拒发邮件。

本地或者被允许的接收者,则RELAY
相对于发送者,这个就非常简单了。只要接收者的email地址的域部分被列在/etc/mail/relay-domains或者/etc/mail/access 文件中,邮件被允许接收。

最终我把 163.com RELAY 加到配置中,就ok了,难道之前发不出去都是因为收件人验证不成功?
为了验证我的想法,试验了一下,此时再给我自己的qq邮箱发个邮件,提示

  1. Aug 2 09:52:03 ip-172-26-12-70 sendmail[13891]: x729q3MO013891: ruleset=check_rcpt, arg1=<450649025@qq.com>, relay=[220.194.45.154], reject=550 5.7.1 <450649025@qq.com>... Relaying denied. IP name lookup failed [220.194.45.154]

果真是收件人验证不成功。
难道我得把市面上所有主流的邮件服务商地址都枚举一遍吗?这也太麻烦了,继续研究。
最后我发现,只靠 /etc/mail/access 的访问控制是无法满足的,必须得上基于smtp的账号密码验证了

makemap使配置生效

修改完/etc/mail/access文件后,还需要使用makemap命令将access文件的内容导入到access.db文件中:
sudo makemap hash access.db < access

重新启动sendmail服务即可:
sudo service sendmail restart

Sendmail relay规则及配置文件用法汇总
https://blog.csdn.net/sdulibh/article/details/51733754


Relaying denied. IP name lookup failed

如果遇到telnet 测试 邮件发送时,填完 rcpt 报错:

  1. 550 5.7.1 masi.1989@163.com... Relaying denied. IP name lookup failed [220.194.45.154]

/var/log/maillog 中能看到日志

  1. Aug 2 08:05:13 ip-172-26-12-70 sendmail[13355]: x7285Cjx013355: ruleset=check_rcpt, arg1=<masi.1989@163.com>, relay=[220.194.45.154], reject=550 5.7.1 <masi.1989@163.com>... Relaying denied. IP name lookup failed [220.194.45.154]
  2. Aug 2 08:05:13 ip-172-26-12-70 sendmail[13355]: x7285Cjx013355: from=<ec2-user@devgou.com>, size=0, class=0, nrcpts=0, proto=ESMTP, daemon=MTA, relay=[220.194.45.154]

最后的 IP 是我本机的出口IP
原因是 sendmail 服务器 拒绝转发邮件, sendmail是邮件中转站,需要将客户端的IP地址加入到access配置文件中。
将此 ip 配置到 /etc/mail/access 中并重启 sendmail 服务即可。


/etc/mail/access作用原理

当信件想要使用我们的邮件主机来进行寄信或者是 Relay 的动作时,首先会传送 mail header 到我们的 mail server 上面,这也就是一些邮件的基本数据(如认证信息、来源IP、目标的 MTA 等等),但并不包含邮件的内容(例如信件本体、附件夹带等等的内容)。
也就是说,一封邮件基本上可以分为两大部分,分别是 Header 与 Body ,Header 仅记录邮件基本信息,Body 才是真正的信件内容。
当邮件想要进入 MTA 时,会先发送 Header 给 MTA ,MTA 判断这个 Header 的信息是可接受的之后,才后继续接受来源主机的邮件 Body 内容!如果这些基本讯息传送过来的主机信息包括在 /etc/mail/access.db 里面所记录到的主机(或IP)范围时,就可以指定底下这些动作:

通常我们比较建议使用 DISCARD 啦!为什么呢?如果该 IP 来源传送的是广告信件,您又使用 REJECT 的话,那么两方面的邮件主机将会一再地进行 mail header 的传送,也是挺消耗带宽的!所以我们比较建议使用 DISCARD!再来,由于 access 不支持网域的写法,亦即
192.168.0.0/24
192.168.0.0/255.255.255.0
这种类型的网域写法并不能被使用的!所以,只能以 192.168.0 这种写法来达成整个网域的设定了!也就是说, access 里面大概只能支持 A/B/C Class 的网域, subnet 大概就无法达成了!只能一个一个 IP 的 Keyin 啰!编辑完这个档案之后,就可以让你的其他主机使用 Sendmail 的 Relay 功能啰!还不赖吧!

sendmail下配置/etc/mail/access文件实现邮件转发控制
https://www.it7e.com/archives/676.html


Relay与认证机制

MTA 在分析收到的邮件之后,如果收件者不是本身主机的账号,则会将该信件再传送到下一个 MTA 上面,这个由 MTA 帮忙转信的功能就称为 Relay 啦。那么在这个功能当中,您有没有发现一件奇怪的事情啊!那就是:『是否任何人都可以使用我的 MTA 邮件主机服务器来传送他的邮件呢?』这个问题涉及到 Mail Server 的设定技巧了!如果设定不良的话,例如早期的 Sendmail 版本中,他就没有针对使用者来进行管制,也就是说,任何人都可以使用这样的一部邮件主机来达到信件传送的目的!这种主机我们称为『Open Relay』的电子邮件主机喔!这里请仔细的思考一下,如果我的 MTA 对于寄信的人没有一个限制的话,结果会如何呢?呵呵!没有错,结果就是任何人都可以使用你的 MTA 来发信了!那有什么好可怕的?我们在前言的地方就已经稍微说过了,那个所谓的『广告信、垃圾信件』的问题,而如果你的 MTA 没有对寄信的人作限制的话,由于任何人都可以使用你的 MTA 来发信,你的 MTA 将会变的『很笨重!』

为了避免这个问题,所以,目前所有新版的邮件主机服务器架设软件 ( Mail server packages ) 预设的情况之下,都不会对外完全的开放 Relay 的功能的!默认通常仅『针对主机 ( localhost ) 开放 Relay 的功能!』,不过,这样的 MTA 是可以收受来自 Internet 上面的,注明收件者是我们 MTA 主机内部账号的信件的,因此, MTA 在『收信』上面是没有问题的!

但是关闭了 Relay 之后,虽然可以避免掉我们 MTA 主机被当成广告信发送站,不过如此一来又造成了一些困扰!何解?因为通常我们仅针对主机,或者一些规范的 IP 或者是网段等信任的主机来开放他们的 Relay 的功能,所以在这个设定的范围内的 Client 端计算机可以自由的收发信件,至于没有规范到的 IP 来源的寄信信件,将完全的挡掉。然而万一您使用的是 ADSL 计时制的呢?又或者您是常常在外面出差的大老板,则你的 IP 将『不会固定』,完蛋啦~怎么办?既不能完全开放 Relay ,又没有固定 IP ,无解了吗?呵呵!还好,有所谓的 邮件认证机制 来帮我们解决这个困境啦!

所谓的『邮件认证机制』就是在 MTA 当中加入需要检查发信者的『账号与密码』比对的功能,当 MTA 接到来自 Client 端的传信需求时,会检查来自 Client 端的认证比对(账号密码),如果账号与密码比对正确,则开始接受信件并帮忙转信,如果比对不正确则将该 MTA 并不会接受该封信件,直接在 Client 端显示『不接受您的信件』之类的讯息喔!目前有相当多种的邮件认证机制,广为使用的是 SMTP 邮件认证这个机制。

所谓的 SMTP 邮件认证机制,顾名思义,就是在 smtp 这个协定上面动手脚的一个机制啰!亦即是在寄信的时候,(由 MUA 到 MTA 的步骤中 ),我们的 MTA 主机『一定要求检验 MUA 发信者的账号与密码!』这样的功能!果真能做到这一点的话,那么你的 MTA 就可以在经过认证之后,提供认证者的 Relay 功能,而不需要针对某些信任网域或 IP 来分别设定开放 Relay 的功能啦!因为经由『认证』的机制,你的 MTA 会去分析寄信者的相关信息,通过后才会接受信件并帮他们寄信,否则就不接受信件!呵呵!没错!就是这样!透过这样的机制,您将不需要规范 Relay 的 IP 或网段,直接交给 SMTP 邮件认证来帮你管理你发件人的 Relay 功能,从此以后,你的 Clients 就不会常常向你抱怨说 MTA 不稳定啰!

什么是 Relay 与认证机制 - 《鳥哥的 Linux 私房菜》
http://cn.linux.vbird.org/linux_server/linux_redhat9/0380sendmail.php#theory_relay_auth


SMTP认证

sendmail默认是不会认证发信人身份的,只能通过 /etc/mail/access 做访问控制,无法满足需求。
而开启smtp认证之后,只有认证身份的用户才可以发送邮件。
SMTP 邮件认证机制 ( SMTP Authorization ) ,主要透过 cyrus-sasl 实现的。

smtp认证原理

当用户请求进入 25号端口后,sendmail调用cyrus-sasl的saslauthd进程,saslauthd要求对方输入本地系统用户的用户名和密码,当用户 输入好后,saslauthd会去查找系统的/etc/shadow文件,密码确认无误,放行,告诉sendmail,这个用户合法,可以使用邮件服务来 发邮件。

配置并启动saslauthd

sendmail-8 中已经包含了 cyrus-sasl, centos 系统貌似也自带 cyrus-sasl ,不需要单独安装

  1. $ rpm -qa|grep cyrus
  2. cyrus-sasl-2.1.23-13.16.amzn1.x86_64
  3. cyrus-sasl-plain-2.1.23-13.16.amzn1.x86_64
  4. cyrus-sasl-lib-2.1.23-13.16.amzn1.x86_64

配置 /etc/sysconfig/saslauthd

  1. $ cat /etc/sysconfig/saslauthd
  2. # Directory in which to place saslauthd's listening socket, pid file, and so
  3. # on. This directory must already exist.
  4. SOCKETDIR=/var/run/saslauthd
  5. # Mechanism to use when checking passwords. Run "saslauthd -v" to get a list
  6. # of which mechanism your installation was compiled with the ablity to use.
  7. MECH=shadow
  8. # Options sent to the saslauthd. If the MECH is other than "pam" uncomment the next line.
  9. # DAEMONOPTS=--user saslauth
  10. # Additional flags to pass to saslauthd on the command line. See saslauthd(8)
  11. # for the list of accepted flags.
  12. FLAGS=

找到 MECH=
等号后面不管写什么,我们都要改成:
MECH=shadow
保存
这样saslauthd才会去找shadow文件给用户做认证。

启动 sudo service saslauthd start 或重启 sudo service saslauthd restart saslauthd 服务
并设定开机启动

  1. $ chkconfig --list |grep saslauthd
  2. saslauthd 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
  3. $ sudo chkconfig saslauthd on
  4. $ chkconfig --list |grep saslauthd
  5. saslauthd 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭

注意:开启smtp认证后,saslauthd 服务必须始终开着,否则是无法登录或发邮件的。

/etc/mail/sendmail.mc开启smtp认证

配置 /etc/mail/sendmail.mc
找到:

  1. dnl TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
  2. dnl define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl

把前面的dnl注释去掉,变成:

  1. TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
  2. define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl

TRUST_AUTH_MECH的作用是使sendmail不管access文件中如何设置, 都能relay那些通过EXTERNAL, LOGIN, PLAIN, CRAM-MD5或DIGEST-MD5等方式验证的邮件,注意这里是对需要relay的邮件进行验证,这点很重要,只有这样通过验证的邮件才会被 relay以防止sendmail服务器被滥用。
confAUTH_MECHANISMS的作用是确定系统的认证方式。Outlook Express支持的认证方式是LOGIN。

生成正式的配置文件。
sudo m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
如果提示无权限,先切换到root用户再执行此命令。
然后重启 sendmail
sudo service sendmail restart

centOS 下 sendmail邮件服务器搭载smtp和pop3认证的配置方法
https://blog.csdn.net/wangjialiang/article/details/6100222

Red Hat 的 SMTP 认证启用流程 - 《鳥哥的 Linux 私房菜》
http://cn.linux.vbird.org/linux_server/linux_redhat9/0380sendmail.php#security_SMTP_AUTH

sendmail开启基于sasl的smtp认证
https://www.it7e.com/archives/685.html


sendmail: collect: Cannot write … Permission denied-SOLVED

  1. Aug 3 12:36:31 ip-172-26-12-70 sendmail[19441]: x73CaUa1019441: SYSERR(root): collect: Cannot write ./dfx73CaUa1019441 (bfcommit, uid=0, gid=51): Permission denied

貌似是 sendmail 没有某个文件夹的写权限,网上有的说把 /var/spool/mqueue 文件夹的所有者改为 root,但我改了还是不行。
最后是把 /var/spool/mqueue 权限改为 777 解决的
sudo chmod 777 /var/spool/mqueue

sendmail: collect: Cannot write … Permission denied-SOLVED
https://forums.gentoo.org/viewtopic-t-881873-start-0.html


启动sendmail

sudo service sendmail start

  1. $ sudo service sendmail start
  2. Starting sendmail: [ OK ]
  3. Starting sm-client: [ OK ]

验证sendmail已经在监听25端口

  1. $ sudo netstat -anp|grep 25
  2. tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 27685/sendmail

查看邮件发送队列

使用sendmail -bp 或者 mailq 可以查看到邮件发送队列,里边会列出有几个邮件等待发送

  1. $ sudo sendmail -bp
  2. /var/spool/mqueue (1 request)
  3. -----Q-ID----- --Size-- -----Q-Time----- ------------Sender/Recipient-----------
  4. x6P6ROUk010874 19 Thu Jul 25 14:27 <ec2-user@ip-172-26-12-70.ap-northeast-
  5. 8BITMIME (reply: read error from 163mx01.mxmail.netease.com.)
  6. <masi.1989@163.com>
  7. Total requests: 1

邮件队列的文件都保存在 /var/spool/mqueue/ 文件夹内,查看此文件夹时,可以看到邮件队列内的邮件


删除sendmail

查看 sendmail 运行状况

  1. $ sudo service sendmail status
  2. sendmail (pid 2680) is running...
  3. sm-client (pid 2689) is running...

停止 sendmail
sudo service sendmail stop

删除 sendmail
rpm -e sendmail
或者
yum remove sendmail


postfix邮件发送代理(MTA)

安装postfix

RHEL/CentOS 7.x 即使最小安装版也自带 postfix 作为默认的邮件MTA

检查postfix是否已安装
rpm -qa | grep postfix

  1. $ rpm -qa|grep postfix
  2. postfix-2.10.1-7.el7.x86_64

如果没安装就使用yum安装
yum -y install postfix

安装postfix时mysql版本冲突

RHEL/CentOS 6.x 中安装postfix时依赖的mysql版本与mysql 5.6冲突
我安装postfix之前已安装了mysql 5.6,再安装postfix时报如下错误:

  1. 正在安装:
  2. postfix x86_64 2:2.6.6-2.15.amzn1 amzn-main 4.1 M
  3. 为依赖而安装:
  4. mysql55-libs x86_64 5.5.62-1.23.amzn1 amzn-updates 816 k
  5. postgresql92-libs x86_64 9.2.24-2.66.amzn1 amzn-updates 261 k
  6. Transaction check error:
  7. file /usr/lib64/mysql/libmysqlclient.so.18 from install of mysql55-libs-5.5.62-1.23.amzn1.x86_64 conflicts with file from package mysql-community-libs-5.6.44-2.el6.x86_64

yum install 安装时使用 --exclude 排除mysql相关依赖也不行,安装还是会失败。

设置系统默认MTA为postfix

查看系统当前默认MTA
alternatives --display mta
如果系统中同时安装了 sendmail 和 postfix, 可以使用 alternatives 命令选择默认的MTA
alternatives --config mta

Postfix 教学文档
https://wiki.centos.org/zh/HowTos/postfix

第二十二章、邮件服务器: Postfix
http://cn.linux.vbird.org/linux_server/0380mail.php

Linux系统下邮件服务器的搭建(Postfix+Dovecot)
http://lomu.me/post/linux-email-server


dovecot邮件接收代理(MRA)

dovecot是一款能够为Linux系统提供IMAP和POP3电子邮件服务的开源服务程序,安全性极高,配置简单,执行速度快,而且占用的服务器硬件资源也较少,因此是一款值得推荐的收件服务程序。

安装启动dovecot

检查dovecot是否已安装
rpm -qa | grep dovecot
如果已安装则会显示具体版本信息

  1. $ rpm -qa|grep dovecot
  2. dovecot-2.2.36-3.el7_7.1.x86_64

如果没安装就使用yum安装
yum -y install dovecot

配置dovecot

dovecot的主配置文件在 /etc/dovecot.conf 或 /etc/dovecot/dovecot.conf
根据版本不同,有的是配置文件都在 /etc/dovecot/dovecot.conf 中,有的是分开到 /etc/dovecot/conf.d/ 目录下 ,所以在主配置文件中找不到的配置项可以去 conf.d 子目录中找找。

主配置文件的最后有一行 include ,所以,放在 /etc/dovecot/conf.d/ 目录下的所有 *.conf 配置文件都会被加载生效。

  1. !include conf.d/*.conf

Centos7+Postfix+Dovecot实现邮件收发(这个配置讲的很详细)
https://blog.51cto.com/gaowenlong/1884841

dovecot.conf配置协议和监听地址

编辑/etc/dovecot/dovecot.conf配置文件:
1、去掉 protocols 前的注释

  1. # Protocols we want to be serving.
  2. protocols = imap pop3 lmtp

可能版本不同,我看网上有的是 protocols = imap imaps pop3 pop3s, 但我这里只有 protocols = imap pop3 lmtp, 也不知道能不能随便加其他协议

2、启用端口监听

  1. listen = *,::

10-auth.conf配置验证方式

vim /etc/dovecot/conf.d/10-auth.conf
网上有的博客里让在 dovecot.conf 中找此配置项,结果根本找不到。
修改如下两行配置:

  1. disable_plaintext_auth = no
  2. auth_mechanisms = plain login

10-ssl.conf去掉ssl认证

vim /etc/dovecot/conf.d/10-ssl.conf
ssl 改为 no

  1. ssl = no

10-logging.conf启用日志

这个配不配都行,无关紧要.
vim /etc/dovecot/conf.d/10-logging.conf
添加

  1. info_log_path = /var/log/dovecot_info.log
  2. debug_log_path = /var/log/dovecot_debug.log

10-mail.conf配置邮箱收信文件夹

这个配置文件主要是用来设置怎么存放收到的邮件的,最重要的一个配置项是 mail_location, 仔细研究后发现它还有自己一套语法。
详见 https://wiki2.dovecot.org/MailLocation

  1. $ cat 10-mail.conf
  2. ##
  3. ## Mailbox locations and namespaces
  4. ##
  5. # Location for users' mailboxes. The default is empty, which means that Dovecot
  6. # tries to find the mailboxes automatically. This won't work if the user
  7. # doesn't yet have any mail, so you should explicitly tell Dovecot the full
  8. # location.
  9. #
  10. # If you're using mbox, giving a path to the INBOX file (eg. /var/mail/%u)
  11. # isn't enough. You'll also need to tell Dovecot where the other mailboxes are
  12. # kept. This is called the "root mail directory", and it must be the first
  13. # path given in the mail_location setting.
  14. #
  15. # There are a few special variables you can use, eg.:
  16. #
  17. # %u - username
  18. # %n - user part in user@domain, same as %u if there's no domain
  19. # %d - domain part in user@domain, empty if there's no domain
  20. # %h - home directory
  21. #
  22. # See doc/wiki/Variables.txt for full list. Some examples:
  23. #
  24. # mail_location = maildir:~/Maildir
  25. # mail_location = mbox:~/mail:INBOX=/var/mail/%u
  26. # mail_location = mbox:/var/mail/%d/%1n/%n:INDEX=/var/indexes/%d/%1n/%n
  27. #
  28. # <doc/wiki/MailLocation.txt>
  29. #
  30. #mail_location =
mail_location的自动检测机制

默认情况下 mail_location 配置项是空的, 此时 dovecot 会尝试自动发现存储邮件的文件夹。
按如下顺序查找:

  1. ~/mdbox/
  2. ~/sdbox/
  3. ~/Maildir/
  4. ~/mail/.imap/
  5. ~/mail/inbox
  6. ~/mail/mbox
  7. ~/Mail/.imap/
  8. ~/Mail/inbox
  9. ~/Mail/mbox

注意:
1、自动检测机制不会自动创建文件夹,如果想使用哦上面的某个文件夹作为收信文件夹,必须先手动创建好。
2、.imap 是一个目录, inbox 和 mbox 是文件。


没配置收信文件夹导致outlook无法远程连接邮件服务器

使用Outlook始终无法连接上邮件服务器,不知道为啥。
后来发现当在 Outlook 中使用 imap 协议连接时, /var/log/maillog 中会打印出如下日志:

  1. Aug 1 10:11:16 ip-172-26-12-70 dovecot: imap(mailuser): Error: user mailuser: Initialization failed: Namespace '': Mail storage autodetection failed with home=/home/mailuser
  2. Aug 1 10:11:16 ip-172-26-12-70 dovecot: imap(mailuser): Error: Invalid user settings. Refer to server log for more information.

才知道原来一直有错。
原因是收信的文件夹没配置,这时 dovecot 会自动检测收信文件夹,详见上面内容,我们只需创建一个 dovecot 会自动检测的文件夹即可
mkdir -p ~/mail/.imap

dovecot mail storage auto detection failed [closed]
https://serverfault.com/questions/854520/dovecot-mail-storage-auto-detection-failed

/var/spool/mail/权限不正确问题

outlook 连接时 /var/log/maillog 日志中报如下权限错误

  1. Aug 2 03:21:50 ip-172-26-12-70 dovecot: imap(ec2-user): Error: chown(/home/ec2-user/mail/.imap/INBOX, group=12(mail)) failed: Operation not permitted (egid=500(ec2-user), group based on /var/mail/ec2-user - see http://wiki2.dovecot.org/Errors/ChgrpNoPerm)
  2. Aug 2 03:21:51 ip-172-26-12-70 dovecot: imap(ec2-user): Error: chown(/home/ec2-user/mail/.imap/INBOX, group=12(mail)) failed: Operation not permitted (egid=500(ec2-user), group based on /var/mail/ec2-user - see http://wiki2.dovecot.org/Errors/ChgrpNoPerm)

其中 ec2-user 是我登录邮箱用的账号,原因在日志给出的链接里说的很清楚。dovecot 试图拷贝 /var/mail/ec2-user 文件夹的组(也就是mail)到邮件索引目录 /home/ec2-user/mail/.imap/INBOX,这是发生了权限错误。
https://wiki2.dovecot.org/Errors/ChgrpNoPerm

解决方法:
sudo chmod 0600 /var/spool/mail/*
我也不太懂为啥改这个目录的权限就好了,反正改了之后不报这个错了,有兴趣可再研究下。

RHEL6+Postfix+Dovecot相关配置问题解决
https://linux.cn/blog-21117-5952.html


启动dovecot

启动dovecot
sudo service dovecot start

配置开机启动

  1. $ sudo chkconfig --list dovecot
  2. dovecot 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
  3. $ sudo chkconfig dovecot on
  4. $ sudo chkconfig --list dovecot
  5. dovecot 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭

验证 dovecot 已经开始监听 imap的 143 接口 和 pop3 的110 接口

  1. $ sudo netstat -anp|egrep ':25|:110|:143'
  2. tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN 28182/dovecot
  3. tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN 28182/dovecot
  4. tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 4640/sendmail
  5. tcp 0 0 :::110 :::* LISTEN 28182/dovecot
  6. tcp 0 0 :::143 :::* LISTEN 28182/dovecot

收发邮件测试

telnet远程命令行发邮件测试(无smtp认证)

一种快速有效的测试sendmail安装是否正确的方法就是使用telnet命令直接直接登录服务器的25端口,并收发邮件以及对sendmail进行测试。
可以在服务器上测试telnet,也可以远程测试,我这里是在vps搭建好sendmail后远程测试的

在本地机器上, telnet 远程服务器的 25 端口

  1. $ telnet xx.xx.xx.xx 25
  2. Trying xx.xx.xx.xx...
  3. Connected to mail.devgou.com.
  4. Escape character is '^]'.
  5. 220 ************************************************************************************************************
  6. helo hi # 打招呼,测试连接
  7. 250 ip-172-26-12-70.ap-northeast-1.compute.internal Hello [220.194.45.154], pleased to meet you
  8. mail from:"noreply"<noreplyaaadf@devgou.com> # 发件人信息
  9. 250 2.1.0 "noreply"<noreplyaaadf@devgou.com>... Sender ok
  10. rcpt to:masi.1989@163.com # 收件人信息
  11. 250 2.1.5 masi.1989@163.com... Recipient ok
  12. data # 开始写邮件
  13. 354 Enter mail, end with "." on a line by itself
  14. subject: test_mail subject # 邮件标题
  15. test mail body,hahahahah! # 邮件正文
  16. . # 输入.后回车结束编写
  17. 250 2.0.0 x718eaMh008255 Message accepted for delivery
  18. quit # 退出telnet
  19. 221 2.0.0 ip-172-26-12-70.ap-northeast-1.compute.internal closing connection
  20. Connection closed by foreign host.

我的 163 邮箱是真的可以立即收到邮件的,如下:


telnet远程连接sendmail服务器给163邮箱发邮件

ECS搭建sendmail邮件服务器
https://www.wqblogs.com/ecs%E6%90%AD%E5%BB%BAsendmail%E9%82%AE%E4%BB%B6%E6%9C%8D%E5%8A%A1%E5%99%A8/


telnet远程命令行发邮件测试(有smtp认证)

参考这篇文字中的操作方法,主要是账号密码还得base64编码,太麻烦了,就没搞
centOS 下 sendmail邮件服务器搭载smtp和pop3认证的配置方法
https://blog.csdn.net/wangjialiang/article/details/6100222


Outlook连接邮箱

Outlook 中添加新账户, 账号就是 linux系统账号@邮件服务器域名


Outlook连接自己搭建的邮箱

然后选择 IMAP/POP,继续填写账号信息


配置账号密码

密码就是 linux账号的密码
发信和收信服务器都填我们DNS解析中配置的 MX 记录指向的域名 mail.devgou.com,不使用ssl
可连接成功。

outlook收邮件测试

然后我在我的华为手机上用163邮箱给 自己搭建的邮箱 ec2-user@devgou.com 发一封邮件,在outlook马上就收到了,如下


Outlook收到来自163邮箱的信

/var/log/maillog 中能看到日志

  1. Aug 2 03:51:24 ip-172-26-12-70 sendmail[12307]: x723pNHS012307: from=<masi.1989@163.com>, size=1369, class=0, nrcpts=1, msgid=<mm08nv-lh6xdi67boi726eyg2sflau6-3tvbszqg9o39-cjsj0sxwg7m4-z6i9wxri56pz-vq20v5-orxf6m3wzc93-8fy95r1w, proto=ESMTP, daemon=MTA, relay=m12-17.163.com [220.181.12.17]
  2. Aug 2 03:51:24 ip-172-26-12-70 sendmail[12308]: x723pNHS012307: to=<ec2-user@devgou.com>, delay=00:00:01, xdelay=00:00:00, mailer=local, pri=31589, dsn=2.0.0, stat=Sent

手机连接邮箱

在华为手机上连接邮箱


手机连接邮箱IMAP收信设置

手机连接邮箱SMTP发信设置

手机发信测试

然后我用自建邮箱编写一封邮件发到我的163邮箱


163邮箱收到手机发来信

延迟比较大,过了好几分钟才收到
/var/log/maillog 中日志

  1. Aug 2 04:12:48 ip-172-26-12-70 sendmail[12435]: x7249hZw012432: to=<masi.1989@163.com>, ctladdr=<ec2-user@devgou.com> (500/500), delay=00:03:04, xdelay=00:03:04, mailer=esmtp, pri=120588, relay=163mx00.mxmail.netease.com. [220.181.14.149], dsn=4.0.0, stat=Deferred: Connection reset by 163mx00.mxmail.netease.com.
  2. Aug 2 04:34:35 ip-172-26-12-70 sendmail[12580]: STARTTLS=client, relay=163mx02.mxmail.netease.com., version=TLSv1/SSLv3, verify=FAIL, cipher=AES256-GCM-SHA384, bits=256/256
  3. Aug 2 04:34:37 ip-172-26-12-70 sendmail[12580]: x7249hZw012432: to=<masi.1989@163.com>, ctladdr=<ec2-user@devgou.com> (500/500), delay=00:24:53, xdelay=00:00:06, mailer=esmtp, pri=210588, relay=163mx02.mxmail.netease.com. [220.181.14.155], dsn=2.0.0, stat=Sent (Mail OK queued as mx35,VcCowAAnvGxavUNdqHzPdQ--.47807S3 1564720477)

可以看到发了两次才成功,第一次163邮件服务器给来了个 Connection reset


mail/mailx邮件客户端(MUA)

mail 命令是 Linux 下一个非常轻巧的交互式的命令行邮件客户端,基于 Berkeley Mail 8.1,提供 MIME、MAP、POP3、SMTP 和 S/MIME 等扩展
mail 默认是调用本机 MTA 发送邮件的,这意味着需要在本机上安装 sendmail 或 postfix 或 exim 或…,配置比较麻烦,而且会带来不必要的资源占用。
通过修改配置文件,可以达到不使用 sendmail 而用外部 smtp 服务器发送邮件的目的。

mail命令语法与参数

语法:
mail [-s subject] [-c cc-addr] to-addr

如果需要发送给多个收件人,收件人之间用逗号分隔,例如:mail -s "主题" 123456@qq.com,888888@qq.com

参数:
-b address 指定密件副本的收信人地址
-c address 指定副本的收信人地址
-f [file] 读取指定邮件文件中的邮件
-i 忽略终端发出的信息
-I 使用互动模式
-n 启动时禁止读取 /etc/mail.rc
-N 阅读邮件时,不显示邮件的标题
-s subject 指定邮件的主题
-r 发件人地址 指定发件人信息
-t 要发送的消息应包含带有 To:、Cc:、或 Bcc: 字段的消息头,在命令行上指定的收件人将被忽略。
-u user 读取指定用户的邮件
-v 执行时,显示详细的信息
-V 显示版本信息并退出

yum安装mail命令

RHEL/CentOS 中 yum 安装 mailx 后就有了mail命令
yum install -y mailx
我安装 mailx 后,自动也给安装了 sendmail

配置第三方邮件地址

bin/mail 会默认使用本地sendmail发送邮件,这样要求本地的机器必须安装和启动Sendmail服务,而通过修改配置文件/etc/mail.rc可以使用外部SMTP服务器,可以达到不使用sendmail而用外部的smtp服务器发送邮件的目的。

如果不安装 sendmail,可以配置一个第三方邮件账号,使用第三方邮件账号来发送邮件
修改配置文件 /etc/mail.rc

  1. $ vi /etc/mail.rc
  2. # 在文件末尾添加以下信息
  3. set from=xxx@163.com # 发送的邮件地址
  4. set smtp=smtp.163.com # 发送邮件服务器
  5. set smtp-auth-user=xxx@163.com # 发件人账号
  6. set smtp-auth-password=xxx # 发件人密码(如开启了客户端授权码,这里要填授权码)
  7. set smtp-auth=login # 邮件认证方式

配置成功后,就可以使用外部 smtp 服务器发送邮件了。

mail命令发送email实例

直接使用shell当编辑器

直接把当前 shell 当成编辑器来用,可以输入正文,当邮件正文输入完成后,需要按 Ctrl+D 结束输入。

  1. $ mail -s "邮件主题" 123456@qq.com
  2. hello # 邮件正文
  3. world # 邮件正文

第一行是输入的命令,-s表示邮件的主题,后面则是邮件的接收人,输入完这行命令后回车,会进入邮件正文的编写,我们可以输入任何文字,比如上面的两行。
当邮件正文输入完成后,需要按CTRL+D结束输入,此时会提示你输入Cc地址,即邮件抄送地址,没有直接回车就完成了邮件的发送。

管道方式

echo 后面的是邮件的正文

  1. echo "邮件正文" | mail -s "邮件主题" 123456@qq.com

以文件 file.txt 的内容为邮件正文发送:

  1. cat file.txt | mail -s "邮件主题" 123456@qq.com

echo "测试邮件正文" | mail -s "mail命令测试主题" masi.1989@163.com


mail命令发送的邮件

文件重定向

以文件 file.txt 的内容为邮件正文发送。

  1. mail -s "邮件主题" 123456@qq.com < file.txt

多个收件人

多个收件人,收件地址只需要用英文逗号隔开即可:

  1. echo "This is message body" | mail -s "This is Subject" someone@example.com,someone2@example.com

指定发件人信息

使用 sendmail 邮件服务器的好处就是,可以随意指定发件人信息。
为什么呢?
sendmail 中默认情况下,本机寄出的邮件可以不用经过 SMTP 的手续,将直接以 sendmail 的功能寄出,这也就是说,无论如何,来自主机内部的信件都将被传送出去!这也是为什么有的时候明明你的 sendmail 没有正常的启动,但是在主机上面直接以 mail 这个指令却还是可以将邮件送出的原因

命令中增加 -r 参数定义发件人:

  1. echo "测试邮件正文" | mail -s "mail命令测试主题" -r "noreply<noreply@devgou.com>" masi.1989@163.com

收到的邮件如下:


mail命令指定发件人发送的邮件

Linux 命令(网络管理 - mail/mailx)
https://blog.csdn.net/liang19890820/article/details/53115334

Linux 使用 mail/mailx 发送邮件
http://www.zkea.net/codesnippet/detail/post-74.html

Linux下使用mail命令发送邮件
https://blog.51cto.com/ityunwei2017/1713425

退出移动版