一前言

本來使用qq郵箱發(fā)送郵件,然后借助sendEmail來發(fā)送郵件告警,但是有每天的200封限制,很是不爽,于是想到來自己搭建郵件服務(wù)器來解決這個問題,關(guān)于使用sendEmail來借助qq郵箱來發(fā)送郵件詳見http://www.cnblogs.com/Dicky-Zhang/p/5982973.html,在做這個之前,在網(wǎng)上查找了很多資料,發(fā)現(xiàn)很是混亂,不成一體,拼拼湊湊,根本無法使用,所以記錄下來,方便后來人使用。

在做postfix之前,我成功搭建了iredmail,一個強大的開源系統(tǒng)。稍后會另外一篇文章來寫下過程,供大家參考。

說明下

關(guān)于阿里云做郵件系統(tǒng)的問題,阿里云對25端口做了限制,即使你做好了,在第三方服務(wù)器上可能都無法使用,在本機上我做好了,都無法使用。對于青云系統(tǒng),默認是沒有對外開放25端口,這里的對外開放不是服務(wù)器里面,你需要在后臺去開放25端口,不然你在外部服務(wù)器去連接這臺做好的服務(wù)器的時候會提示超時,對于國外的服務(wù)器我倒是沒測試,我認為應(yīng)該不會做限制。好了,不多說了,開始正題

解釋幾個名詞

  • MUA:用戶代理端,即用戶使用的寫信、收信客戶端軟件。比如:outlook、foxmail等客戶端軟件,乃至通過瀏覽器登錄郵箱并發(fā)送郵件的BS架構(gòu)網(wǎng)頁也算是MUA。
  • MTA:郵件傳送端,即常說的郵件服務(wù)器,用于轉(zhuǎn)發(fā)、收取用戶郵件。本文之中的postfix實現(xiàn)的就是MTA,當然postfix也是一種特殊的MUA,不再深入介紹,本文之中僅把postfix當做MTA使用。
  • MDA:郵件代理端,相當于MUA和MTA的中間人,可用于過濾垃圾郵件。
  • POP:郵局協(xié)議,當前是第三版,也就是POP3,用于MUA連接服務(wù)器收取用戶郵件,通信端口110。
  • IMAP:互聯(lián)網(wǎng)應(yīng)用協(xié)議,功能與POP類似:也用于MUA連接服務(wù)器收取用戶郵件;功能較POP多,通信端口143。
  • SMTP:簡單郵件傳送協(xié)議,MUA連接MTA或MTA連接MTA發(fā)送郵件使用此協(xié)議,通信端口25,啟用ssl/tls的情況下端口為465或587。

一般發(fā)郵件的步驟流程是:

1、MUA通過POP、IMAP或SMTP協(xié)議連接MTA(稱之為mta1);本文之中php通過phpmailer請求發(fā)送郵件的php腳本就扮演了MUA的角色,而postfix就是MTA;

2、MUA發(fā)送郵件給mta1(或者說MUA通過mta1發(fā)送郵件);本文中postfix就是這個mta1;

3、mta1與其他的MTA自主溝通連接將郵件傳送至指定域下的指定用戶(此時mta1就扮演了MUA的角色功能,這種交互是由郵件系統(tǒng)軟件自主實現(xiàn),與用戶端無關(guān))。

本次搭建postfix目的很明確:

  • 用于php開發(fā)的web環(huán)境下新用戶注冊時發(fā)送驗證碼郵件---php下通過phpmailer類庫的smtp協(xié)議鏈接postfix來發(fā)送郵件。
  • web環(huán)境與postfix在同一臺CentOs6.5(64位)系統(tǒng)下,postfix不對外提供smtp亦不轉(zhuǎn)發(fā)外部MUA郵件,僅轉(zhuǎn)發(fā)(或發(fā)送)web環(huán)境下(MUA)的郵件,也就是僅轉(zhuǎn)發(fā)本機(或者說本域)郵件。同時也不接收其他MTA的郵件(也就是說不接受他人發(fā)過來的郵件)。
  • 本文就不介紹postfix、sasldb2、saslauthd等軟件了,網(wǎng)上一大把

 二 postfix的安裝

1 yum remove sendmail #卸載sendmail 2 yum remmove postfix #卸載postfix 3 yum install postfix #重新安裝postfix 4 #yum安裝會自動建立postfix用戶組和用戶名 5 yum install crontabs #因為卸載postfix的時候系統(tǒng)定時服務(wù)也被卸載 核心服務(wù) 也同步安裝

使用sasldb、saslauthd來生成smtp虛擬賬號

安裝

