Linux Postfix

原文地址:html

https://www.cnblogs.com/hello-sky/articles/4532496.htmlc++

1. 電子郵件系統基礎vim

在平常工做和生活中,發送和收取電子郵件已成爲人們相互溝通的常見方式。對於國內的許多用戶來講,大多會註冊使用新浪、網易、Hotmail、Gmail等Web界面的電子郵箱,這些郵箱都是IT服務商提供的免費郵箱服務,在郵箱空間,功能等方面會有所限制。api

如今更多的企業和機構要求員工使用公司自有的電子郵件系統,經過客戶端軟件直接與郵件服務器進行通訊,以得到更好的通訊效率,以及安全、功能方面的保障。安全

 

1.1 郵件系統角色、郵件協議服務器

Internet網絡中的電子郵件系統並非一個孤立的體系。除了須要DNS服務器提供郵件域的解析,經過Web服務器提供郵箱操做界面之外,郵件收取、傳遞等功能也是由不一樣的組件來提供的。網絡

 

1.郵件系統的角色架構

在實現電子郵件收發的完整系統中,根據各組件所處的位置,承擔的功能不一樣,能夠分爲不一樣的角色。dom

➣   MTA(Mail Transfer Agent,郵件傳輸代理):通常被稱爲郵件服務器軟件。MTA軟件負責接收客戶端軟件發送的郵件,並將郵件傳輸給其餘的MTA程序,是電子郵件系統中的核心部分。Exchange和Sendmail,Postfix等服務器軟件都屬於MTA。tcp

➣   MUA(Mail User Agent,郵件用戶代理): 通常被稱爲郵件客戶端軟件。MUA軟件的功能是爲用戶提供發送、接收和管理電子郵件的界面。在Windows平臺中使用的MUA軟件包括Outlook  Express,Outlook、Foxmail等,在Linux平臺中經常使用的MUA軟件包括Thunderbird,Kmail,Evolution等。

➣   MDA(Mail Delivery Agent郵件分發代理):MDA軟件負責在服務器中將郵件分發到用戶的郵箱目錄。MDA軟件相對比較特殊,它並不直接面向郵件用戶,而是在後臺默默地工做。有時候MDA的功能能夠直接集成在MTA軟件中,所以常常被忽略。

經過郵件系統中的角色劃分能夠看出電子郵件系統與其餘C/S(Client/Server,客戶端服務器)模式的網絡應用同樣,包括獨立的客戶端和服務器端軟件。

 

2.郵件通訊協議

在電子郵件通訊過程當中郵件傳遞,收取是最基本的兩個功能,應用於不一樣角色的軟件之間。其中最經常使用的二種郵件協議以下所述。

➣   SMTP(Simple Mail Transfer Protocol,簡單郵件傳輸協議):主要用於發送和傳輸郵件。MUA使用SMTP協議將郵件發送到MTA服務器中

,而MTA將郵件傳輸給其餘MTA服務器時一樣也使用SMTP協議。SMTP協議使用的TCP 25號端口,對於支持發信認證的郵件服務器,將會採用擴展的SMTP協議(Extended SMTP)。

➣   POP(Post Office Protocol,郵局協議):主要用於從郵件服務器中收取郵件。目前POP協議的最新版本是POP3。大多數MUA 軟件都支持使用POP3協議,所以該協議應用最爲普遍。POP3協議使用TCP 110端口(不支持在線,要先下載到本地)。

➣   IMAP(Internet Message Access Protocol,互聯網消息訪問協議):一樣用於收取郵件。目前IMAP協議的最新版本是IMAP4。與POP3相比較IMAP4協議提供靈活和強大的郵件收取,郵件管理功能。IMAP4協議使用的TCP 143端口(支持先看再存)。

只有電子郵件客戶端和服務器同時支持SMTP和POP/IMAP協議纔可以實現完整的郵件發送和收取功能。

 

1.2 常見的郵件服務器軟件

當用戶在享受電子郵件帶來的便利的時候,每每看到的只是郵件系統的」品牌「,而忽視了郵件系統的」幕後英雄「——郵件服務器軟件。例如使用163郵箱的用戶可能並無想過,網易公司的郵件服務器是使用什麼軟件搭建的。然而對於企業郵件系統的管理員來講,則必須熟練掌握郵件服務器軟件的配置和管理。

郵件服務器軟件種類不是不少,常見的主要包括如下幾種。

 

1.商業郵件系統

➣   Exchange:Windows系統中最著名的郵件服務器軟件,也是微軟公司的重量級產品,能夠與活動目錄等應用很好地結合在一塊兒。當使用Windows服務器平臺構建電子郵件系統時Excharge天然就成爲首選。

