一、部署DNS服務器(可查找DNS章節)
postfix根據域名和地址做一個MX記錄,A記錄,PTR記錄(一般在互聯網上郵件服務器都要反解,沒有PTR記錄會認為是垃圾郵件)
$ service iptables stop $ chkconfig iptables on $ setenforce 0 $ hostname mail.ywnds.com $ echo "127.0.0.1 mail.ywnds.com" >> /etc/hosts $ yum install bind bind-utils bind-libs
配置DNS
$ cat /etc/named.conf options { listen-on port 53 { any; }; directory "/var/named"; allow-query { any; }; recursion yes; { zone "ywnds.com" IN { type master; file "ywnds.com"; }; #include "/etc/named.root.key";
PS:添加和修改以上內容即可。
$ cat /var/named/ywnds.com $TTL 1D @ IN SOA ns.ywnds.com. root.ywnds.com. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum @ IN NS ns ns IN A 192.168.60.10 @ IN MX 10 smtp smtp IN A 192.168.60.10 pop3 IN A 192.168.60.10 mail IN A 192.168.60.10
$ service named restart $ chkeconfig named on
二、postfix主配置文件添加以下內容
postfix主配置文件進行模塊化了,其中:
/etc/postfix/main.cf:這個文件保存全局配置信息,所有進程都會用到,除非這些配置在 master.cf 文件中被重新設置了。
/etc/postfix/master.cf:這個文件保存了額外的進程運行時環境參數,在 main.cf 文件中定義的配置可能會被本文件的配置覆蓋掉。
在配置文件中所有的參數都必須頂格寫不然就會當做是上一行參數的續寫。另外postfix大部分配置文件都進行默認化處理了,可以使用postconf -d進行查看。
$cat /etc/postfix/main.cf inet_protocols = all inet_interfaces = 192.168.60.10,127.0.0.1 myhostname = mail.ywnds.com mydomain = ywnds.com myorigin = $mydomain mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain mynetworks = 127.0.0.0/8 message_size_limit = 20485760 mailbox_size_limit = 5097152000 show_user_unknown_table_name = no bounce_queue_lifetime = 1d maximal_queue_lifetime = 1d home_mailbox = Maildir/ #home_mailbox = Mailbox #mailbox_command = /some/where/procmail
參數解釋:
inet_protocols = all
#指定協議。
inet_interfaces = 192.168.60.10,127.0.0.1
#指定postfix系統監聽的網絡接口。
myhostname = mail.ywnds.com
#指定主機名。
mydomain = ywnds.com
#指定域名,默認情況下postfix將myhostname的第一部分刪除而作為mydomain的值。
myorigin = $mydomain
#用來自動補全本域用戶,用來指明發件人所在的域名,即做發件地址偽裝。
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
#這里定義了Postfix接收郵件時的收件人域名,即Postfix要接收哪些域名的郵件,不在此區域內的都算是中繼郵件,如果不加$mydomain的話那么就不允許收本域內郵件。
mynetworks = 127.0.0.0/8
#根據網絡地址中繼,默認給你所在的整個網絡中繼,postfix系統根據其值來區別用戶是遠程的還是本地的,這里設置只給本機中繼。
message_size_limit = 20485760
mailbox_size_limit = 5097152000
show_user_unknown_table_name = no
#郵件大小限制為20M,郵箱大小限制為5G。
bounce_queue_lifetime = 1d
maximal_queue_lifetime = 1d
#隊列超時限制為1天。
home_mailbox = Maildir/
home_mailbox = Mailbox
# 郵箱投遞方式有兩種:一種是Mailbox方式,即同一個用戶的所有郵件內容存儲為單個文件,通常保存在/var/spool/mail/目錄下文件名與用戶名相同(Postfix默認使用);第二種是Maildir方式,即使用目錄結構來存儲用戶的郵件內容每一個用戶使用一個文件夾,每封郵件都作為一個獨立的文件存放。Maildir方式的存取速度和效率要好一些對於管理郵件內容頁更加方便。
mailbox_command = /some/where/procmail
#這里可以配置MDA使用procmail方式(postfix默認的投遞代理)。
注意問題:
1、在postfix的配置文件中,參數行和注釋行是不能處在同一行中的;
2、任何一個參數的值都不需要加引號,否則,引號將會被當作參數值的一部分來使用;
3、每修改參數及其值后執行 postfix reload 即可令其生效;但若修改了inet_interfaces,則需重新啟動postfix;
4、如果一個參數的值有多個,可以將它們放在不同的行中,只需要在其后的每個行前多置一個空格即可;postfix會把第一個字符為空格或tab的文本行視為上一行的延續;
三、SMTP協議發送郵件命令
SMTP狀態碼:
1xx:純信息
2xx:正確
3xx:上一步操作尚未完成,需要繼續補充
4xx:暫時性錯誤
5xx:永久性錯誤
SMTP協議非常簡單,簡單到允許任何用戶發送郵件同時也允許發送到任何用戶。在發件人(MAIL FROM)哪里可以隨意指定地址。但是收件人(RCPT TO)可以發給本域內用戶也可以通過中繼發送給其他域用戶。如163或QQ郵箱。但是一般公網郵箱都是需要進行發件人域名反向解析,如果能解析就接收郵件,不能解析就丟失郵件。如果全部解析就有點太苛刻了,也可以針對部分域名進行解析。不信你可以把發件人改為xxx@taobao.com試試你的收件人還能不能收到郵件。(如果輸入錯誤信息可以按Ctrl加退格鍵即可)
Postfix默認允許本機和本機所在網絡的所有主機都允許中繼,所以可以發給其他域郵件。但是由於我們上面是用來了指令“mynetworks = 127.0.0.0/8”表示只給本機中繼。所以其他主機是無法發送郵件給其他域的,如下圖:
注意:127.0.0.1跟192.168.60.10雖然都能訪問本機,但它們兩的意義不同,127.0.0.1是在本機內部,而192.168.60.10是通過網卡的。另外查看郵件服務器的日志信息在/var/log/maillog
四、創建兩個郵箱測試用戶並給密碼(密碼也同用戶名)
$ useradd -s /sbin/nologin openstack $ useradd -s /sbin/nologin hadoop
五、郵件別名
郵件別名可以把發送給一個用戶的郵件轉給另外一個用戶,可以在/etc/aliases文件中可以定義用戶別名格式如下:
Openstack: root
表示所有發給Openstack用戶的郵件,都發送給root用戶。但是Postfix不會使用這個文件因為在文本文件中檢索太慢了,所以需要通過hash編碼轉換為另外一種格式/etc/aliases.db(postfix支持hash格式),而newaliases命令就可以進行它們之間的相互轉碼的,直接執行命令newaliases即可。
六、郵件隊列
Postfix 維護兩個隊列:未決郵件隊列(pending mails queue)和等待郵件隊列(deferred mail queue)。等待隊列包含了暫時發送失敗、需要重新發送的郵件,Postfix 會定期重發(默認5分鍾,可自定義設置)。
其實 Postfix 維護5個隊列:
輸入隊列,郵件進入Postfix系統的第一站;
活動隊列,qmgr 將輸入隊列的郵件移到活動隊列;
等待隊列,保存暫時不能發送出去的郵件;
故障隊列,保存受損或無法解讀的郵件;
保留隊列,將郵件無限期留在 Postfix 隊列系統中;
列出郵件隊列
$ postqueue -p
刪除所有隊列郵件
$ postsuper -d ALL deferred
刪除所有郵件
$ postsuper -d ALL
PS:發送一份郵件一般也可使用tail /var/log/maillog查看郵件隊列日志信息,如“status=sent”表示郵件發送成功,而“status=deferred”表示郵件在等待隊列。