復制代碼
 1 yum install cyrus-sasl* #提供smtp的虛擬賬戶和密碼服務(wù)  2 #sasldb2包含在saslauthd當中 就不要再問為什么沒有安裝sasldb2的shell代碼了  3 #當前mta查看  4 alternatives --display mta  5 #設(shè)置mta  6 /usr/sbin/alternatives --set mta /usr/sbin/sendmail.postfix  7 #再次查看mta  8 alternatives --display mta  9 #輸出結(jié)果最后一行會有類似如下的提示:mta即設(shè)置完畢 10 #Current `best' version is /usr/sbin/sendmail.postfix.
復制代碼

postfix開機啟動設(shè)置,因為采用sasldb2提供postfix的smtp賬戶和密碼,無需saslauthd服務(wù)運行,故而saslauthd服務(wù)不用啟動,使用sasldb2還減少資源占用:

 1 chkconfig postfix on 

三 postfix配置并啟用smtp

postfix配置文件在/etc/postfix目錄下,主要修改的配置文件為:/etc/postfix/main.cf,配置說明詳見代碼段

復制代碼
 1 vi /etc/postfix/main.cf #vi編輯postfix配置文件  2 #找到如下配置項酌情修改  3 ######  4 myhostname = mail.xxx.com.cn  5 #postfix主機名,修改成你的域名 此項需要添加A記錄并指向postfix所在主機公網(wǎng)IP  6 mydomain   = xxx.com.cn  7 #域名  8 myorigin   = $mydomain  9 #本機postfix的郵箱域名后最 此項默認值使用myhostname 10 #此處使用了前項mydomain 也就是說本機postfix郵箱后綴為:@xxx.com.cn 11 inet_interfaces = all 12 #指定postfix系統(tǒng)監(jiān)聽的網(wǎng)絡(luò)接口 此處必須是localhost或127.0.0.1或內(nèi)網(wǎng)ip 13 #若注釋或填入公網(wǎng)ip  服務(wù)器的25端口將對公網(wǎng)開放 14 #默認值為all 即監(jiān)聽所有網(wǎng)絡(luò)接口 15 #此項指定localhost后 本機postfix就只能發(fā)郵件不能接收郵件 16 inet_protocols = ipv4 17 #網(wǎng)絡(luò)協(xié)議 ipv6在國內(nèi)還不怎么普及 這里ipv4即可 18 mydestination = $myhostname, localhost.$mydomain, localhost 19 #指定postfix接收郵件時收件人的域名,換句話說,也就是你的postfix系統(tǒng)要接收什么樣的郵件。 20 #此項配置中$myhostname表示postfix接受@$myhostname為后綴的郵箱的郵件 逗號分割支持指多項 21 #此項默認值使用myhostname 22 local_recipient_maps = 23 #此項制定接收郵件的規(guī)則 可以是hash文件 此項對本次配置無意義 可以直接注釋 24 mynetworks = x.x.x.x 25 #指定你所在的網(wǎng)絡(luò)的網(wǎng)絡(luò)地址 26 #最好加上你要在第三方上使用的服務(wù)器,不加的話可能無法使用在第三方上面 27 #請依據(jù)實際情況修改 28 smtpd_banner = JJonline.Cn ESMTP Server 29 #指定MUA通過smtp連接postfix時返回的header頭信息 30 #原始配置附帶有postfix版本號 去掉即可,此項酌情處理 31 #SMTP Config 32 broken_sasl_auth_clients = yes 33 #指定postfix兼容MUA使用不規(guī)則的smtp協(xié)議--主要針對老版本的outlook  此項對于本次配置無意義 34 smtpd_client_restrictions = permit_sasl_authenticated 35 #指定可以向postfix發(fā)起SMTP連接的客戶端的主機名或ip地址 36 #此處permit_sasl_authenticated意思是允許通過sasl認證(也就是smtp鏈接時通過了賬號、密碼效驗的用戶)的所有用戶 37 smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination 38 #發(fā)件人在執(zhí)行RCPT TO命令時提供的地址進行限制規(guī)則  此處照搬復制即可 39 smtpd_sasl_auth_enable = yes 40 #指定postfix使用sasl驗證 通俗的將就是啟用smtp并要求進行賬號、密碼效驗 41 smtpd_sasl_local_domain = $mydomain 42 #指定SMTP認證的本地域名  本次配置可以使用 smtpd_sasl_local_domain = '' 或干脆注釋掉 默認為空 43 smtpd_sasl_security_options = noanonymous 44 #取消smtp的匿名登錄  此項默認值為noanonymous smtp若能匿名登錄危害非常大 此項請務(wù)必指定為noanonymous 45 message_size_limit = 5242880 46 #指定通過postfix發(fā)送郵件的體積大小 此處表示5M 47 ######
復制代碼

查看postfix配置文件的所有配置項:

1 postconf #不帶任何命令參數(shù) 即可輸出所有postfix配置項以及默認值

postconf #不帶任何命令參數(shù) 即可輸出所有postfix配置項以及默認值

四sasldb2建立smtp用戶和密碼

某種意義上來講:smtp的賬戶密碼建立也就是建立郵箱賬戶