➣   Notes/Domino由IBM公司出品的商業電子郵件和辦公協做軟件產品,其功能豐富,強大集成性較好且提供跨系統平臺的支持,給用戶提供了普遍的選擇。多應用於一些高校政府部門,銀行等較大型的企業單位。

 

2. 開源郵件系統

➣   Sendmail:對於運行在UNIX/Linux環境中的郵件服務器,Sendmail無疑是資格最老的,目前仍然有許多企業的電子郵件系統是使用Sendmail進行搭建的。Sendmail運行的穩定性較好,但安全性欠佳。

➣   Qmail:另外一款運行在UNIX/Linux環境中的郵件服務器,比Sendmail具備更好的執行效率且配置,管理更加方便,不少商用電子郵件系統都採用Qmail做爲服務器。

➣   Postfix:一樣是運行在UNIX/Linux環境中的郵件服務器,Postfix由Wietse負責開發,其目的是爲Sendmail提供一個更好的替代產品。Postfix在投遞效率穩定性,服務性能及安全性方面都有至關出色的表現。

 

2. Postfix郵件服務基礎

Postfix郵件服務器採用了模塊化的設計,由許多個不一樣的程序集合而成,分別用於實現不一樣的功能。Postfix在啓動時首先啓動名爲master的進程,由master進程主導郵件的處理工做,並在須要時自動加載其餘程序以協同工做。

本節主要介紹Postfix的編譯安裝過程,服務控制以及主要目錄和配置文件。

 

2.1 編譯安裝及服務控制

本節將以源碼包postfix-2.8.2.tar.gz爲例,講解Postfix服務的編譯安裝過程務、控制方法。從其官方網站http://www.postfix.org中能夠獲取最新的源碼包。

 

1.準備工做

爲了不發生端口衝突、程序衝突等現象,應將系統自帶的sendmail服務停用,並將默認啓動狀態設爲關閉。因爲Postfix系統兼容並沿用了Sendmail的部分設置,所以建議保留Sendmail軟件包,而不是直接卸載。

[root@mail ~]# /etc/init.d/sendmail stop

[root@mail ~]# chkconfig --level 2345 sendmail off

 

除此之外,因在下一章中須要Postfix支持SASL認證(經過軟件包cyrus-sasl) ,因此應確認已安裝好相關軟件包。

[root@mail ~]# rpm -qa | grep cyrus

cyrus-sasl-plain-2.1.23-13.el6_3.1.x86_64

cyrus-sasl-lib-2.1.23-13.el6_3.1.x86_64

cyrus-sasl-md5-2.1.23-13.el6_3.1.x86_64

cyrus-sasl-gssapi-2.1.23-13.el6_3.1.x86_64

cyrus-sasl-2.1.23-13.el6_3.1.x86_64

 

2.源碼編譯及安裝

1)建立運行組,用戶

爲了增強郵件服務的權限控制,須要建立專門的運行組帳號postfix和postdrop,以及用戶帳號postfix。運行用戶不須要直接登陸到系統也無需建立宿主文件夾。

[root@mail ~]# groupadd -g 1200 postdrop

[root@mail ~]# groupadd -g 1000 postfix

[root@mail ~]# useradd -M -u 1000 -g postfix -G postdrop -s /sbin/nologin postfix

 

2)解包

將下載的postfix源碼包解壓,釋放到/usr/src/目錄下,並切換到展開後的源碼目錄。

[root@mail home]# tar zxf postfix-2.8.2.tar.gz -C /usr/src/

[root@mail home]# cd /usr/src/postfix-2.8.2/

 

3)配置

Postfix軟件包的配置步驟使用「make makefiles「進行,具體配置選項能夠參考源碼目錄中README_FILES/文件夾下的說明文件。例如,若要使Postfix支持發信認證可參考文件SASL_README中的相關信息。

[root@mail postfix-2.8.2]# yum -y install gcc-c++

[root@mail postfix-2.8.2]# yum -y install db*-devel

[root@mail postfix-2.8.2]# yum -y install cyrus-sasl-*

[root@mail postfix-2.8.2]# make makefiles 'CCARGS=-DUSE_SASL_AUTH  -DUSE_CYRUS_SASL -I/usr/include/sasl'  'AUXLIBS=-L/usr/lib/sasl2  -lsasl2'

 

其中編譯參數CCARGS和AUXLIBS的做用以下。

➣   CCARGS參數:爲編譯器提供額外的擴展參數。例如,啓用SASL認證,並指出cyrus-sasl認證程序的頭文件位於/usr/include/sasl/。

