一、前言
继写下《PHP下利用PHPMailer配合QQ邮箱下的域名邮箱发送邮件》一文已有一年之久,随着时间的流逝,此文中的一些解决方案逐渐暴露出了一个限制性问题,也就是通过smtp连接QQ邮箱下的域名邮箱发送邮件会有频率限制,而在实际应用中需要向用户发送验证邮件的时间段并不是均衡分布的,这就会导致某些高峰期通过上述方案发送邮件是会失败的。用户对服务可用性是零容忍的,比如前两天的携程全线宕机。
安装postfix邮件系统的目的不同,其配置方案也会不同,网上已有的配置postfix邮件系统大多并未明确其目的,或照搬转载,原始文章中的一些笔误也导致了很多错误内容大范围的传播并误导后来者。当然我也只是一只菜鸟,但本着实践之出真知的态度,鄙人会尽可能的完善一些基础性的内容,并用最通俗易懂的语言来解释;虽然通俗会显得不专业,但据本人的体会,很多网络上的知识看不懂或理解不了就是不够通俗、不够形象导致的。本文是基于鄙人在生产环境下搭建用于发送账户验证邮件的postfix而来。
二、配置postfix的目的
开始之前,先介绍几个枯燥的名词:
MUA:用户代理端,即用户使用的写信、收信客户端软件。比如:outlook、foxmail等客户端软件,乃至通过浏览器登录邮箱并发送邮件的BS架构网页也算是MUA。
MTA:邮件传送端,即常说的邮件服务器,用于转发、收取用户邮件。本文之中的postfix实现的就是MTA,当然postfix也是一种特殊的MUA,不再深入介绍,本文之中仅把postfix当做MTA使用。
SMTP:简单邮件传送协议,MUA连接MTA或MTA连接MTA发送邮件使用此协议,通信端口25,启用ssl/tls的情况下端口为465或587。
一般发邮件的步骤流程是:
1、MUA通过POP、IMAP或SMTP协议连接MTA(称之为mta1);本文之中PHP通过PHPmailer请求发送邮件的PHP脚本就扮演了MUA的角色,而postfix就是MTA;
2、MUA发送邮件给mta1(或者说MUA通过mta1发送邮件);本文中postfix就是这个mta1;
3、mta1与其他的MTA自主沟通连接将邮件传送至指定域下的指定用户(此时mta1就扮演了MUA的角色功能,这种交互是由邮件系统软件自主实现,与用户端无关)。
本次搭建postfix目的很明确:
用于PHP开发的web环境下新用户注册时发送验证码邮件---PHP下通过PHPmailer类库的smtp协议链接postfix来发送邮件。
web环境与postfix在同一台CentOs6.5(64位)系统下,postfix不对外提供smtp亦不转发外部MUA邮件,仅转发(或发送)web环境下(MUA)的邮件,也就是仅转发本机(或者说本域)邮件。同时也不接收其他MTA的邮件(也就是说不接受他人发过来的邮件)。
本文就不介绍postfix、sasldb2、saslauthd等软件了,网上一大把。
本文配置postfix的目的通俗的讲就是:本机PHP脚本(MUA)通过smtp协议连接本机postfix(MTA),发送邮件到指定邮箱;本机postfix不转发(或发送)其他MUA的邮件,也不接收其他MTA转过来(发送过来)的邮件(也就是说本机postfix下的邮箱不接收邮件)。或这么讲:本机postfix启用smtp服务,但不对公网开放25端口;既然有smtp就会有账号和密码,postfix可以用centos系统的账户和密码,但这种方式总觉得不安全,所以启用sasldb2提供postfix的smtp虚拟账户和密码---这样即简洁也是postfix开发组推荐的方式。
三、postfix的安装
centos6.5默认自带postfix,便于说明,有些系统mail服务默认为sendmail,渣渣不理它也卸载掉,并更改服务器的mta:
- @H_301_74@#1 #开始yum安装前更换yum源建议aliyun源参考:http://blog.jjonline.cn/linux/171.html #备份原先的yum源信息 mv/etc/yum.repos.d/CentOS-Base.repo/etc/yum.repos.d/CentOS-Base.repo.backup #从阿里云镜像站下载centos6的repo wget-O/etc/yum.repos.d/CentOS-Base.repohttp://mirrors.aliyun.com/repo/Centos-6.repo #最后yum重新生成缓存 yummakecache yumremovesendmail#卸载sendmail yumremmovepostfix#卸载postfix yuminstallpostfix#重新安装postfix #yum安装会自动建立postfix用户组和用户名 yuminstallcrontabs#因为卸载postfix的时候系统定时服务也被卸载核心服务也同步安装下
需要注意的是,卸载postfix会同步卸载掉定时服务crontabs,务必在卸载后重新安装。
安装sasldb、saslauthd
@H_502_88@postfix开机启动设置,因为采用sasldb2提供postfix的smtp账户和密码,无需saslauthd服务运行,故而saslauthd服务不用启动---看吧,使用sasldb2还减少资源占用:
@H_301_74@#3 chckconfigpostfixon这样postfix就安装完毕,简单吧,写详细了都显得不专业了
四、postfix配置并启用smtp
postfix配置文件在/etc/postfix目录下,主要修改的配置文件为:/etc/postfix/main.cf,配置说明详见代码段:
@H_502_88@查看postfix配置文件的所有配置项:
@H_301_74@#5 postconf#不带任何命令参数即可输出所有postfix配置项以及默认值五、sasldb2建立smtp用户和密码
某种意义上来讲:smtp的账户密码建立也就是建立邮箱账户(类似jjonline@jjonline.cn的邮箱地址)。
@H_301_74@#6 #配置postfix启用sasldb2作为smtp的账号秘密效验方式 #编辑通过sasl启用smtp账号密码效验的配置 vi/etc/sasl2/smtpd.conf#vi写入或编辑内容如下: ##### pwcheck_method:auxprop auxprop_plugin:sasldb mech_list:plainloginCRAM-MD5DIGEST-MD5 ##### #这里需要注意的是:这个配置文件的位置是64位机器上的,32位机器应该在:/usr/lib/sasl2/smtpd.conf #创建smtp账号 saslpasswd2-c-u`postconf-hmydomain`test#回车会要求输入密码,连续两次 #表示创建test@$mydomain的邮箱账号(也是smtp的账号)和密码 #本例就是创建test@jjonline.com.cn账号和密码 #此处注意的是smtp登录用的账号并不是单纯的用户名而是整个邮箱地址字符串 #假设此处设置的smtp账号test@jjonline.com.cn密码为test123下方测试时要用到 #查看sasldb2的用户和密码 sasldblistusers2 #此命令进用户查看sasldb的用户情况 #此命令回车后会输出诸如这样的内容:test@jjonline.com.cn:userPassword #每次添加smtp用户完毕之后需重启postfix或reload测试postfix配置文件并启动postfix
@H_502_88@六、测试smtp
直接本机telnet,上述添加的test@jjonline.com.cn账号和test123密码需要base64编码,编码后的字符串为:
test@jjonline.com.cn为:dGVzdEBqam9ubGluZS5jb20uY24=
test123为:dGVzdDEyMw==
telnet测试时需要用到,base64编码太简单就不多做解释,例如PHP的函数base64_encode()
@H_502_88@自此,自建postfix并启用smtp和smtp的虚拟账号完成;以上所有过程鄙人均亲自试验。当然还有许多关于postfix的配置并未列出或说明,这些将在以后鄙人遇到之后再行讲解。
七、域名解析记录设置
postfix配置完毕,想要通过这台postfis邮件服务器发送的邮件被其他邮箱服务商所接受,还需要做A记录、txt记录还mx记录,请适配你自己的域名和ip地址。截图如下:
参考资料:
http://www.postfix.org/documentation.html
http://www.sunjianhe.com/?p=659
http://blog.csdn.net/zhangxinrun/article/details/5725235
http://blog.csdn.net/ikscher/article/details/9084313
http://www.cnblogs.com/rootq/articles/1320266.html
转自:http://blog.jjonline.cn/linux/185.html