復制代碼
#配置postfix啟用sasldb2作為smtp的賬號秘密效驗方式
#編輯通過sasl啟用smtp賬號密碼效驗的配置
vi /etc/sasl2/smtpd.conf #vi寫入或編輯內(nèi)容如下:
#####
pwcheck_method: auxprop
auxprop_plugin: sasldb
mech_list: plain login CRAM-MD5 DIGEST-MD5
#####
#這里需要注意的是:這個配置文件的位置是64位機器上的,32位機器應(yīng)該在:/usr/lib/sasl2/smtpd.conf
 
#創(chuàng)建smtp賬號
saslpasswd2 -c -u `postconf -h mydomain` test #回車會要求輸入密碼,連續(xù)兩次
#表示創(chuàng)建test@$mydomain的郵箱賬號(也是smtp的賬號)和密碼
#本例就是創(chuàng)建test@xxx.com.cn賬號和密碼
#此處注意的是smtp登錄用的賬號并不是單純的用戶名  而是整個郵箱地址字符串
#假設(shè)此處設(shè)置的smtp賬號test@xxx.com.cn密碼為test123  下方測試時要用到
 
#查看sasldb2的用戶和密碼
sasldblistusers2
#此命令進用戶查看sasldb的用戶情況
#此命令回車后會輸出諸如這樣的內(nèi)容:test@xxx.com.cn: userPassword
 
#每次添加smtp用戶完畢之后需重啟postfix或reload
復制代碼

測試postfix配置文件并啟動postfix

View Code

五 測試smtp

直接本機telnet,上述添加的test@xxx.com.cn賬號和test123密碼需要base64編碼,編碼后的字符串為:

執(zhí)行編碼語句:

用戶名:perl -e 'use MIME::Base64; print encode_base64("test")'

dGVzdA==

密碼:perl -e 'use MIME::Base64; print encode_base64("test123")'

dGVzdDEyMw==

telnet測試:

在本機上測試:

telnet  localhost  25

復制代碼
 1 #若沒安裝telnet 需安裝telnet  2 yum install telnet  3  4 #telnet測試smtp連接postfix  5 telnet 127.0.0.1 25 #回車后會顯示由$smtpd_banner配置的歡迎信息  6 EHLO jjonline  #輸入ehlo消息頭進行握手 消息返回后繼續(xù)  7 AUTH LOGIN  #要求進行smtp賬號密碼效驗  8 返回后輸入test的base64編碼,是test而不是test@xxx.com.cn  9  #返回后輸入test123密碼的編碼 也是base64編碼 10  #回車后就會顯示smtp效驗成功  接下來還可以測試發(fā)送郵件功能 本文就不再做示例了 11 12 #注意  要退出telnet 輸入quit回車即可
復制代碼

自此,自建postfix并啟用smtp和smtp的虛擬賬號完成、

說明一點:

想在第三方上邊使用的話,你可以先測試下在第三方服務(wù)器上面,還是telent mail.xx.com(你的郵件服務(wù)器),和上邊基本一樣,如果測試通過,基本就可以在第三方使用了。如果配置都正確,但是測試有問題,telnet超時,這時候請你聯(lián)系你的空間商,讓他放行25端口。

六 域名解析記錄設(shè)置

postfix配置完畢,想要通過這臺postfis郵件服務(wù)器發(fā)送的郵件被其他郵箱服務(wù)商所接受,還需要做A記錄、txt記錄還mx記錄,請適配你自己的域名和ip地址

 七在第三方服務(wù)器上面使用

1,使用sendEmail來發(fā)送郵件

用法詳見:http://www.cnblogs.com/Dicky-Zhang/p/5982973.html

我簡單說點:

和使用qq的有點不一樣,在這里是直接輸入用戶名和密碼,不是編碼后的用戶名和密碼

2,使用mail或者mailx來來調(diào)用郵件服務(wù)器發(fā)送郵件

需要安裝postmail或者sendmail服務(wù),安裝方法比較簡單,yum就可以了

一些配置如下:

復制代碼
打開配置文件 vim /etc/mail.rc
在最后邊添加指定 set from=xxx@xxx.com  (發(fā)件人) set smtp=mail.xxx.com  (郵件服務(wù)器) set smtp-auth-user="xxxx" (用戶名) set smtp-auth-password="123456"(密碼) set smtp-auth=login

用戶名密碼不需要編碼
保存重啟服務(wù) 
復制代碼

下面就是測試了,關(guān)于mail,mailx用法,點這里http://www.cnblogs.com/Dicky-Zhang/p/6085212.html

八關(guān)于白名單問題

我是習慣網(wǎng)qq郵箱里面發(fā)郵件,所以要注意設(shè)置白名單,自建郵件服務(wù)器很可能被當做垃圾郵件,被放到垃圾郵箱了,所以我們需要設(shè)置白名單

打開qq郵箱

然后

這樣的話我們就可以時時刻刻收到我們的郵件啦