➣   AUXLIBS參數:爲編譯器指出位於標準位置以外的額外函數庫。例如,cyrus-sasl 認證程序的庫文件位於/usr/lib/sasl2/。

 

4)編譯並安裝

[root@mail postfix-2.8.2]# make

[root@mail postfix-2.8.2]# make install

執行make install命令之後,最後階段會須要設置一些安裝參數,通常直接「按回車」鍵接受默認或自動識別的配置便可。完成安裝之後,應執行postconf-a命令檢查所支持的認證方式,若輸出結果中未包含「cyrus「則應檢查配置步驟,糾正錯誤後從新進行配置,編譯並安裝。

[root@mail postfix-2.8.2]# postconf -a

cyrus           <==支持cyrus認證

dovecot        <==支持dovecot認證

 

3.postfix服務控制

Postfix郵件系統的控制主要經過/usr/sbin/postfix命令進行,結合start、stop、check、reload選項分別實現啓動、中止、檢查、重載服務的操做。例如,若要啓動postfix郵件服務,並驗證服務狀態,能夠執行如下操做。

[root@mail ~]# postfix start

postfix/postfix-script: fatal: the Postfix mail system is already running

[root@mail ~]# postfix status

postfix/postfix-script: the Postfix mail system is running: PID: 2289

 須要注意的是,實際監聽服務的進程名並非postfix,而是master。

[root@mail ~]# netstat -anpt | grep ":25"

tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      2289/master         

tcp        0      0 ::1:25                      :::*                        LISTEN      2289/master

 

當從新調整郵件服務配置之後能夠通道check選項進行基本的語法檢查,檢查無誤後再經過reload選項來重載服務。

[root@mail ~]# postfix check <==配置無誤,則無輸出信息

[root@mail ~]# postfix reload

postfix/postfix-scriptrefreshing the Postfix mail system

 

2.2主要目錄和配置文件

安裝好postfix軟件之後,最好對相關的目錄和配置文件有所瞭解,這樣將有助於對Postfix服務器的進一步配置和使用。

 

1. 主要目錄

➣   /etc/postfix:包括Postfix服務的主配置文件,各種腳本,查詢表等。

➣   /usr/libexec/postfix/:包括Postfix服務的各個服務器程序文件。

➣   /var/spool/postfix/:包括Postfix服務的郵件隊列相關的子目錄,每一個隊列子目錄用於保存不一樣的郵件。常見的幾個子目錄及用途以下所述。

◆   incoming (傳入) :存放剛接收到的郵件。

◆   active(活動):存放正在投遞的郵件。

◆   deferred(推遲):存放之前投遞失敗的郵件。

◆   hold(約束):存放被阻止發送的郵件。

◆   corrupt(錯誤):存放不可讀或不可分析的郵件。

➣   /usr/sbin/:包括Postfix服務的各類管理工具程序,這些程序文件名以post開頭。

主要的幾個程序文件及其用途以下所述。

◆   postalias:構造,修改和查詢別名表。

◆   postconf:顯示和編輯main.cf配置文件。

◆   postfix:啓動、中止Postfix郵件服務,要求有root用戶權限。

◆   postmap:構造、修改或者查詢表文件(記錄如別名等映射關係的文件)。

◆   postqueue:查看郵件隊列,通常用戶也可使用。

◆   postsuper:管理郵件隊列,要求有root用戶權限。

 

2. 主要配置文件

       Postfix郵件系統的主要配置文件包括main.cf,master.cf,都位於/ete/postfix/文件夾下。其中,main.cf是Postfix服務的配置文件,設置郵      件服務器時以修改此文件的內容爲主;而master.cf是主程序master的配置文件,通常不須要修改。

       在主配置文件main.cf中能夠調整的各類配置參數有近千個。大部分的配置參數都被自動設置了默認值,若是在mail.cf文件中沒有對應的設置,郡麼Postfix服務器將使用默認值來啓動及運行。所以只須要修改不多的幾個配置參數就能夠知足基本郵件服務器的要求了。

       使用postconf工具能夠輔助配置過程,不帶任何選項時將列出當前Postfix服務器啓用的全部配置參數,若添加」-n"選項則只列出使用非默認值的配置參數。

[root@mail ~]# postconf      <==査看當前啓用的全部配置

2bounce_notice_recipient = postmaster

access_map_defer_code = 450

access_map_reject_code = 554

address_verify_cache_cleanup_interval = 12h

address_verify_default_transport = $default_transport

...... //省略部份內容

[root@mail ~]# postconf -n      <==只列出使用非默認值的配置

