Sendmail 是一个很有年代感的 MTA(邮件传输代理)程序了,在现如今来说,可能会让大家觉得有点太老了,不过,这并不代表它就没有用处。本文将以 Debian 系统 VPS 为测试环境,根据博主自己的经验,教大家来配置该程序,好让原本苦于博客带有邮件通知功能却无法使用的博主,能顺利的启用该功能。当然,安装配置好以后,它不仅能支持 WordPress 的送信功能,拿来当作自己的专属邮箱也不在话下。
更新:邮件服务器其它方面的详细配置:《为服务器发出的邮件再加分——添加 MX、DNS 反向解析、SPF 和 DMARC 记录,并为邮件加上 DKIM 签名》
本文书写的背景
相信很多使用 WordPress 博客的用户都和我一样,虽然知道 WordPress 有邮件通知的功能,却在实际使用中发现自己并没有收到任何的邮件(不信你百度或者谷歌一下看看······)。博主本人在一次偶然的场合,听到了有人说起这个,正好最近想写点教程之类的,所以稍微找了个环境测试了一下,在成功之后,将自己的一些经验分享给大家,让广大博主能早日使用上这一功能。
一、检查自己的服务器是否支持 mail 函数
因为是让 WordPress 支持邮件通知,所以我们自然要先知道服务器是否有禁用 mail 函数了,测试的方法有很多,这里只给大家提一下。
- 使用探针,在函数检测中输入“mail”看提示
- 在自己的 WordPress 登录页面点击忘记密码,尝试输入账户有关信息后,看 WordPress 是否能正常提示发出邮件
二、开启 25 端口
在正式开始安装及配置教程之前,我们先要把一些准备工作做到位,检查 25 端口是否有开启,不然可能会影响到我们的能不能正常的发邮件。此处的开启 25 端口,不仅仅是指在服务器的防火墙设置中开启 25 端口,还是指在一些主机服务商的限制中,开启 25 端口,因为有些主机商默认是不给服务器开启该端口的,以防止产生大量的垃圾邮件发送,所以如果你按照下面的教程做完后,发现自己还是没法发邮件,建议询问一下你的主机服务商,是否对 25 端口进行了限制。
注意:如果你只是在服务器或者博客上发邮件,你服务器上的对外 25 端口是没必要开启的,但是主机商有限制的话,还是得找主机商取消限制才行,只有当你想要让外网的程序或者人能使用你的服务器发信时,对外 25 端口才有必要开启。
PS:如果确实想开启对外 25 端口,可以参照这篇博文中的防火墙设置:《[CentOS/Debian]关于 Iptables&Ip6tables 防火墙的配置及保存应用》
三、添加 MX 记录
MX 记录的作用,就是当有发邮件到你的域名邮箱时,让发件的服务器知道该把这封邮件送到哪里(哪个服务器)。MX 记录的添加需要到你的域名注册商那里,选择 DNS 配置来添加。格式根据注册商不同会略有区别,这里给大家简单的说一下怎么填写。
- 打开域名的 DNS 配置,选择添加 MX 记录
- 如果你的邮箱格式为@example.com 这种,主机名字留空,如果是@mail.example.com 这种,主机名字填写 mail
- TTL 可以理解为该条记录缓存的时间,以秒为单位,过了这个时间,服务器就会重新查询你的 MX 记录有没有更改,防止记录更改之后未及时更新而导致送信失败。这个值具体填多少看个人,一般默认就行了
- 距离/优先级设定的是当你存在多个 MX 记录(也就是多个服务器可以接收到你这个域名的邮件)时,别人发件的服务器具体应该先向谁尝试连接(优先把信送到哪个服务器),如果连接失败,则按照优先级设定的数字,从小到大依次尝试连接。该项填写的值,数字越小的优先度越高,比如一个 MX 记录是 0,一个是 10,那么送信的服务器会先选择连接 0 这条记录的服务器
- MX 记录地址。可以填写 IP,也可以填写域名。如果你的服务器只有 IPv4 地址,那么填写该 IP 进去就行了。如果你想 IPv4 和 IPv6 地址都能被连接,那么建议你先设置一个对于该邮件域名的 A 记录和 AAAA 记录,然后在该处写上域名,这样你的邮箱服务器就同时支持 IPv4 和 IPv6 连接了
注:如果你仅仅是想发送邮件出去而不接收邮件,MX 记录也可以不填写。
四、配置 SPF 记录
这个记录,是需要在你的域名注册商那边添加的,在 SPF 记录中,会写出你这个域名所包含的 IP,好让别人的邮箱服务验证是否是域名持有人发出的邮件。
由于服务器发出的邮件是可以任意伪造发件人的,比如你的网站是 yourdomain.com,如果我用我自己的服务器发邮件,我可以写发件人是 [email protected],以伪造是你的网站甚至是你本人的邮箱发出的邮件。为了对付这个问题,现在的邮箱服务基本上都会验证一个域名的 SPF 记录,按照发件人的 IP,来对比域名 SPF 记录中是否包含有这个 IP,来确定是否是真正的域名持有人发出的邮件。
关于这个记录的添加,是需要你的域名注册商支持才行的,不过大家不必担心,基本上现在的域名注册商都支持添加 TXT 记录,这个就可以用来填写 SPF 记录。
因为如果要介绍 SPF 服务具体的格式之类的,可能会花一些时间,本文决定对这个部分不进行详细介绍,具体的怎么书写可以自行网上搜索,下面只给一个例子,大家可以直接按照下面的例子添加 SPF 记录,一般没什么大问题。
我的域名是 youdomain.com,我想要用的邮箱为 [email protected] 这种格式的,则你可以这么添加 SPF 记录:
1.打开你的域名 DNS 设置
2.添加一条 TXT/SPF 记录,主机名称留空
3.在内容处粘贴上以下内容:
v=spf1 a mx ip4:XXX.XXX.XXX.XXX ip6:XXX.XXX.XXX.XXX -all
解读:v=spf1 这个是指的 SPF 的版本号,现在只有第一版,不要改动。后面的 a 和 mx,是指的域名的 IP 地址可以和域名的 A 记录和 MX 记录匹配(理解为你的邮件来自的 IP 可以和 A 记录和 MX 记录的 IP 相同),后面的两个 XXX.XXX.XXX.XXX,根据前面的设定,ip4 处填写你邮箱服务器的 IPv4 地址,ip6 处填写你的 IPv6 地址,如果没有 IPv6 地址,可以把这一部分删去。最后的 -all,指除了前面说的这些 IP,其它的都拒绝(不是来自于你本人服务器发送的),注意这个 -all 一定要写在最后。
五、配置 DNS 反向解析
前面的 SPF 记录,跟大家解释了它的作用是告诉别人,你的这个域名有哪些 IP,好让别人知道哪些 IP 发来的邮件是域名持有人服务器发来的,哪些可能是假冒的。而 DNS 反向解析则相反,它是告诉别人,一个服务器的 IP 绑定了哪些域名(可能解释不太对),配合上 SPF 记录,两个互相确认彼此,就能让你服务器发出的邮件显得更加的可靠,也更不容易被人冒名顶替。
这一部分,是需要在你的主机服务商处修改的,这里也不细说,因为不同的服务商,修改的方式可能不太一样,大家只要记住,把反向解析的域名和你 SPF 记录中的域名保持一致就行了。
例子:SPF 记录中的主机名为空,实际匹配的是 yourdomain.com 这个域名,那么 DNS 反向解析也填写该域名。
注:记得上面 SPF 记录里有 IPv6 地址吗?如果你在上面填写了 IPv6 地址,你的主机服务商也支持 IPv6,最好将 IPv4 和 IPv6 的 DNS 反向解析记录都写好,也就是都加上 yourdomain.com。
六、安装 Sendmail
SSH 连接上你的服务器,按照下面的指令顺序输入命令:
apt-get update apt-get install sendmail
按照顺序输入之后,等待 Sendmail 安装完成。
在安装过程中,你可能会看到如下的提示:
To enable sendmail to use STARTTLS, you need to: 1) Add this line to /etc/mail/sendmail.mc and optionally to /etc/mail/submit.mc: include(`/etc/mail/tls/starttls.m4')dnl 2) Run sendmailconfig 3) Restart sendmail
根据提示,要你在/etc/mail/sendmail.mc和/etc/mail/submit.mc 这两个文件中,加入
- 在/etc/mail/sendmail.mc 中加入:
vi /etc/mail/sendmail.mc
将光标移到该文件内容的末尾,按一下 i 键,并另起一行加入:
include(`/etc/mail/tls/starttls.m4')dnl
加入完成之后,按一下 Esc 键,输入 :wq 即可保存并退出。
- 在/etc/mail/submit.mc中加入
方法同上,不重复说了。
做完上面的工作后,我们的 Sendmail 算是初步安装完成了,按顺序执行以下两条命令使预设配置生效并重新启动 Sendmail:
sendmailconfig service sendmail restart
七、Sendmail 简单配置
上面只是将 Sendmail 装好并运行了,但是我们还需要进行一些简单的配置好让我们的邮件程序能正常使用。
- 修改 hostname
上面如果你重启 Sendmail 的时候,你可能会发现它重启的比较慢,这并不是因为 Sendmail 本来就启动得慢,很可能是我们设置不当所致。在默认情况下,Sendmail 的发件人地址,是你服务器目前登录的用户名@你的服务器名称,比如:root@hostname,如果你的 hostname 是个简称,那么发出去的邮件发件人看着就很不对劲了。所以为了防止这个问题,最好还是改一下 hostname。
vi /etc/hostname
在按了 i 键之后,将这个文件里的名字改成你的邮箱使用域名,比如 yourdomain.com,然后 Esc 退出编辑状态,输入:wq 保存并退出。
使得 hostname 立即生效:
hostname -F /etc/hostname
- 修改/etc/mail/sendmail.mc,声明自己的机器名称(域名)
上面咱们已经改了 hostname,如果不出意外,别人看到的邮件发件人应该是 [email protected] 这种格式了,不过服务器中的名字获取途径不止 hostname 这一个,为了防止 sendmail 获取失误,我们最好再主动声明一下:
vi /etc/mail/sendmail.mc
编辑保存方法就不多说了,和上面的都一样,要做的就是在内容的最后再另起一行,输入下面的内容:
define(`confDOMAIN_NAME', `yourdomain.com')dnl
把 yourdomain.com 替换成你自己的域名。
改完之后,要输入下面的命令才能把配置实际应用:
m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
- 修改 /etc/mail/local-host-names,设置服务器接收哪些域名的邮箱
前面我们修改的是自己发出去的邮件显示发件人的地址问题,接下来我们还要修改哪些邮件被我们的服务器接收的问题。举个例子,你的邮件地址是 [email protected],你想让发往 [email protected] 和 [email protected] 这两个地址的邮件都被你的服务器接收,那么你就需要编辑一下 local-host-names 这个文件了。
vi /etc/mail/local-host-names
每一行写一个地址,按照上面的例子,你可能要这么写(编辑保存方法参照上面的):
localhost yourdomain.com mail.yourdomain.com
第一个 localhost 是说的接收来自本地的邮件。
- 编辑
/etc/mail/aliases 文件,设置邮件别名
这个简单举例让大家理解吧,比如有个人给你的邮箱 [email protected] 发了一封邮件,但是你的服务器中并没有这个用户,或者你的服务器中有这个用户,但是你想让另一个邮箱地址 [email protected] 来接收邮件,则你可以为 A 用户设置别名。
vi /etc/mail/aliases
编辑保存方法同上。
如无其它要求,不要随意更改此文件中的内容,另起一行,按照我们上面的要求,设置别名格式如下:
A: root
是的,就是这么简单。另外注意下,这里的 root 不仅可以写你服务器的本地用户地址,也可以写成别的邮箱地址,可以理解为转发功能,比如你可以把 root 改成 [email protected],那么当[email protected] 收到邮件时,会发往 [email protected] 的邮箱。
设置完之后,记得使用命令生效:
newaliases
八、简单配置完成,重启 Sendmail
完成了上面的更改后,基本上此时你的 WordPress 就可以发出通知邮件······不存在的!你还是漏了一步哈哈哈~
做完了上面的这些东西,你只能说 Sendmail 配置没什么大问题了,但是,此时你只能在你的服务器中书写邮件,WordPress 的自动通知邮件还是没法生效的,因为你忘了改 php.ini 配置文件。
vi /usr/local/php/etc/php.ini
编辑保存方法······你懂的。注意,上面的文件路径是 php.ini 的文件路径,如果你的 php.ini 不在这,请根据你的实际情况修改该路径。
在 php.ini 中找到下面这一行,改成如下一样的内容(/usr/sbin/sendmail 是 Sendmail 的安装目录,按照自己的情况更改):
sendmail_path = /usr/sbin/sendmail -t -i
保存之后,重启 PHP 服务:
service php-fpm restart
基本上,到这里就算是大功告成了,最后再贴两个个命令,强迫症系列。
service sendmail restart service sendmail status
第一个是重启,第二个是检查服务是否运行正常。
九、一些备注
只要按照我的教程一步步来,基本上看到这里的你已经成功了。如果你在前面安装了探针,可以用探针自带的邮件检测功能,看看这个邮箱服务是否工作正常,如果工作不正常,记得我前面说的吗?问问你的主机服务商,有没有限制有关的端口。如果成功收到了邮件但是你发现这封邮件被分类到了垃圾箱里······恭喜你,你可能踩到了别的坑了,这个我以后可能还会另写一篇博文来说说。
好了,基本上是写完了,下面给大家交代一下本人的一些备注信息,还有疑惑的可以看看:
- 先看上面的上面那一段的内容
- 本文只是教了大家一些简单的配置,以保证 WordPress 邮件功能能正常工作为前提,本文不包括使用客户端发邮件的配置有关内容
- 本文未提及 DKIM 签名验证的有关内容,缺少这个可能会导致你服务器发出的邮件被判定为垃圾邮件,因为涉及到别的程序的配置,可能会在以后另写一篇来说
- Sendmail 是一个比较老的程序了,现在可能会存在一些安全或者其它的问题,我会考虑以后是否写一篇其它 MTA 程序的安装配置教程
- 测试你服务器发出的邮件质量之类的,可以试试这个网站:https://www.mail-tester.com
- 感谢你们能看完,有不懂的或者本文有说错的地方,欢迎留言~