邮件服务器 之 利用debian sarge和postfix 2.1构建媲美ISP的邮件系统
生活随笔
收集整理的這篇文章主要介紹了
邮件服务器 之 利用debian sarge和postfix 2.1构建媲美ISP的邮件系统
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
非常簡明的debian sarge + postfix + mysql + webmail + web admin安裝配置指南
想在debian上安裝postfix郵件系統很多年了,參考了許多網上的資料,看得最多的是以下幾個:
王興宇的:http://cngnu.org/technology/Postfix_I.html
陳景峰的:http://www.huihoo.com/internet/postfix/pis/book1.html
但一直不是很成功。原因有以下幾個:
1、所需軟件很多,全都要自行重頭編譯,對于我這些菜鳥非常困難,各個軟件之間的依賴關系一頭霧水。
2、配置過程復雜,讓人忘而生畏。有時候看著幾百行的配置文件頭皮發麻。
3、工作原理懵里懵懂,許多參數不知道干什么用的,只能依葫蘆畫瓢,錯了不知從哪里改。
前幾天看了http://workaround.org/articles/ispmail-sarge/,突然明白了許多道理,居然一下子成功了!我還根據自己的了解改進了webmail部分,增加了郵件系統的web管理。不敢獨自享用,編譯出來,供與我有同樣的困惑的fans共享。
利用debian sarge和postfix 2.1構建媲美ISP的郵件系統
作者:Dipl.-Inform. Christoph Haas
原文出處:http://workaround.org/articles/ispmail-sarge/
譯者:一致連續
翻譯時間:2005-07-18
版權所有:Copyright ? 2002-2005 Christoph Haas
翻譯和改動未經作者同意。
最新版本請見:http://workaround.org.
摘要:
你可能見過web主機所有者出租虛擬主機讓你建立自己域來收發郵件。你想知道他們怎樣處理數以千計的域名的?不可能所有域和別名都放在 “main.cf” 配置文件中來手工管理。Postfix 提兩個特性來簡化工作:
虛擬域
除你的本地域外(一般定義在/etc/defaultdomain中),所有收郵件的其它域都稱為虛擬域。虛擬域的數量沒有限制。
數據庫查詢
你不必將所有用戶名和郵件地址存在文本文件中。Postfix支持通常的關系型數據庫系統的查詢,如MySQL和PostgreSQL. 這個特性非常有用,尤其是你開發基于WEB的GUI管理程序時。你甚至可以允許用戶自己管理他們的郵件帳號。
注意!本指南重新作了修訂,雖然我仔細測試過,但仍可能存在bug。如果有疑問,請參考老一點的版本:http://workaround.org/articles/ispmail-sarge/old/,如果你發現錯誤,請發郵件給:workaround-chitchat@workaround.org.如果你想通過以前的指南來升級,請參考這一節:http://workaround.org/articles/ispmail-sarge/#migrating
注意!本指南適合于Debian Sarge。如果你運行的是Woody,建議你閱讀[http://workaround.org/articles/ispmail/
本指南介紹了一個郵件系統的基本配置。如果你認真做完本文中的所有步驟后,你將擁有一個可以處理數以千計的域名的和用戶的郵件系統。以下是郵件系統能提供的特性:
POP3/IMAP訪問
WebMail訪問
病毒掃描
垃圾郵件預防
安全的郵件中繼
容易的域名管理
雖然我會給一個簡單說明,但以下知識你應預先準備好:
MySQL(創建數據庫,授權用戶訪問權限和SQL查詢語言)
SMTP,POP3,IMAP(我假定你對這些協議有基本的了解)
Postfix的基本配置(你應熟悉“mail.cf”配置文件)
Debian/Linux(你應知道基本的系統管理如安裝軟件、編輯文本文件)
目錄
1、需要的軟件
2、什么是映射(mapping)?
3、虛擬域怎樣工作
4、第一步:安裝所需要的Debian 軟件包
5、第二步:創建數據庫
6、第三步:創建表
????? domains
????? forwordings
????? users
7、第四步:創建數據庫映射定義
????? mysql-virtual_domains.cf
????? mysql-virtual_forwardings.cf
????? mysql-virtual_mailboxes.cf
????? mysql-virtual_email2email.cf
8、第五步:創建一個系統用戶 vmail
9、第六步:編輯 main.cf
????? 一個快速測試
10、第七步:讓Postfix理解SMTP認證
????? 告訴Postfix使用SASL/MySQL
????? 使用TLS加密SMTP通信
????? 一個快速測試
11、第八步:配置POP3/IMAP服務
????? 一個快速測試
12、第九步:測試你的配置
????? 域
????? 用戶
13、第十步:增加你的數據
????? 對于每個新域
????? 對于每個新用戶
????? 對于郵件轉發
14、掃描病毒和垃圾郵件(可選步驟)
????? 簡介AMaViS
????? 配置AMaVIS
????? 告訴Postfix使用AMaViS
????? 內容過濾怎樣工作?
????? 訓練
15、配置webmail(可選步驟)
16、用mailman建立郵件列表
17、問題解決
????? 錯誤信息
????? MySQL 排錯
????? 在線排錯
18、從以前版本的指南移植
19、感謝
20、即將實現的改進
21、興趣列表
1、需要的軟件
整修配置依靠不同的軟件組合在一起協調工作。讓我們看看都要用到哪些軟件:
Postfix:你的MTA(郵件傳遞代理)。通過SMTP(簡單郵件傳輸協議)接收郵件并將它們存放在硬盤上的相關位置。
MySQL:用這個數據庫系統中存儲的信息來管理Postfix,通常包括用戶名、域名、郵件轉發地址和口令。
Courier:Courier象Postfixg一樣,是一個單獨的郵件服務器。我們只用它的POP3/IMAP部分讓用戶訪問郵箱。
SASL(Cyrus庫):如果你的用戶通過其它ISP上網,那么他們的IP地址來自你的網絡之外,而郵件服務器只信任來自本地IP地址的訪問。SASL(簡單認證和安全層)在SMTP中加入認證讓郵件服務器能夠信任他們。
AMaViS:一個郵件病毒掃描軟件,可以在Postfix中當作內容過濾器使用。它可以在收到的郵件中掃描病毒和垃圾郵件。
phpmyadmin:一個基于web界面的MySQL管理工具。它比命令行工具更適合初學者使用(譯者注:用webmin來管理MySQL也很不錯)。
整個郵件服務器的組成和工作流程如下圖所示:
??? --------------------------? ---------?? ----------------? --------------?
??? | 發郵件到其它郵件服務器 |? | 收郵件 |? | SMTP認證訪問 |? | POP3或IMAP |
??? --------------------------? ---------?? ----------------? --------------
??????????????????????? ____????????????????????????????????????????
?????????????????????? |\?????????? |?????????? /?????????????? /|\
?????????????????????? | \????????? |????????? /?????????????? / | \?
????????????????????????? \???????? |???????? /????????????????? |??
?????????????????????????? \??????? |??????? /?????????????????? |??
??????????????????????????? \???? \ | /?? | /??????????????????? |??
???????????????????????????? \???? \|/??? |/___????????????????? |??
????????????????????????????????????????????????????????????????????
----------------?????????????? ------------------???????? --------------?????????????? --------------------
| Cyrus:auprop | <---Socket--- |???? Postfix??? |???????? |Courier:pop3| ---Socket---> |Courier:authdaemon|
----------------?????????????? ------------------???????? --------------?????????????? --------------------
????????????????????????????????????????????????????????????????????????
?????? |????????????????????????????? |???????????????????????? |?????????????????????????????? |
?????? |????????????????????????????? |???????????????????????? |?????????????????????????????? |
?????? |????????????????????? 發郵件給虛擬用戶????????????? 郵箱訪問??????????????????????????? |
?????? |????????????????????????????? |???????????????????????? |?????????????????????????????? |
?????? |????????????????????????????? |???????????????????????? |?????????????????????????????? |
?????? |????????????????????????????? |??? ------------------?? |?????????????????????????????? |
?????? |????????????????????????????? ---> |??? 虛擬郵箱??? | <---????????????????????????????? |
?????? |?????????????????????????????????? ------------------?????????????????????????????????? |
?????? |??????????????????????????????????????????????????????????????????????????????????????? |
?????? |?????????????????????????? ------------------------------------???????????????????????? |
?????? ---------MySQL 3306-------> |????????????????? MySQL?????????? | <-----MySQL 3306---------
?????????????????????????????????? ------------------------------------??????????????????
2、什么是映射(mappings)???????????????????
簡要的說,映射是將一個值指向另一個值。你可能知道文件:/etc/aliases,其中你可以定義本地域名轉發,有一行類似如下:
postmaster: root
這將使得給postmaster@your-domain的郵件全部轉給root@your-domain.左邊的(這里是"postmaster")稱為LHS(左側值),右邊的(這里是"root")稱為RHS(右側值)。在討論映射時一般這樣簡稱。
提示:通常映射文件左邊沒有冒號。這個特殊的別名表這所以這樣是為了兼容性。同樣,本地別名文件不是用postmap而用newalianse編譯的。這僅僅是一個(不好的)例子。
如果你正在以一種快速而不整潔的方式配置Postfix,你多半會從上面那樣的文本文件開始。你只需將映射寫在里面,然后運行
postmap filename
就可以將文本文件轉換成一個名為"filename.db"的哈希文件。在Postfix配置中可以用"hash:filename"來訪問你建立的映射。你可能注意到缺省的別名映射配置是這樣的:
alias_maps=hash:/etc/aliases
"hash:"是查詢方法。
在我的配置中,不用文本文件而是使用MySQL數據庫表。這使數據處理起來更靈活。但數據庫表一般包括兩列以上,你需要告訴Postfix哪一列是LHS,哪一列是RHS.這可以定義在一個文本文件中,如下所示:
user = provider_admin
password = DomAKg07
dbname = provider
table = virtual_mailboxes
select_field = mailbox
where_field = email
hosts = 127.0.0.1
如果上示文件保存為/etc/postfix/mysql_virtual_mailboxes.cf,你可以使用一個映射:
virtual_mailbox_maps=mysql:/etc/postfix/mysql_virtual_mailboxes.cf
映射的LHS被定義為"where_field",RHS被定義為"select_field".在這個例子中,它們分別指向列`email`和列`mailbox`.本例中另一些被定義的元素是:"user"(連接MySQL數據庫的用戶名),"password"(用戶口令),"dbname"(數據庫名),"table"(數據庫中的表名),"hosts"(運行MySQL的主機名)。
3、虛擬域怎樣工作
我們先簡要介紹一下Postfix 2.x中虛擬域的處理(不贊成使用Postfix 1.x的處理方式),混亂的配置將使你精疲力竭。有兩種典型的域:
本地域:
所有列在"main.cf"文件中"mydestination"元素中的域都被處理成本地域。你的缺省域(/etc/defaultdomain)一般設定成本地域。給本地域的郵件被交給系統用戶(在/etc/passwd中設定)。郵件存放在/var/mail中。
虛擬域
郵件服務器可以接收不做聲傳送給虛擬域的郵件。虛擬域非常靈活。你郵件用戶不需要系統帳號(這意味著用戶名不需要在/etc/passwd中設定)。所以郵件服務器可以輕而易舉的處理數以千計的郵件用戶。一個映射 (如上所述)用來存儲用戶的信息。在我的實例中,我使用MySQL.
事情有點復雜的是,有兩種不同的虛擬域:
虛擬別名域(Virtual Alias Domains)
虛擬別名域可以用來把發給一個地址的郵件轉發給另一個地址。這樣一個域可轉為不接收郵件。我不會使用這種類型的虛擬域,因為我會用virtual_alias_maps映射的別名,即使這些域沒有列在虛擬別名域中(譯者注:這句話沒譯好,如果感到困惑,不如看原文,現在我同情那些有些譯者了:-/)。(virtual_alias_maps是一個多用途映射,對通過系統的所有東西有效,包括本地域。
虛擬郵箱域( Virtual Mailbox Domains)
虛擬郵箱域可以接收這些域用戶的郵件,放在硬盤中的郵箱目錄中。仍然可以用virtual_alias_maps來轉發郵件到別的郵箱或外部郵件地址,因些不是域中的每個用戶都有一個真實的郵箱,可以只有一個郵件轉發地址。這僅僅是一個參數用來告訴Postfix如何處理這些域。順便說一句,virtual_mailbox_maps映射一般用來確定硬盤上郵箱的位置。
理解一個域要么是虛擬別名域要么是虛擬郵箱域要么是本地域是非常重要的。如果將一個域設定為虛擬別名域,是不能使用這些域接收郵件的。正相反,可以用virtual_alias_maps為兩者轉發郵件。所以虛擬郵箱域通常更靈活。
注意!一個域要么是虛擬要么是本地的,不能兩者都是!所以如果想使本地域通過虛擬域管理,要將它從mydestination定義中刪除。將mydestination設定為空或者是:"mydestination=localhost"。給地址類似于root@localhost的郵件將交付給本地root用戶。
建議你及早關于虛擬域的原始文檔,他們在VIRTUAL_README文件中,這個文件在postfix-doc包中,可以在/usr/share/doc/postfix/VIRTUAL_README.gz中找到。
4、第一步:安裝需要的Debian軟件包
絕對需要的軟件包有:
? postfix (Choose: "No configuration",安裝時選擇:“不配置”)
? postfix-mysql
? postfix-doc
? mysql-client (for MySQL 3.x/4.0) or mysql-client-4.1 (for MySQL4.1)
如果你是在同一臺機器上安裝MySQL服務器,需要:
? mysql-server (for MySQL 3.x/4.0) or mysql-server-4.1 (for MySQL4.1)
如果想通過POP3/IMAP訪問,需要:
? courier-authdaemon
? courier-authmysql
? courier-pop (for unencrypted POP3 access)
? courier-pop-ssl (for SSL-encrypted POP3 access)
? courier-imap (for unencrypted IMAP access)
? courier-imap-ssl (for SSL-encrypted IMAP access)
如果想通過認證SMTP發郵件,需要:
? postfix-tls (加密認證SMTP)
? libsasl2 (the Cyrus SASL library)
? libsasl2-modules (the mechanisms for the SASL library)
? libsasl2-modules-sql
? openssl (創建證書)
如果要掃描病毒和垃圾郵件,需要:
? amavisd-new
? spamassassin
? clamav
? clamav-daemon
? zoo
? unzip
? unarj
? lha (非自由軟件!)
?
如果要提供Webmail需要:
?? sqwebmail
譯者加:sqwebmail不太好用,推薦使用:
? squirrelmail
可選的軟件包:
?? phpmyadmin(PHP寫的用于MySQL數據庫的管理)
??
5、第二步: 創建數據庫
需要創建一個數據庫用來存儲表。如果你是MySQL老手,當然可以用命令行的方式操作,我一般用phpmyadmin來管理MySQL。它能勝任這項任務。
提示:數據庫服務器在剛安裝好后,root用戶是沒有口令的,安全起見,要先加上口令:
mysqladmin -u root password geheimes-passwort
首先創建一個數據庫。我命名為'provider',因為除了電子郵件,我有別的用途(不在本文討論范圍之內)。可以在phpmyadmin下做,也可在命令行下運行
mysqladmin -u root -p create provider
還需要一個用戶有足夠的權限訪問數據庫。在命令行下建立一個數據庫連接:
mysql -u root -p
看到mysql>提示符后,輸入SQL命令:
grant select on provider.* to provider_admin@localhost identified by 'your-password';
這將創建一個名為 provider_admin 的數據庫用戶,對 provider 數據庫有 'SELECT' 權限。記得用你自己的口令替換 your-password 。我用 'pwgen -s 16'命令自動產生口令。最后需要重載許可信息,在mysql>提示符下輸入:
flush privileges;
6、第三步: 創建表
接著要在數據庫中創建一系列的表來存儲postfix的控制信息。
domains
第一個表只有一列用于存儲虛擬域名,一行一個虛擬域,用SQL語句來建立:
CREATE TABLE domains (
domain varchar(50) NOT NULL,
PRIMARY KEY (domain),
UNIQUE KEY domain (domain) )
TYPE=MyISAM;
forwardings
表'forwardings'用于建立電子郵件地址的別名。可以用這個表來重定向郵件地址。(提示:這個對本地域也有效)。建立表的SQL語句是:
CREATE TABLE forwardings (
source varchar(80) NOT NULL,
destination TEXT NOT NULL,
PRIMARY KEY (source) )
TYPE=MyISAM;
users
最后一個表 'users'包含了用戶帳戶信息。通過POP3和IMAP訊問郵箱的用戶都得有一個用戶名和口令。由于用戶總是健忘的(瞧瞧你的老板,他的口令可能就放在鍵盤下),我決定用電子郵件地址作為登錄名。電子郵件地址還用于磁盤上郵件目錄命名。這個表只要兩列就夠了。建立表的SQL也很簡單:
CREATE TABLE users (
email varchar(80) NOT NULL,
password varchar(20) NOT NULL,
UNIQUE KEY email (email)
) TYPE=MyISAM;
7、第四步:創建數據庫映射定義
為了告訴postfix控制信息存儲在數據庫的什么地方,需要在/etc/postfix目錄下建立三個文本文件。
postfix在chroot環境中運行(/var/spool/postfix),不能訪問除這個目錄以外的其它文件。我們通常通過套接字文件/var/run/mysqld/mysqld.sock與MySQL通訊。而這個文件postfix訪問不到。所以要么將這個套接字文件移個位置(這會帶來別的問題),要么使用TCP協議來通訊。后者意味著要通過網絡與MySQL通訊,這樣做的好處是不用關心chroot環境的限制。一個不太嚴重的壞處是:通過lo界面訪問MySQL服務器,理論上說有安全問題。為了激活MySQL的網絡連接,要在/etc/mysql/my.cnf文件中插入一行"bind-address = 127.0.0.1",然后重啟MySQL服務器(在本文的下一個版本中,我會介紹一種非常漂亮的“綁定裝載”方式,通過在 /etc/fstab中實現MySQL套接字)。
mysql-virtual_domains.cf
這是一個簡單的映射:從虛擬域名(LHS)到字符串'virtual'(RHS)。這個映射用于定義virtual_mailbox_domains(右邊的字符串可以是任何東西,如果你愿意可設定為"banana daiquiri")。
創建這個文件,并且用你的數據庫服務器名、數據庫用戶名和口令替換 '...' 。不要用"localhost"作為服務器名,否則Postfix會試圖使用套接字方式來與MySQL通訊。如果數據庫服務器在同一臺服務器運行,127.0.0.1意味著通過TCP/IP通訊。mysql-virtual_domains.cf文件內容如下:
user = provider_admin
password = ...
dbname = provider
table = forwardings
select_field = destination
where_field = source
hosts = 127.0.0.1
mysql-virtual_mailboxes.cf
這個映射讀取'forwardings'表,規定了郵件重定向。它僅僅映射了 'source' 列和'destination'列。用在virtual_alias_maps映射中。文件內容如下:
user = provider_admin
password = ...
dbname = provider
table = forwardings
select_field = destination
where_field = source
hosts = 127.0.0.1
mysql-virtual_mailboxes.cf
這個文件定義了用戶郵箱。告訴了Postfix特定的郵件存在什么地方。將用它來映射virtual_mailbox_maps。對于給定的'email'地址(LHS),Postfix通過'mailbox'列(RHS)來尋找。select_field行用來將'user@domain.net'形式的電子郵件地址轉換成目錄'domain.net/user/'--用戶郵箱的存儲位置。最后要包含一個斜線,這樣Postfix將創建一個郵箱目錄,而不是一個郵件文件。這在隨后的Courier POP3和IMAP服務中用得到。mysql-virtual_mailboxes.cf文件如下:
user = provider_admin
password = ...
dbname = provider
table = users
select_field = CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')
where_field = email
hosts = 127.0.0.1
mysql-virtual_email2email.cf
虛擬域映射virtual_alias_maps是優先的。當你想用一個地址包羅萬象時很有用。(“包羅萬象”指你想使用以下的轉發方式:"@domain.com"->"service@domain.com",將用一個地址接收所有給這個域的郵件。)如果在virtual_alias_maps中映射了域@domain.com,那么即使特定地址specific.user@domain.com在 virtual_mailbox_maps中也做過映射,也是不起作用的,所有郵件將仍會傳遞給 @domain.com在virtual_alias_maps中指定的地址。
這個文件可以通過將user表中的電子郵件地址映射給自己解決這個問題:
user = provider_admin
password = ...
dbname = provider
table = users
select_field = email
where_field = email
hosts = 127.0.0.1
注意:確定除了root用戶外,其它人不能讀這些文件!否則你系統的其它用戶可以看到明碼方式的數據庫用戶和口令。運行"chmod o= /etc/postfix/mysql-virtual_*.cf"取消其它用戶的權限。也可以針這些文件的組屬性調為postfix,運行 "chgrp postfix /etc/postfix/mysql-virtual_*.cf" 即可。
8、第五步:創建一個vmail系統用戶
系統可能要處理數以千計的用戶。不可能給每個用戶一個唯一的UID。我建議創建一個假冒的用戶擁有所有郵箱。
用root身份在命令行下運行以下命令:
groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /home/vmail -m
9、第六步: 編輯main.cf文件
/etc/postfix/main.cf 是Postfix主要配置文件。我這里只給出虛擬域需要的基本配置。不要將main.cf全清除了,因為里面可能還有你的其它配置信息。
設置???????????????????????????????????????????????????? 含義
myhostnames = ...????????????????????????????????? 確保這里是全限定的域名。
mydestination = ...??????????????????????????????? 列出本地域名,用分號隔開,不要將虛擬域名列在這里。
mynetworks = ...????????????????????????????????? 列出可以通過郵件服務器發送郵件的IP地址范圍,很可能就是本地網絡。
virtual_alias_domains =??????????????????????????? 不要設置這個參數,我們不會使用虛擬別名域。為了與老版本兼容,
????????????????????????????????????????????????? 可將值設置為virtual_alias_maps
?????????????????????????????????????????????????
virtual_alias_maps =?????????????????????????????? 這個參數用于重定向表。可將一個郵件地址重定向到其它地址,
mysql:/etc/postfix/mysql-virtual_forwardings.cf?? 甚至將一個域的所有郵件地址重定向到一個指定的郵件地址。
mysql:/etc/postfix/mysql-virtual_email2email.cf??? 信息存于'forwardings'表中。每一個LHS郵件地址被重寫為RHS中顯示的
????????????????????????????????????????????????? 地址。如果有多個目標地址,可以在一條記錄中用逗號分隔。我也用
????????????????????????????????????????????????? mysql-virtual_email2email.cf映射將郵件地址指向自己。這看上去有點
????????????????????????????????????????????????? 愚蠢,但的確需要,當你想使用一個包羅萬象的地址時。
????????????????????????????????????????????????? 參見前面對mysql-virtual_email2email.cf的說明。
?????????????????????????????????????????????????
virtual_mailbox_domains =???????????????????????? 這個參數從`domains`中列出了虛擬郵箱域
mysql:/etc/postfix/mysql-virtual_domains.cf
virtual_mailbox_maps =???????????????????????????? 這是另一個重要的虛擬郵箱映射。它將電子郵件地址(LHS)映射到本地硬
????????????????????????????????????????????????? 盤中。
mysql:/etc/postfix/mysql-virtual_mailboxes.cf????? 郵箱目錄相對于virtual_mailbox_base。
virtual_mailbox_base = /home/vmail??????????????? 這是用戶郵箱在硬盤上的基目錄。
virtual_uid_maps = static:5000??????????????????? 要告訴郵箱所有者的UID,就是前面創建的vmail。
virtual_gid_maps = static:5000??????????????????? 同上,vmail的GID
smtpd_sasl_auth_enable = yes????????????????????? 使SMTP需要認證。
broken_sasl_auth_clients = yes??????????????????? 一些做得不太好的郵件客戶端,如M$ OutLook,使用一種不贊成的方式來搜????????????????????????????????????????????????????? 索需要認證SMTP的郵件服務器,這個參數是為了滿足他們。嗯?誰在說
????????????????????????????????????????????????? OutLook的壞話:)
smtpd_recipient_restrictions =???????????????????? 這個參數限制了誰可以用你的郵件服務器中繼和轉發郵件。
permit_mynetworks,???????????????????????????????? permit_mynetworks允許本地網絡的所有用戶都可以使用。
permit_sasl_authenticated,???????????????????????? permit_sasl_authenticated允許那些通過認證SMTP登錄的用戶可以使用。
reject_unauth_destination????????????????????????? 最后一個值reject_unauth_destination指出除relay_domains中列出的域外
????????????????????????????????????????????????? 都不允許。
smtpd_use_tls = yes??????????????????????????????? 用ssl加密認證SMTP會話
smtpd_tls_cert_file = /etc/postfix/smtpd.cert????? TLS需要的ssl證書位置(我們稍后會創建的)
smtpd_tls_key_file = /etc/postfix/smtpd.key??????? TLS需要的ssl私鑰位置
最后做一個快速測試:
運行postfix reload 和 postfix check。如果沒有警告和錯誤,這一部分就做完了。
10、第七步: 讓Postfix理解認證的SMTP(Auth-SMTP)
設想用戶通過POP3來取郵件,然后需要通過郵件服務器回信。由于安全原因,Postfix只允許用戶在mynetworks中定義的位置發郵件。通常郵件服務器只用于接收自己域的郵件。如果允許每個人通過郵件服務器發郵件給任何域,這稱為open relay,垃圾郵件制造者就可以通過你的郵件服務器發送大量數字垃圾。所以要求遠程用戶提供用戶名和口令。如果認證通過,遠程用戶也可以象本地網絡用戶一樣被信任。大多數郵件客戶端都有這個功能。
設置認證SMTP非常簡單。唯一的問題是Debian是在chroot環境中運行Postfix的,缺省的是在 /var/spool/postfix中。
告訴Postfix使用SASL/MySQL
Postfix采用Cyrus SASL庫來實現認證SMTP。需要告訴Postfix怎樣訪問到存儲了用戶名和口令的數據。很簡單,創建一個/etc/postfix/sasl目錄,將SASL配置文件放在這就可以了:
mkdir /etc/postfix/sasl
在這個目錄下創建一個smtpd.conf文件,內容如下所示:
pwcheck_method: auxprop
auxprop_plugin: sql
mech_list: plain login cram-md5 digest-md5
sql_engine: mysql
sql_hostnames: 127.0.0.1
sql_user: provider_admin
sql_passwd: ...
sql_database: provider
sql_select: select password from users where email='%u@%r'
如果在配置SASL 時有麻煩,可以在此處加入一行"log_level: 7",使得日志文件中提供便詳細的信息,幫助查找問題所在。
使用TLS加密SMTP通信
加密SMTP會話也很重要。如果郵件客戶端不加密的認證方法,用戶名和口令會用很不安全的方式傳輸。所以建議用TLS加密通信。TLS是Transport Layer Security (RFC2246)的縮寫,在郵件服務器與外界的連接中,使用SSL(Secure Socket Layer)來加密。
首先需要一個SSL證書。如果不想從認證中心購買,可以自己簽署一個。(個人意見:我想知道購買的怎樣會更安全。)唯一的不足是:郵件客戶端不知道你的CA(認證授權)哪里來,會彈出一個警告。告訴用戶要么不理睬這個警告,要么在計算機中安裝這個證書。(Outlook不允許不理睬他不知道的CA。需要安裝證書才能繼續工作。)
要針對主機smtp.domain.tld制作一個一年期的證書,可以執行以下命令:
openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509
運行過程中會問幾個問題,填幾個空,不必在意,隨便輸入一點什么即可。唯一的例外是,當問你"Common Name" (主機名)時,必須填寫郵件服務器的主機名。下面是會話示例:
Country Name (2 letter code) [AU]:DE
State or Province Name (full name) [Some-State]:Hamburg
Locality Name (eg, city) []:Hamburg
Organization Name (eg, company) [Internet Widgits Pty Ltd]:workaround.org email services
Organizational Unit Name (eg, section) []:Master of Disaster
Common Name (eg, YOUR name) []:smtp.domain.tld
Email Address []:postmaster@domain.tld
等一會兒,當前目錄下會產生兩個文件:"smtpd.key"(私鑰文件),"smtpd.cert"(證書)。將兩個文件移到目錄/etc/postfix中。
注意!私鑰文件任何人不能讀!用以下命令取消其它用戶的權限:
chmod o= /etc/postfix/smtpd.key
再次快速測試一下
運行postfix reload重啟Postfix。運行telnet localhost 25,輸入EHLO anywhere.org,應該可以看到一行:250-STARTTLS。干杯!TLS運行起來了!。
11、第八步:配置POP3/IMAP服務
現在設置過程的大部分完成了,再接再厲!當然,到現在為止,用戶還不能訪問他們的郵箱,這得先配置POP3或者IMAP服務。首先需要編輯/etc/courier/authdaemonrc,將認證模塊變為"authmysql":
authmodulelist="authmysql"
然后在/etc/courier/authmysqlrc文件中定義MySQL數據庫表中的一個字段:
MYSQL_SERVER localhost
MYSQL_USERNAME provider_admin
MYSQL_PASSWORD ...
MYSQL_PORT 0
MYSQL_DATABASE provider
MYSQL_USER_TABLE users
#MYSQL_CRYPT_PWFIELD (comment this out)
MYSQL_CLEAR_PWFIELD password
MYSQL_UID_FIELD 5000
MYSQL_GID_FIELD 5000
MYSQL_LOGIN_FIELD email
MYSQL_HOME_FIELD "/home/vmail"
MYSQL_MAILDIR_FIELD CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')
#MYSQL_NAME_FIELD (comment this out)
仔細點,authmysqlrc模塊非常挑剔。確保不是用TAB代替空格分隔,并且每行沒有尾部空格。最后記得重啟認證進程:/etc/init.d/courier-authdaemon restart。
第三次快速測試
試試通過運行telnet localhost pop3訪問一下POP3服務。應該可以看到"+OK Hello there."。瞧,這下你的用戶差不多可以使用你的郵件服務器了。
注意!郵箱里至少有一封信才能收郵件,否則用戶會得到一個含糊不清的錯誤信息。所以建議對每一個新用戶發一封歡迎信。
12、第九步:測試整個設置
祝賀你!整個設置完成了。現在整個來試試。現在在數據庫中創建第一個虛擬域記錄,試試虛擬域。在相應的數據庫表中創建以下行:
domains:
Column??? Value
domain??? virtual.test
users:
Column??? Value
email????? [email]user@virtual.test[/email]
password? secret
這意味著有一個虛擬域名為"virtual.test",一個用戶的郵件地址為 "user@virtual.test"(也是他的用戶名)。用戶的口令為:"secret"。如果沒有MX記錄(郵件交換-DNS區域的一部分),就需要手工遞送郵件。與郵件服務器建立一個SMTP連接(telnet servername 25),輸入SMTP命令。如下表,左邊是SMTP服務器的提示,右邊是輸入的命令:
服務器提示??????????????????????????????????????????????????? 你的輸入
220 myserver ESMTP Postfix (Debian/GNU)
????????????????????????????????????????????????????????????? ehlo workaround.org
250-mailtest
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH LOGIN PLAIN DIGEST-MD5 CRAM-MD5
250-AUTH=LOGIN PLAIN DIGEST-MD5 CRAM-MD5
250 8BITMIME
????????????????????????????????????????????????????????????? mail from:<test@workaround.org>
250 Ok
????????????????????????????????????????????????????????????? rcpt to:<user@virtual.test>
250 Ok
????????????????????????????????????????????????????????????? data
354 End data with <CR><LF>.<CR><LF></LF></CR></LF></CR>
????????????????????????????????????????????????????????????? This is a test email.
????????????????????????????????????????????????????????????? .
250 Ok: queued as ABC1D1C123
????????????????????????????????????????????????????????????? quit
221 BYE
如果服務器的反應和上面一樣,那么郵件就被接收了。在日志文件/var/log/mail.log中,可以看到這么一段:
Jul 24 21:48:28 myserver postfix/smtpd[9119]: connect from myserver[127.0.0.1]
Jul 24 21:48:48 myserver postfix/smtpd[9119]: F2C1B47BD: client=myserver[127.0.0.1]
Jul 24 21:48:52 myserver postfix/cleanup[9144]: F2C1B47BD: message-id=<20040724194842.F2C1B47BD@myserver>
Jul 24 21:48:52 myserver postfix/qmgr[9117]: F2C1B47BD: from=<test@workaround.org>, size=313, nrcpt=1 (queue active)
Jul 24 21:48:52 myserver postfix/virtual[9148]: F2C1B47BD: to=<user@virtual.test>, relay=virtual, delay=10, status=sent (delivered to maildir)
如果能讀到 "status=sent (delivered to maildir)",說明郵件成功遞送了。運行命令find /home/vmail,看看所有子目錄和文件,應該如下所示:
/home/vmail/virtual.test
/home/vmail/virtual.test/user
/home/vmail/virtual.test/user/tmp
/home/vmail/virtual.test/user/cur
/home/vmail/virtual.test/user/new
/home/vmail/virtual.test/user/new/1114511715.V801I7400b.my.server
所有的東西是不是如我描述的一樣工作?如果沒問題,要試試用郵件客戶端通過POP3或IMAP(取決于安裝了哪個服務)收一下郵件。接收郵件的用戶名就是他的郵件地址"user@virtual.test",口令是"secret"。
13、第十步:添加數據庫記錄
現在測試通過了,可以配置自己的域和用戶了。先解釋一下在數據庫中要添加一些什么。
對每一個新的域:
在'domains'表中增加域名。
對每一個新用戶:
在'users'表中增加一行,包括郵件地址和口令(用純文本)。
對每一個新郵件重定向:
在forwardings'中新增一行,包括源地址和目的地址。如果有多個目的地址(如簡單郵件列表),需要在這一行的相應字段中列出所有地址,用逗號隔開。提示:這個表用來過濾途經系統的所有郵件,所以本地郵件也可在這里重定向。
舉例:
源??????????????????? 目的????????????????? 效果
postmaster@my.domain? philip@my.domain????? 將給postmaster的郵件重定向到philip。
@my.domain??????????? john@my.domain??????? 將給域my.domain的所有郵件重定向到john。這個對`email`表中的用戶無效,
??????????????????????????????????????????? 例如tina@my.domain,因為一個域中的特定用戶總是比一個“包羅萬象”的帳
??????????????????????????????????????????? 號有更高的優先權。
@my.domain??????????? @another.domain??????? 這是整個域的重定向。域my.domain中的每一個地址被重定向到
??????????????????????????????????????????? 域another.domain的相應地址中。例如:julie@my.domain被重定向到
??????????????????????????????????????????? julie@another.domain。
jesper@my.domain????? dilbert@my.domain????? 將遞送給esper@my.domain的郵件重定向到兩個地址,每個地址都有一個拷貝。
????????????????????? ,dilbert@gmail.com?
想在debian上安裝postfix郵件系統很多年了,參考了許多網上的資料,看得最多的是以下幾個:
王興宇的:http://cngnu.org/technology/Postfix_I.html
陳景峰的:http://www.huihoo.com/internet/postfix/pis/book1.html
但一直不是很成功。原因有以下幾個:
1、所需軟件很多,全都要自行重頭編譯,對于我這些菜鳥非常困難,各個軟件之間的依賴關系一頭霧水。
2、配置過程復雜,讓人忘而生畏。有時候看著幾百行的配置文件頭皮發麻。
3、工作原理懵里懵懂,許多參數不知道干什么用的,只能依葫蘆畫瓢,錯了不知從哪里改。
前幾天看了http://workaround.org/articles/ispmail-sarge/,突然明白了許多道理,居然一下子成功了!我還根據自己的了解改進了webmail部分,增加了郵件系統的web管理。不敢獨自享用,編譯出來,供與我有同樣的困惑的fans共享。
利用debian sarge和postfix 2.1構建媲美ISP的郵件系統
作者:Dipl.-Inform. Christoph Haas
原文出處:http://workaround.org/articles/ispmail-sarge/
譯者:一致連續
翻譯時間:2005-07-18
版權所有:Copyright ? 2002-2005 Christoph Haas
翻譯和改動未經作者同意。
最新版本請見:http://workaround.org.
摘要:
你可能見過web主機所有者出租虛擬主機讓你建立自己域來收發郵件。你想知道他們怎樣處理數以千計的域名的?不可能所有域和別名都放在 “main.cf” 配置文件中來手工管理。Postfix 提兩個特性來簡化工作:
虛擬域
除你的本地域外(一般定義在/etc/defaultdomain中),所有收郵件的其它域都稱為虛擬域。虛擬域的數量沒有限制。
數據庫查詢
你不必將所有用戶名和郵件地址存在文本文件中。Postfix支持通常的關系型數據庫系統的查詢,如MySQL和PostgreSQL. 這個特性非常有用,尤其是你開發基于WEB的GUI管理程序時。你甚至可以允許用戶自己管理他們的郵件帳號。
注意!本指南重新作了修訂,雖然我仔細測試過,但仍可能存在bug。如果有疑問,請參考老一點的版本:http://workaround.org/articles/ispmail-sarge/old/,如果你發現錯誤,請發郵件給:workaround-chitchat@workaround.org.如果你想通過以前的指南來升級,請參考這一節:http://workaround.org/articles/ispmail-sarge/#migrating
注意!本指南適合于Debian Sarge。如果你運行的是Woody,建議你閱讀[http://workaround.org/articles/ispmail/
本指南介紹了一個郵件系統的基本配置。如果你認真做完本文中的所有步驟后,你將擁有一個可以處理數以千計的域名的和用戶的郵件系統。以下是郵件系統能提供的特性:
POP3/IMAP訪問
WebMail訪問
病毒掃描
垃圾郵件預防
安全的郵件中繼
容易的域名管理
雖然我會給一個簡單說明,但以下知識你應預先準備好:
MySQL(創建數據庫,授權用戶訪問權限和SQL查詢語言)
SMTP,POP3,IMAP(我假定你對這些協議有基本的了解)
Postfix的基本配置(你應熟悉“mail.cf”配置文件)
Debian/Linux(你應知道基本的系統管理如安裝軟件、編輯文本文件)
目錄
1、需要的軟件
2、什么是映射(mapping)?
3、虛擬域怎樣工作
4、第一步:安裝所需要的Debian 軟件包
5、第二步:創建數據庫
6、第三步:創建表
????? domains
????? forwordings
????? users
7、第四步:創建數據庫映射定義
????? mysql-virtual_domains.cf
????? mysql-virtual_forwardings.cf
????? mysql-virtual_mailboxes.cf
????? mysql-virtual_email2email.cf
8、第五步:創建一個系統用戶 vmail
9、第六步:編輯 main.cf
????? 一個快速測試
10、第七步:讓Postfix理解SMTP認證
????? 告訴Postfix使用SASL/MySQL
????? 使用TLS加密SMTP通信
????? 一個快速測試
11、第八步:配置POP3/IMAP服務
????? 一個快速測試
12、第九步:測試你的配置
????? 域
????? 用戶
13、第十步:增加你的數據
????? 對于每個新域
????? 對于每個新用戶
????? 對于郵件轉發
14、掃描病毒和垃圾郵件(可選步驟)
????? 簡介AMaViS
????? 配置AMaVIS
????? 告訴Postfix使用AMaViS
????? 內容過濾怎樣工作?
????? 訓練
15、配置webmail(可選步驟)
16、用mailman建立郵件列表
17、問題解決
????? 錯誤信息
????? MySQL 排錯
????? 在線排錯
18、從以前版本的指南移植
19、感謝
20、即將實現的改進
21、興趣列表
1、需要的軟件
整修配置依靠不同的軟件組合在一起協調工作。讓我們看看都要用到哪些軟件:
Postfix:你的MTA(郵件傳遞代理)。通過SMTP(簡單郵件傳輸協議)接收郵件并將它們存放在硬盤上的相關位置。
MySQL:用這個數據庫系統中存儲的信息來管理Postfix,通常包括用戶名、域名、郵件轉發地址和口令。
Courier:Courier象Postfixg一樣,是一個單獨的郵件服務器。我們只用它的POP3/IMAP部分讓用戶訪問郵箱。
SASL(Cyrus庫):如果你的用戶通過其它ISP上網,那么他們的IP地址來自你的網絡之外,而郵件服務器只信任來自本地IP地址的訪問。SASL(簡單認證和安全層)在SMTP中加入認證讓郵件服務器能夠信任他們。
AMaViS:一個郵件病毒掃描軟件,可以在Postfix中當作內容過濾器使用。它可以在收到的郵件中掃描病毒和垃圾郵件。
phpmyadmin:一個基于web界面的MySQL管理工具。它比命令行工具更適合初學者使用(譯者注:用webmin來管理MySQL也很不錯)。
整個郵件服務器的組成和工作流程如下圖所示:
??? --------------------------? ---------?? ----------------? --------------?
??? | 發郵件到其它郵件服務器 |? | 收郵件 |? | SMTP認證訪問 |? | POP3或IMAP |
??? --------------------------? ---------?? ----------------? --------------
??????????????????????? ____????????????????????????????????????????
?????????????????????? |\?????????? |?????????? /?????????????? /|\
?????????????????????? | \????????? |????????? /?????????????? / | \?
????????????????????????? \???????? |???????? /????????????????? |??
?????????????????????????? \??????? |??????? /?????????????????? |??
??????????????????????????? \???? \ | /?? | /??????????????????? |??
???????????????????????????? \???? \|/??? |/___????????????????? |??
????????????????????????????????????????????????????????????????????
----------------?????????????? ------------------???????? --------------?????????????? --------------------
| Cyrus:auprop | <---Socket--- |???? Postfix??? |???????? |Courier:pop3| ---Socket---> |Courier:authdaemon|
----------------?????????????? ------------------???????? --------------?????????????? --------------------
????????????????????????????????????????????????????????????????????????
?????? |????????????????????????????? |???????????????????????? |?????????????????????????????? |
?????? |????????????????????????????? |???????????????????????? |?????????????????????????????? |
?????? |????????????????????? 發郵件給虛擬用戶????????????? 郵箱訪問??????????????????????????? |
?????? |????????????????????????????? |???????????????????????? |?????????????????????????????? |
?????? |????????????????????????????? |???????????????????????? |?????????????????????????????? |
?????? |????????????????????????????? |??? ------------------?? |?????????????????????????????? |
?????? |????????????????????????????? ---> |??? 虛擬郵箱??? | <---????????????????????????????? |
?????? |?????????????????????????????????? ------------------?????????????????????????????????? |
?????? |??????????????????????????????????????????????????????????????????????????????????????? |
?????? |?????????????????????????? ------------------------------------???????????????????????? |
?????? ---------MySQL 3306-------> |????????????????? MySQL?????????? | <-----MySQL 3306---------
?????????????????????????????????? ------------------------------------??????????????????
2、什么是映射(mappings)???????????????????
簡要的說,映射是將一個值指向另一個值。你可能知道文件:/etc/aliases,其中你可以定義本地域名轉發,有一行類似如下:
postmaster: root
這將使得給postmaster@your-domain的郵件全部轉給root@your-domain.左邊的(這里是"postmaster")稱為LHS(左側值),右邊的(這里是"root")稱為RHS(右側值)。在討論映射時一般這樣簡稱。
提示:通常映射文件左邊沒有冒號。這個特殊的別名表這所以這樣是為了兼容性。同樣,本地別名文件不是用postmap而用newalianse編譯的。這僅僅是一個(不好的)例子。
如果你正在以一種快速而不整潔的方式配置Postfix,你多半會從上面那樣的文本文件開始。你只需將映射寫在里面,然后運行
postmap filename
就可以將文本文件轉換成一個名為"filename.db"的哈希文件。在Postfix配置中可以用"hash:filename"來訪問你建立的映射。你可能注意到缺省的別名映射配置是這樣的:
alias_maps=hash:/etc/aliases
"hash:"是查詢方法。
在我的配置中,不用文本文件而是使用MySQL數據庫表。這使數據處理起來更靈活。但數據庫表一般包括兩列以上,你需要告訴Postfix哪一列是LHS,哪一列是RHS.這可以定義在一個文本文件中,如下所示:
user = provider_admin
password = DomAKg07
dbname = provider
table = virtual_mailboxes
select_field = mailbox
where_field = email
hosts = 127.0.0.1
如果上示文件保存為/etc/postfix/mysql_virtual_mailboxes.cf,你可以使用一個映射:
virtual_mailbox_maps=mysql:/etc/postfix/mysql_virtual_mailboxes.cf
映射的LHS被定義為"where_field",RHS被定義為"select_field".在這個例子中,它們分別指向列`email`和列`mailbox`.本例中另一些被定義的元素是:"user"(連接MySQL數據庫的用戶名),"password"(用戶口令),"dbname"(數據庫名),"table"(數據庫中的表名),"hosts"(運行MySQL的主機名)。
3、虛擬域怎樣工作
我們先簡要介紹一下Postfix 2.x中虛擬域的處理(不贊成使用Postfix 1.x的處理方式),混亂的配置將使你精疲力竭。有兩種典型的域:
本地域:
所有列在"main.cf"文件中"mydestination"元素中的域都被處理成本地域。你的缺省域(/etc/defaultdomain)一般設定成本地域。給本地域的郵件被交給系統用戶(在/etc/passwd中設定)。郵件存放在/var/mail中。
虛擬域
郵件服務器可以接收不做聲傳送給虛擬域的郵件。虛擬域非常靈活。你郵件用戶不需要系統帳號(這意味著用戶名不需要在/etc/passwd中設定)。所以郵件服務器可以輕而易舉的處理數以千計的郵件用戶。一個映射 (如上所述)用來存儲用戶的信息。在我的實例中,我使用MySQL.
事情有點復雜的是,有兩種不同的虛擬域:
虛擬別名域(Virtual Alias Domains)
虛擬別名域可以用來把發給一個地址的郵件轉發給另一個地址。這樣一個域可轉為不接收郵件。我不會使用這種類型的虛擬域,因為我會用virtual_alias_maps映射的別名,即使這些域沒有列在虛擬別名域中(譯者注:這句話沒譯好,如果感到困惑,不如看原文,現在我同情那些有些譯者了:-/)。(virtual_alias_maps是一個多用途映射,對通過系統的所有東西有效,包括本地域。
虛擬郵箱域( Virtual Mailbox Domains)
虛擬郵箱域可以接收這些域用戶的郵件,放在硬盤中的郵箱目錄中。仍然可以用virtual_alias_maps來轉發郵件到別的郵箱或外部郵件地址,因些不是域中的每個用戶都有一個真實的郵箱,可以只有一個郵件轉發地址。這僅僅是一個參數用來告訴Postfix如何處理這些域。順便說一句,virtual_mailbox_maps映射一般用來確定硬盤上郵箱的位置。
理解一個域要么是虛擬別名域要么是虛擬郵箱域要么是本地域是非常重要的。如果將一個域設定為虛擬別名域,是不能使用這些域接收郵件的。正相反,可以用virtual_alias_maps為兩者轉發郵件。所以虛擬郵箱域通常更靈活。
注意!一個域要么是虛擬要么是本地的,不能兩者都是!所以如果想使本地域通過虛擬域管理,要將它從mydestination定義中刪除。將mydestination設定為空或者是:"mydestination=localhost"。給地址類似于root@localhost的郵件將交付給本地root用戶。
建議你及早關于虛擬域的原始文檔,他們在VIRTUAL_README文件中,這個文件在postfix-doc包中,可以在/usr/share/doc/postfix/VIRTUAL_README.gz中找到。
4、第一步:安裝需要的Debian軟件包
絕對需要的軟件包有:
? postfix (Choose: "No configuration",安裝時選擇:“不配置”)
? postfix-mysql
? postfix-doc
? mysql-client (for MySQL 3.x/4.0) or mysql-client-4.1 (for MySQL4.1)
如果你是在同一臺機器上安裝MySQL服務器,需要:
? mysql-server (for MySQL 3.x/4.0) or mysql-server-4.1 (for MySQL4.1)
如果想通過POP3/IMAP訪問,需要:
? courier-authdaemon
? courier-authmysql
? courier-pop (for unencrypted POP3 access)
? courier-pop-ssl (for SSL-encrypted POP3 access)
? courier-imap (for unencrypted IMAP access)
? courier-imap-ssl (for SSL-encrypted IMAP access)
如果想通過認證SMTP發郵件,需要:
? postfix-tls (加密認證SMTP)
? libsasl2 (the Cyrus SASL library)
? libsasl2-modules (the mechanisms for the SASL library)
? libsasl2-modules-sql
? openssl (創建證書)
如果要掃描病毒和垃圾郵件,需要:
? amavisd-new
? spamassassin
? clamav
? clamav-daemon
? zoo
? unzip
? unarj
? lha (非自由軟件!)
?
如果要提供Webmail需要:
?? sqwebmail
譯者加:sqwebmail不太好用,推薦使用:
? squirrelmail
可選的軟件包:
?? phpmyadmin(PHP寫的用于MySQL數據庫的管理)
??
5、第二步: 創建數據庫
需要創建一個數據庫用來存儲表。如果你是MySQL老手,當然可以用命令行的方式操作,我一般用phpmyadmin來管理MySQL。它能勝任這項任務。
提示:數據庫服務器在剛安裝好后,root用戶是沒有口令的,安全起見,要先加上口令:
mysqladmin -u root password geheimes-passwort
首先創建一個數據庫。我命名為'provider',因為除了電子郵件,我有別的用途(不在本文討論范圍之內)。可以在phpmyadmin下做,也可在命令行下運行
mysqladmin -u root -p create provider
還需要一個用戶有足夠的權限訪問數據庫。在命令行下建立一個數據庫連接:
mysql -u root -p
看到mysql>提示符后,輸入SQL命令:
grant select on provider.* to provider_admin@localhost identified by 'your-password';
這將創建一個名為 provider_admin 的數據庫用戶,對 provider 數據庫有 'SELECT' 權限。記得用你自己的口令替換 your-password 。我用 'pwgen -s 16'命令自動產生口令。最后需要重載許可信息,在mysql>提示符下輸入:
flush privileges;
6、第三步: 創建表
接著要在數據庫中創建一系列的表來存儲postfix的控制信息。
domains
第一個表只有一列用于存儲虛擬域名,一行一個虛擬域,用SQL語句來建立:
CREATE TABLE domains (
domain varchar(50) NOT NULL,
PRIMARY KEY (domain),
UNIQUE KEY domain (domain) )
TYPE=MyISAM;
forwardings
表'forwardings'用于建立電子郵件地址的別名。可以用這個表來重定向郵件地址。(提示:這個對本地域也有效)。建立表的SQL語句是:
CREATE TABLE forwardings (
source varchar(80) NOT NULL,
destination TEXT NOT NULL,
PRIMARY KEY (source) )
TYPE=MyISAM;
users
最后一個表 'users'包含了用戶帳戶信息。通過POP3和IMAP訊問郵箱的用戶都得有一個用戶名和口令。由于用戶總是健忘的(瞧瞧你的老板,他的口令可能就放在鍵盤下),我決定用電子郵件地址作為登錄名。電子郵件地址還用于磁盤上郵件目錄命名。這個表只要兩列就夠了。建立表的SQL也很簡單:
CREATE TABLE users (
email varchar(80) NOT NULL,
password varchar(20) NOT NULL,
UNIQUE KEY email (email)
) TYPE=MyISAM;
7、第四步:創建數據庫映射定義
為了告訴postfix控制信息存儲在數據庫的什么地方,需要在/etc/postfix目錄下建立三個文本文件。
postfix在chroot環境中運行(/var/spool/postfix),不能訪問除這個目錄以外的其它文件。我們通常通過套接字文件/var/run/mysqld/mysqld.sock與MySQL通訊。而這個文件postfix訪問不到。所以要么將這個套接字文件移個位置(這會帶來別的問題),要么使用TCP協議來通訊。后者意味著要通過網絡與MySQL通訊,這樣做的好處是不用關心chroot環境的限制。一個不太嚴重的壞處是:通過lo界面訪問MySQL服務器,理論上說有安全問題。為了激活MySQL的網絡連接,要在/etc/mysql/my.cnf文件中插入一行"bind-address = 127.0.0.1",然后重啟MySQL服務器(在本文的下一個版本中,我會介紹一種非常漂亮的“綁定裝載”方式,通過在 /etc/fstab中實現MySQL套接字)。
mysql-virtual_domains.cf
這是一個簡單的映射:從虛擬域名(LHS)到字符串'virtual'(RHS)。這個映射用于定義virtual_mailbox_domains(右邊的字符串可以是任何東西,如果你愿意可設定為"banana daiquiri")。
創建這個文件,并且用你的數據庫服務器名、數據庫用戶名和口令替換 '...' 。不要用"localhost"作為服務器名,否則Postfix會試圖使用套接字方式來與MySQL通訊。如果數據庫服務器在同一臺服務器運行,127.0.0.1意味著通過TCP/IP通訊。mysql-virtual_domains.cf文件內容如下:
user = provider_admin
password = ...
dbname = provider
table = forwardings
select_field = destination
where_field = source
hosts = 127.0.0.1
mysql-virtual_mailboxes.cf
這個映射讀取'forwardings'表,規定了郵件重定向。它僅僅映射了 'source' 列和'destination'列。用在virtual_alias_maps映射中。文件內容如下:
user = provider_admin
password = ...
dbname = provider
table = forwardings
select_field = destination
where_field = source
hosts = 127.0.0.1
mysql-virtual_mailboxes.cf
這個文件定義了用戶郵箱。告訴了Postfix特定的郵件存在什么地方。將用它來映射virtual_mailbox_maps。對于給定的'email'地址(LHS),Postfix通過'mailbox'列(RHS)來尋找。select_field行用來將'user@domain.net'形式的電子郵件地址轉換成目錄'domain.net/user/'--用戶郵箱的存儲位置。最后要包含一個斜線,這樣Postfix將創建一個郵箱目錄,而不是一個郵件文件。這在隨后的Courier POP3和IMAP服務中用得到。mysql-virtual_mailboxes.cf文件如下:
user = provider_admin
password = ...
dbname = provider
table = users
select_field = CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')
where_field = email
hosts = 127.0.0.1
mysql-virtual_email2email.cf
虛擬域映射virtual_alias_maps是優先的。當你想用一個地址包羅萬象時很有用。(“包羅萬象”指你想使用以下的轉發方式:"@domain.com"->"service@domain.com",將用一個地址接收所有給這個域的郵件。)如果在virtual_alias_maps中映射了域@domain.com,那么即使特定地址specific.user@domain.com在 virtual_mailbox_maps中也做過映射,也是不起作用的,所有郵件將仍會傳遞給 @domain.com在virtual_alias_maps中指定的地址。
這個文件可以通過將user表中的電子郵件地址映射給自己解決這個問題:
user = provider_admin
password = ...
dbname = provider
table = users
select_field = email
where_field = email
hosts = 127.0.0.1
注意:確定除了root用戶外,其它人不能讀這些文件!否則你系統的其它用戶可以看到明碼方式的數據庫用戶和口令。運行"chmod o= /etc/postfix/mysql-virtual_*.cf"取消其它用戶的權限。也可以針這些文件的組屬性調為postfix,運行 "chgrp postfix /etc/postfix/mysql-virtual_*.cf" 即可。
8、第五步:創建一個vmail系統用戶
系統可能要處理數以千計的用戶。不可能給每個用戶一個唯一的UID。我建議創建一個假冒的用戶擁有所有郵箱。
用root身份在命令行下運行以下命令:
groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /home/vmail -m
9、第六步: 編輯main.cf文件
/etc/postfix/main.cf 是Postfix主要配置文件。我這里只給出虛擬域需要的基本配置。不要將main.cf全清除了,因為里面可能還有你的其它配置信息。
設置???????????????????????????????????????????????????? 含義
myhostnames = ...????????????????????????????????? 確保這里是全限定的域名。
mydestination = ...??????????????????????????????? 列出本地域名,用分號隔開,不要將虛擬域名列在這里。
mynetworks = ...????????????????????????????????? 列出可以通過郵件服務器發送郵件的IP地址范圍,很可能就是本地網絡。
virtual_alias_domains =??????????????????????????? 不要設置這個參數,我們不會使用虛擬別名域。為了與老版本兼容,
????????????????????????????????????????????????? 可將值設置為virtual_alias_maps
?????????????????????????????????????????????????
virtual_alias_maps =?????????????????????????????? 這個參數用于重定向表。可將一個郵件地址重定向到其它地址,
mysql:/etc/postfix/mysql-virtual_forwardings.cf?? 甚至將一個域的所有郵件地址重定向到一個指定的郵件地址。
mysql:/etc/postfix/mysql-virtual_email2email.cf??? 信息存于'forwardings'表中。每一個LHS郵件地址被重寫為RHS中顯示的
????????????????????????????????????????????????? 地址。如果有多個目標地址,可以在一條記錄中用逗號分隔。我也用
????????????????????????????????????????????????? mysql-virtual_email2email.cf映射將郵件地址指向自己。這看上去有點
????????????????????????????????????????????????? 愚蠢,但的確需要,當你想使用一個包羅萬象的地址時。
????????????????????????????????????????????????? 參見前面對mysql-virtual_email2email.cf的說明。
?????????????????????????????????????????????????
virtual_mailbox_domains =???????????????????????? 這個參數從`domains`中列出了虛擬郵箱域
mysql:/etc/postfix/mysql-virtual_domains.cf
virtual_mailbox_maps =???????????????????????????? 這是另一個重要的虛擬郵箱映射。它將電子郵件地址(LHS)映射到本地硬
????????????????????????????????????????????????? 盤中。
mysql:/etc/postfix/mysql-virtual_mailboxes.cf????? 郵箱目錄相對于virtual_mailbox_base。
virtual_mailbox_base = /home/vmail??????????????? 這是用戶郵箱在硬盤上的基目錄。
virtual_uid_maps = static:5000??????????????????? 要告訴郵箱所有者的UID,就是前面創建的vmail。
virtual_gid_maps = static:5000??????????????????? 同上,vmail的GID
smtpd_sasl_auth_enable = yes????????????????????? 使SMTP需要認證。
broken_sasl_auth_clients = yes??????????????????? 一些做得不太好的郵件客戶端,如M$ OutLook,使用一種不贊成的方式來搜????????????????????????????????????????????????????? 索需要認證SMTP的郵件服務器,這個參數是為了滿足他們。嗯?誰在說
????????????????????????????????????????????????? OutLook的壞話:)
smtpd_recipient_restrictions =???????????????????? 這個參數限制了誰可以用你的郵件服務器中繼和轉發郵件。
permit_mynetworks,???????????????????????????????? permit_mynetworks允許本地網絡的所有用戶都可以使用。
permit_sasl_authenticated,???????????????????????? permit_sasl_authenticated允許那些通過認證SMTP登錄的用戶可以使用。
reject_unauth_destination????????????????????????? 最后一個值reject_unauth_destination指出除relay_domains中列出的域外
????????????????????????????????????????????????? 都不允許。
smtpd_use_tls = yes??????????????????????????????? 用ssl加密認證SMTP會話
smtpd_tls_cert_file = /etc/postfix/smtpd.cert????? TLS需要的ssl證書位置(我們稍后會創建的)
smtpd_tls_key_file = /etc/postfix/smtpd.key??????? TLS需要的ssl私鑰位置
最后做一個快速測試:
運行postfix reload 和 postfix check。如果沒有警告和錯誤,這一部分就做完了。
10、第七步: 讓Postfix理解認證的SMTP(Auth-SMTP)
設想用戶通過POP3來取郵件,然后需要通過郵件服務器回信。由于安全原因,Postfix只允許用戶在mynetworks中定義的位置發郵件。通常郵件服務器只用于接收自己域的郵件。如果允許每個人通過郵件服務器發郵件給任何域,這稱為open relay,垃圾郵件制造者就可以通過你的郵件服務器發送大量數字垃圾。所以要求遠程用戶提供用戶名和口令。如果認證通過,遠程用戶也可以象本地網絡用戶一樣被信任。大多數郵件客戶端都有這個功能。
設置認證SMTP非常簡單。唯一的問題是Debian是在chroot環境中運行Postfix的,缺省的是在 /var/spool/postfix中。
告訴Postfix使用SASL/MySQL
Postfix采用Cyrus SASL庫來實現認證SMTP。需要告訴Postfix怎樣訪問到存儲了用戶名和口令的數據。很簡單,創建一個/etc/postfix/sasl目錄,將SASL配置文件放在這就可以了:
mkdir /etc/postfix/sasl
在這個目錄下創建一個smtpd.conf文件,內容如下所示:
pwcheck_method: auxprop
auxprop_plugin: sql
mech_list: plain login cram-md5 digest-md5
sql_engine: mysql
sql_hostnames: 127.0.0.1
sql_user: provider_admin
sql_passwd: ...
sql_database: provider
sql_select: select password from users where email='%u@%r'
如果在配置SASL 時有麻煩,可以在此處加入一行"log_level: 7",使得日志文件中提供便詳細的信息,幫助查找問題所在。
使用TLS加密SMTP通信
加密SMTP會話也很重要。如果郵件客戶端不加密的認證方法,用戶名和口令會用很不安全的方式傳輸。所以建議用TLS加密通信。TLS是Transport Layer Security (RFC2246)的縮寫,在郵件服務器與外界的連接中,使用SSL(Secure Socket Layer)來加密。
首先需要一個SSL證書。如果不想從認證中心購買,可以自己簽署一個。(個人意見:我想知道購買的怎樣會更安全。)唯一的不足是:郵件客戶端不知道你的CA(認證授權)哪里來,會彈出一個警告。告訴用戶要么不理睬這個警告,要么在計算機中安裝這個證書。(Outlook不允許不理睬他不知道的CA。需要安裝證書才能繼續工作。)
要針對主機smtp.domain.tld制作一個一年期的證書,可以執行以下命令:
openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509
運行過程中會問幾個問題,填幾個空,不必在意,隨便輸入一點什么即可。唯一的例外是,當問你"Common Name" (主機名)時,必須填寫郵件服務器的主機名。下面是會話示例:
Country Name (2 letter code) [AU]:DE
State or Province Name (full name) [Some-State]:Hamburg
Locality Name (eg, city) []:Hamburg
Organization Name (eg, company) [Internet Widgits Pty Ltd]:workaround.org email services
Organizational Unit Name (eg, section) []:Master of Disaster
Common Name (eg, YOUR name) []:smtp.domain.tld
Email Address []:postmaster@domain.tld
等一會兒,當前目錄下會產生兩個文件:"smtpd.key"(私鑰文件),"smtpd.cert"(證書)。將兩個文件移到目錄/etc/postfix中。
注意!私鑰文件任何人不能讀!用以下命令取消其它用戶的權限:
chmod o= /etc/postfix/smtpd.key
再次快速測試一下
運行postfix reload重啟Postfix。運行telnet localhost 25,輸入EHLO anywhere.org,應該可以看到一行:250-STARTTLS。干杯!TLS運行起來了!。
11、第八步:配置POP3/IMAP服務
現在設置過程的大部分完成了,再接再厲!當然,到現在為止,用戶還不能訪問他們的郵箱,這得先配置POP3或者IMAP服務。首先需要編輯/etc/courier/authdaemonrc,將認證模塊變為"authmysql":
authmodulelist="authmysql"
然后在/etc/courier/authmysqlrc文件中定義MySQL數據庫表中的一個字段:
MYSQL_SERVER localhost
MYSQL_USERNAME provider_admin
MYSQL_PASSWORD ...
MYSQL_PORT 0
MYSQL_DATABASE provider
MYSQL_USER_TABLE users
#MYSQL_CRYPT_PWFIELD (comment this out)
MYSQL_CLEAR_PWFIELD password
MYSQL_UID_FIELD 5000
MYSQL_GID_FIELD 5000
MYSQL_LOGIN_FIELD email
MYSQL_HOME_FIELD "/home/vmail"
MYSQL_MAILDIR_FIELD CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')
#MYSQL_NAME_FIELD (comment this out)
仔細點,authmysqlrc模塊非常挑剔。確保不是用TAB代替空格分隔,并且每行沒有尾部空格。最后記得重啟認證進程:/etc/init.d/courier-authdaemon restart。
第三次快速測試
試試通過運行telnet localhost pop3訪問一下POP3服務。應該可以看到"+OK Hello there."。瞧,這下你的用戶差不多可以使用你的郵件服務器了。
注意!郵箱里至少有一封信才能收郵件,否則用戶會得到一個含糊不清的錯誤信息。所以建議對每一個新用戶發一封歡迎信。
12、第九步:測試整個設置
祝賀你!整個設置完成了。現在整個來試試。現在在數據庫中創建第一個虛擬域記錄,試試虛擬域。在相應的數據庫表中創建以下行:
domains:
Column??? Value
domain??? virtual.test
users:
Column??? Value
email????? [email]user@virtual.test[/email]
password? secret
這意味著有一個虛擬域名為"virtual.test",一個用戶的郵件地址為 "user@virtual.test"(也是他的用戶名)。用戶的口令為:"secret"。如果沒有MX記錄(郵件交換-DNS區域的一部分),就需要手工遞送郵件。與郵件服務器建立一個SMTP連接(telnet servername 25),輸入SMTP命令。如下表,左邊是SMTP服務器的提示,右邊是輸入的命令:
服務器提示??????????????????????????????????????????????????? 你的輸入
220 myserver ESMTP Postfix (Debian/GNU)
????????????????????????????????????????????????????????????? ehlo workaround.org
250-mailtest
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH LOGIN PLAIN DIGEST-MD5 CRAM-MD5
250-AUTH=LOGIN PLAIN DIGEST-MD5 CRAM-MD5
250 8BITMIME
????????????????????????????????????????????????????????????? mail from:<test@workaround.org>
250 Ok
????????????????????????????????????????????????????????????? rcpt to:<user@virtual.test>
250 Ok
????????????????????????????????????????????????????????????? data
354 End data with <CR><LF>.<CR><LF></LF></CR></LF></CR>
????????????????????????????????????????????????????????????? This is a test email.
????????????????????????????????????????????????????????????? .
250 Ok: queued as ABC1D1C123
????????????????????????????????????????????????????????????? quit
221 BYE
如果服務器的反應和上面一樣,那么郵件就被接收了。在日志文件/var/log/mail.log中,可以看到這么一段:
Jul 24 21:48:28 myserver postfix/smtpd[9119]: connect from myserver[127.0.0.1]
Jul 24 21:48:48 myserver postfix/smtpd[9119]: F2C1B47BD: client=myserver[127.0.0.1]
Jul 24 21:48:52 myserver postfix/cleanup[9144]: F2C1B47BD: message-id=<20040724194842.F2C1B47BD@myserver>
Jul 24 21:48:52 myserver postfix/qmgr[9117]: F2C1B47BD: from=<test@workaround.org>, size=313, nrcpt=1 (queue active)
Jul 24 21:48:52 myserver postfix/virtual[9148]: F2C1B47BD: to=<user@virtual.test>, relay=virtual, delay=10, status=sent (delivered to maildir)
如果能讀到 "status=sent (delivered to maildir)",說明郵件成功遞送了。運行命令find /home/vmail,看看所有子目錄和文件,應該如下所示:
/home/vmail/virtual.test
/home/vmail/virtual.test/user
/home/vmail/virtual.test/user/tmp
/home/vmail/virtual.test/user/cur
/home/vmail/virtual.test/user/new
/home/vmail/virtual.test/user/new/1114511715.V801I7400b.my.server
所有的東西是不是如我描述的一樣工作?如果沒問題,要試試用郵件客戶端通過POP3或IMAP(取決于安裝了哪個服務)收一下郵件。接收郵件的用戶名就是他的郵件地址"user@virtual.test",口令是"secret"。
13、第十步:添加數據庫記錄
現在測試通過了,可以配置自己的域和用戶了。先解釋一下在數據庫中要添加一些什么。
對每一個新的域:
在'domains'表中增加域名。
對每一個新用戶:
在'users'表中增加一行,包括郵件地址和口令(用純文本)。
對每一個新郵件重定向:
在forwardings'中新增一行,包括源地址和目的地址。如果有多個目的地址(如簡單郵件列表),需要在這一行的相應字段中列出所有地址,用逗號隔開。提示:這個表用來過濾途經系統的所有郵件,所以本地郵件也可在這里重定向。
舉例:
源??????????????????? 目的????????????????? 效果
postmaster@my.domain? philip@my.domain????? 將給postmaster的郵件重定向到philip。
@my.domain??????????? john@my.domain??????? 將給域my.domain的所有郵件重定向到john。這個對`email`表中的用戶無效,
??????????????????????????????????????????? 例如tina@my.domain,因為一個域中的特定用戶總是比一個“包羅萬象”的帳
??????????????????????????????????????????? 號有更高的優先權。
@my.domain??????????? @another.domain??????? 這是整個域的重定向。域my.domain中的每一個地址被重定向到
??????????????????????????????????????????? 域another.domain的相應地址中。例如:julie@my.domain被重定向到
??????????????????????????????????????????? julie@another.domain。
jesper@my.domain????? dilbert@my.domain????? 將遞送給esper@my.domain的郵件重定向到兩個地址,每個地址都有一個拷貝。
????????????????????? ,dilbert@gmail.com?
轉載于:https://www.cnblogs.com/licheng/archive/2008/01/23/1050066.html
總結
以上是生活随笔為你收集整理的邮件服务器 之 利用debian sarge和postfix 2.1构建媲美ISP的邮件系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 读取图片文件转换格式
- 下一篇: Android 图片高斯模糊解决方案