alias_database = hash:/etc/aliases

alias_maps = hash:/etc/aliases

command_directory = /usr/sbin

config_directory = /etc/postfix

daemon_directory = /usr/libexec/postfix

data_directory = /var/lib/postfix

debug_peer_level = 2

html_directory = no

inet_interfaces = localhost

inet_protocols = all

mail_owner = postfix

mailq_path = /usr/bin/mailq.postfix

manpage_directory = /usr/share/man

mydestination = $myhostname, localhost.$mydomain, localhost

newaliases_path = /usr/bin/newaliases.postfix

queue_directory = /var/spool/postfix

readme_directory = /usr/share/doc/postfix-2.6.6/README_FILES

sample_directory = /usr/share/doc/postfix-2.6.6/samples

sendmail_path = /usr/sbin/sendmail.postfix

setgid_group = postdrop

unknown_local_recipient_reject_code = 550

 

爲了不配置參數過多帶來的干擾,提升易讀性,建議對main.cf配置文件進行適當的簡化,只保留與默認配置不一樣的參數。

[root@mail ~]# postconf -n > tmp.file

[root@mail ~]# mv /etc/postfix/main.cf /etc/postfix/main.cf.bak

[root@mail ~]# mv tmp.file /etc/postfix/main.cf

 

3.Postfix的日誌文件

Postfix郵件服務的日誌文件位於/var/log/maillog,該文件中記錄了本機中的郵件進出相關的消息,包括郵件服務的啓動,出錯,與其餘SMTP服務器的會話信息等。在維護郵件服務器的過程當中,常常會使用帶」-f「選項的tail命令來跟蹤日誌變化。

[root@mail ~]# tail -f /var/log/maillog 

 

當日志內容較多時,還可使用egrep命令進行過濾,只查看包含reject、error,fatal等較重要的記錄。

[root@mail ~]# egerp '(reject|error|fatal|panic):' /var/log/maillog 

 

3. 郵件服務器的基本構建

從本節開始,將之前面編譯安裝的Postfix爲基礎,學習如何構建一個完整的電子郵件系統。在整個案例中,使用Postfix軟件提供SMTP發信服務,使用Dovecot軟件提供POP3/IMAP收信服務(如圖所示),使用郵件客戶端軟件OutlooL2007測試發信,收信功能。

 

在該電子郵件系統架構中,服務器所使用的相關配置環境以下。

➣   IP 地址 : 192.168.1.10/24. 

➣   郵件域@sky.com。

➣   主機名mail.sky.com。

➣   郵件帳號:使用本地系統用戶。

➣   域名服務器已預先架好DNS服務器,可以提供sky.com域的解析服務,併爲該域添加了到192.168.1.10的MX郵件交換記錄。

接下來依次講解Postfix、Dovecot的配置過程以及郵件客戶端Outlook的使用。

 

3.1配置SMTP發信服務

在整個電子郵件系統中,Postfix基於SMTP協議提供郵件傳遞服務,並負責將郵件分發到用戶的郵箱空間。對Postfix服務的配置主要經過修改主配置文件/etc/postfix/main.cf來進行。

在main.cf文件中,以」#「號開頭的行表示註釋信息,其餘行表示有效設置,設置行的格式與爲Shell變量賦值的形式很是相似,採用」配置參數=值「的形式,其中等號兩邊的空格無關緊要。當某個配置參數包含多個值時,使用逗號或空格進行分隔。也容許換行進行分隔,但行首至少應有一個空格。

 

1.設置main.cf,並啓動服務

[root@mail ~]# vim /etc/postfix/main.cf

...... //省略部份內容

inet_interfaces = 192.168.1.10,127.0.0.1   <==監聽服務的IP地址,默認爲all 

myhostname = mail.sky.com        <==郵件服務器的主機名

mydomain = sky.com          <==郵件域

myorigin = $mydomain       <==外發郵件時發件人地址中的郵件域

mydestination = $mydomain,$myhostname      <==容許投遞到本地的目標郵件域

home_mailbox = Maildir/        <==設置郵件存儲位置和格式

[root@mail ~]# postfix reload     <==重載配置內容

postfix/postfix-script: refreshing the Postfix mail system

 

在上述配置中,將mydestination的值設置爲"$mydomain,$myhostname"表示將@sky.com和@mail.sky.com域做爲本地目標域,容許投遞到本地郵箱空間。各用戶的郵件將被保存到宿主目錄下的Maildir/文件夾中。

