IP Address: 54.147.142.16


部署WordPress完成后,在使用过程中遇到了很多问题。比如注册邮件发不出去、发出去的邮件收不到和找回密码时提示mail()函数不可用等,这些内容都与邮件系统有关。当然网上也有很多教程来规避上述问题,如注册密码直接显示、通过外部SMTP服务器发送邮件。这些方法前者需要修改wordpress代码,后者发出去的邮件使用的其它邮箱,看上去很Low呀。自己动手搭建一个邮件服务器,用自己的域名给用户发送注册邮件,是种比较好的选择。

CentOS系统默认已经安装并采用了postfix程序作为邮件系统的MTA(邮件传输代理),可以先用alternatives –display mta查看一下当前使用的MTA是哪个程序。如果非postfix则用alternatives –config mta命令修改。修改时选择postfix前面的数字便将其设定为默认MTA了,设定完成后可以再display一下看是否生效。

postfix是一个收发邮件的程序组,由不同程序合作完成邮件的收发,充当邮件系统中的MTA角色(也可以理解为SMTP服务器)。邮件的传送大概经过如下过程:

用户通过MUA——SMTP协议——>MTA(MDA)——SMTP协议——>目标主机MTA
(MDA)——>Mailbox<——MRA<——POP3或IMAP协议——目标用户MUA

 

postfix在整个邮件传送过程充当MTA角色,而MDA(邮件分发代理)为MTA下挂的一个小程序,用于将邮件存放至用户邮箱。目标用户通过MUA(邮件用户代理),使用POP3或IMAP协议从邮件服务器的邮箱中收取邮件。postfix本身不提供pop3协议的支持,需要使用dovecot等MRA(邮件接收代理)软件才能将邮件传送给目标用户。

了解了邮件的处理流程后,开始配置postfix服务器。postfix的配置一般为master.cf和main.cf两个,其中master.cf为postfix主进程的配置文件,用于设置postfix的运行,最好不要修改,以免影响程序运行。邮件的处理为main.cf文件,修改如下内容:

myhostname = mail.daehub.com                        //设置主机名
mydomain = daehub.com                               // 设置域名
myorigin = $mydomain                                //设置服务器可以发送什么域名的邮件
inet_interfaces = all                               //设置监听的网络
inet_protocols = ipv4                               //设置使用的TCP/IP协议
unknown_local_recipient_reject_code = 550           //设置拒绝时的错误码
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain  //设置收信域名
mynetworks = 127.0.0.0/8                            //设置监听的网络
relay_domains = $mydestination                      //设置可以中继传送邮件的域名
home_mailbox = Mailbox                              //设置邮件存储格式,此为全部邮件使用同一文件
#home_mailbox = Maildir/                            //设置邮件使用单独文件

按上面的参数配置后, 用service postfix restart命令重新启动一下服务,如果显示OK的话,理论上就可以收发邮件了。可以用mail -s “Test mail” root@daehub.com,然后输入邮件内容,最后单独一行输入一个”.”号回车,看root的家目录下Mailbox文件中是否有邮件收到。如果有,则说明本机的postfix配置可用了;如果没有,则需要查看/var/log/maillog日志文件,分析问题原因。

这样配置的postfix服务器,外发邮件基本上对方是收不到的,因为这样的邮件会被反垃圾邮件系统阻挡,甚至连阻拦的通知都不会有。要让邮件可以成功被对方接收,最好的办法是给邮件增加DKIM签名,配置DNS服务器的MX和SPF记录,以证实邮件的真实可靠性。先讲如何给邮件增加DKIM签名,然后再统一进行DNS配置。

DKIM签名是DomainKeys Identified Mail的简写,其原理大概可以理解为发送邮件时在邮件信头加入发送域的加密签名信息(私钥),在收信时通过检测邮件域名的DKIM公钥信息,核对正确后认为邮件DKIM有效,减少邮件被spam的机率。DKIM签名使用OpenDKIM软件,采用yum方式安装,安装成功后可以先生成密钥文件,用命令:opendkim-genkey -r -s myselector -d example.com在当前目录下生成两个文件,myselector.private和myselector.txt。其中myselector.private是私钥文件,供opendkim程序使用;myselector.txt是公钥文件,用于配置DNS的解析记录。然后配置/etc/opendkim.conf文件,主要内容如下:

Mode sv                                                   //设置模式为保存和认证
Socket inet:8891@localhost                                //设置socket端口
Umask 022                                                 //设置掩码
Canonicalization relaxed/relaxed                          //设置标准
Domain daehub.com                                         //设置域名
Selector daehub                                           //设置选择器(最好不用default)
KeyFile /etc/opendkim/keys/daehub.private                 //设置私钥文件
KeyTable refile:/etc/opendkim/KeyTable                    //设置密钥表文件
SigningTable refile:/etc/opendkim/SigningTable            //设置签名表文件
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts      //设置外部信任主机文件
InternalHosts refile:/etc/opendkim/TrustedHosts           //设置内部信任主机文件

#设置/etc/opendkim/KeyTable,文件中加入 daehub._domainkey.daehub.com daehub.com:daehub:/etc/opendkim/keys/daehub.private #设置/etc/opendkim/SigningTable,文件中加入 *@daehub.com daehub._domainkey.daehub.com #设置/etc/opendkim/TrustedHosts,文件加入 127.0.0.1 mail.daehub.com
daehub.com postfix同opendkim程序采用socket方式通信,采用设定的8891端口。故还需要配置postfix同opendkim协同工作,在postfix的main.cf配置文件中增加如下内容:

smtpd_milters = inet:127.0.0.1:8891            //设置通信端口
non_smtpd_milters = $smtpd_milters             //设置通信端口
milter_default_action = accept                 //设置行为

由于反垃圾系统可能会检测邮件的SPF信息和DKIM签名信息(如果有的话),SPF记录和DKIM签名是否正确,主要看DNS解析记录是否配置正确。SPF是Sender Policy Framework的缩写,SPF可以防止别人伪造你来发邮件,是一个反伪造性邮件的解决方案。当你定义了你的域名SPF记录之后,接收邮件方会根据你的SPF记录来确定连接过来的IP地址是否被包含在SPF记录里面,如果在,则认为是一封正确的邮件,否则认为是一封伪造的邮件。所以DNS的正确配置才是邮件能否成功发送的关键。 腾讯VPS提供了云解析功能,可以让用户配置自己域名的DNS解析信息。一般的邮件服务器需要配置MX记录和用于验证DKIM及SPF的TXT记录。由于MX记录配置规范要求其值对应于A记录,故需要为邮件服务器主机增加一条A记录。DKIM的记录值为此前生成myselector.txt的内容,SPF记录的TXT值为自己的IP地址信息。我自己主机 的DNS解析配置如下:

记录类型    主机记录          线路类型	记录值	                           MX优先级    TTL		
MX	   @	             默认	mail.daehub.com.                   10	     10分钟
TXT	   @	             默认	v=spf1 a mx ip4:123.206.60.79 ~all -	     10分钟
TXT	   daehub._domainkey 默认	v=DKIM1; k=rsa; s=email;p=MIG	   -	     10分钟
A	   mail	             默认	123.206.60.x	                   -         10分钟
A	   www	             默认	123.206.60.x	                   -	     10分钟

以上配置可以实现简单的MX解析和SPF及DKIM验证,腾讯云解析有详细的说明,实在看不懂,就照我这个配置也大概可以用。全部配置完成后,可以访问dkimcore.org/c/keycheck网站验证DKIM签名是否有效,也可以访问http://www.mail-tester.com发送测试邮件给它,对自己域名下的邮件进行评分。一般评分到6分左右,国内的主流邮箱就基本不会spam域名邮件了,如果分值较低,就只有一点点根据网站的提示修改自己服务器及DNS的配置了。注意DNS的修改可能不会马上体现,一般全球生效时间大概在48小时左右,可以多次测试,也可以用nslookup命令查询DNS记录信息。 邮件可以发送出去了,对方也可以收到了,现在就可以让WordPress发送自己域名的注册邮件了。由于我修改不来其程序代码,使用邮件发送功能时偶尔要出问题,于是使用了一个SMTP插件。既然本机就是邮件服务器,当然可以多增加SMTP认证功能,让SMTP插件使用。增加SMTP认证功能,大概有如下几个步骤:

  • 安装cyrus-sasl,cyrus-sasl-plain,cyrus-sasl-md5等软件
  • 启动saslauthd这个服务
  • 设置postfix的main.cf配置文件,让postfix可以与saslauthd通信
  • 用户端在寄信时设置邮件主机认证功能

所需要的软件采用yum方式安装,首先配置saslauthd服务的配置文件,由于自己用,简单为基本原则,就将其配置为本机用户账户认证方式vi /etc/sasl2/smtpd.conf,修改内容为:

log_level: 3 pwcheck_method: saslauthd 设置SMTP的验证程序 mech_list: plain login

配置完成后,需要修改postfix的配置文件令其支持SMTP认证。在main.cf文件中增加如下内容:

smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions =permit_mynetworks,permit_sasl_authenticated,
                              reject_unknown_sender_domain,
                              reject_unknown_recipient_domain,
                              reject_unauth_destination,
                              reject_rbl_client cbl.abuseat.org,
                              reject_rbl_client bl.spamcop.net,
                              reject_rbl_client cblless.anti-spam.org.cn,
                              reject_rbl_client sbl-xbl.spamhaus.org,
                              check_policy_service unix:/var/spool/postfix/postgrey/socket

 

postfix和saslauthd程序均配置完成后,便可以启动两个程序来为postfix增加SMTP认证功能。测试其是否启用的方法是telnet到本机的25端口,输入ehlo localhost命令输出邮件服务器信息。

telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.daehub.com ESMTP Postfix
ehlo localhost
250-mail.daehub.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

以上就是postfix的输出结果,可以看出其认证功能已经生效。

至此便完成了具有认证功能的postfix服务器,并且此服务器可以方便的为WordPress邮件插件所使用。由于我本人没有通过客户端收取邮件的需求,也就没有再继续搭建诸如dovecot这样的MRA服务器,发给服务器用户的邮件由postfix收下来后直接在服务器查看。

腾讯VPS搭建邮件服务器的过程如上所述,对于一些细节存在疑问的朋友可以留言提问,大家共同交流进步。

2 thoughts on “腾讯VPS CentOS系统搭建postfix邮件服务器”

发表评论

电子邮件地址不会被公开。 必填项已用*标注