郵箱空間用來存放每一個用戶的電子郵件內容,在Postfix服務器中支持兩種最多見的郵箱存儲方式:Mailbox,Maildir(當指定的存儲位置最後一個字符爲」/「時,自動使用Maildir存儲方式)。

➣   Mailbox:同一個用戶的全部郵件內容存儲爲單個文件,一般保存在/var/spool/mail/目錄下,文件名與用戶名相同。Mailbox存儲方式比較古老,當郵件數量較多時會下降查詢和管理的效率。

➣   Maildir:使用目錄結構來存儲用戶的郵件內客,每個用戶使用一個文件夾,每封郵件都做爲一個獨立的文件存放。Maildir方式的存取速度和效率要好一些,對於管理郵件內容也更加方便,大多數較新的郵件服務器都採用這種方式。

 

2. 添加郵箱帳號

Postfix服務器默認使用本機中的系統用戶做爲郵件帳號,所以使用時只須要添加Linux用戶帳號便可。測試時,能夠添加兩個郵件帳號xiaoqi和lisi,併爲其設置密碼。

[root@mail ~]# groupadd mailusers     <==建立郵箱用戶組

[root@mail ~]# useradd -g mailusers -s /sbin/nologin xiaoqi    <==新建帳戶xiaoqi

[root@mail ~]# passwd xiaoqi

[root@mail ~]# useradd -g mailusers -s /sbin/nologin lisi      <==新建帳戶lisi

[root@mail ~]# passwd lisi

#刪除某個郵箱帳號:

[root@mail ~]# userdel -r lisi

[root@mail ~]# rm /var/spool/mail/lisi

[root@mail ~]# rm -rf /home/lisi

 

3.SMTP發送郵件測試

將Postfix服務器交付使用以前,最好先在本機測試一下發信功能是否正常。命令行中的測試工做能夠經過telnet命令進行。例如,能夠鏈接到郵件服務器的25端口並輸入相關的SMTP命令,以郵件帳戶xiaoqi@sky.com做爲發件人,給lisi@sky.com 發送一封測試郵件。

[root@mail ~]# telnet mail.sky.com 25 <==鏈接到Postfix服務器

Trying 192.168.1.10...

Connected to mail.sky.com.

Escape character is '^]'.

220 mail.sky.com ESMTP Postfix

HELO mail.sky.com <==宣告客戶機地址

250 mail.sky.com

MAIL FROM:xiaoqi@sky.com <==告知客戶機地址

250 2.1.0 Ok

RCPT TO:lisi@sky.com <==告知發件人地址

250 2.1.5 Ok

DATA <==告知要發送郵件數據

354 End data with <CR><LF>.<CR><LF>

Subject:A Test Mail! <==指定郵件標題

Dear Lisi: <==編寫郵件正文

This is a test mail by Xiaoqi.

. <==單獨的點號表示正文結束

250 2.0.0 Ok: queued as 9C34440E8B

QUIT <==斷開鏈接並退出

221 2.0.0 Bye

Connection closed by foreign host.

 

郵件發送並投遞成功之後,能夠到服務器中lisi用戶的宿主目錄下進行查看,新接收到的郵件保存在Maildir/new/目錄中。

[root@mail ~]# ls -lh /home/lisi/Maildir/new/

總用量 4.0K

-rw-------. 1 lisi mailusers 434 5月  21 09:41 1432172479.Vfd00Ia04a3M869051.mail.sky.com

 

[root@mail ~]# cat /home/lisi/Maildir/new/1432172479.Vfd00Ia04a3M869051.mail.sky.com 

Return-Path: <xiaoqi@sky.com>      <==退信地址

X-Original-To: lisi@sky.com      <==來源地址

Delivered-To: lisi@sky.com      <==提交目的地址

Received: from mail.sky.com (www.sky.com [192.168.1.10])

    by mail.sky.com (Postfix) with SMTP id 9C34440E8B       <==經由哪些MTA接受

    for <lisi@sky.com>; Thu, 21 May 2015 09:39:46 +0800 (CST)     

Subject:A Test Mail!      <==郵件主題

Message-Id: <20150521014004.9C34440E8B@mail.sky.com>

Date: Thu, 21 May 2015 09:39:46 +0800 (CST)

From: xiaoqi@sky.com      <==發件人地址

 

Dear Lisi:         <==郵件內容

This is a test mail by Xiaoqi.

 

經過以上測試結果,不難發現已經可以經過Posrfix服務器發送並投遞郵件了,可是還只能在服務器本機查看收到的郵件。若要使收件人可以從其餘主機查收郵件,還須要進一步安裝POP3或IMAP服務器以提供郵件的下載服務。

相關文章
相關標籤/搜索