背景
操作系統版本(cat /etc/issue):CentOS release 6.5 (Final)
主機名:mail.gogo.so
域名:gogo.so
用到軟件:
postfix
相關協議:
SMTP : Simple Mail Transport Protocol,它是用於傳送郵件的標准協議(TCP port 25)。Postfix不處理任何POP和IMAP通信內容。
IMAP和POP3是用於收信的協議,描述如何從郵箱中取出郵件。POP3和IMAP完全沒有寄信的能力,只能幫用戶處理事先收到的郵件。並非所有用戶都需要透過POP3/IMAP來訪問郵箱。擁有Linux系統賬號的用戶,可能設定他們的MUA直接讀取同一機器上的郵件文件。
郵件系統的組成:
一個郵件系統通常包括:MUA、MTA、MRA、MDA等。
MUA:Mail User Agent(郵件用戶代理),常見的MUA有mutt,Outlook Express,Foxmail等,MUA並非直接將E-mail送到收到件人手中,而是由MTA代為傳遞。當你要求MUA發送一封郵件,它只是將該郵件交給一台運行MTA軟件(例如Postfix)的服務器。
MTA:Mail Transfer Agent(郵件傳輸代理),Postfix是一種MTA。MTA的任務是:(1)接受MUA的委托,將E-mail從一個系統遞送到另一個系統;(2)接收從別的MTA發送過來的郵件。
每當MTA收到MUA的寄信請求時,它會先判斷是否應該受理。通常,如果郵件是來自本地系統的用戶,或是本地網絡上的系統,或是任何特許可以通過它轉發(relay)郵件到其他目的地的網絡,MTA都會受理寄信請求。另一方面,MTA也會依據“收件人”來決定是否要收下郵件。如果收件人是本地系統的用戶,或是收件人位於它知道要如何轉遞(forward)的其他系統,MTA就會收下該郵件。
MTA收下郵件之后,有兩種可能:(1)將郵件遞送給自己系統上的用戶;(2)將郵件交給另一個MTA來繼續傳遞。
MDA:Message Delivery Agent(郵件投遞代理)。在郵件的終點站的MTA上,在發現收件人是本地系統的用戶之后,必須將郵件交給MDA存放起來。常用的MDA有lmtp和pipe。
MRA:郵件被存入郵箱后,它就待在那里,等待收件人將它收走。收件人使用MUA來收信、閱讀信件。
查看postfix設置的命令:postconf
查看postfix支持哪些類型的查詢表:postconf -m
列表中有mysql,表明postfix添加了對mysql的支持
參考文獻
http://www.haiyun.me/archives/953.html
https://www.digitalocean.com/community/tutorials/how-to-configure-a-mail-server-using-postfix-dovecot-mysql-and-spamassassin
http://sealedabstract.com/code/nsa-proof-your-e-mail-in-2-hours/
按照上述配置好后,還要保證/etc/dovecot/dovecot.conf文件中
protocols = imap pop3 lmtp
protocols中有lmtp協議
在/etc/dovecot/conf.d/15-lda.conf文件中
設定postmaster_address,例如:
postmaster_address = postmaster@gogo.so
/etc/postfix/main.cf中,mydestination的值中不要與mysql數據庫的virtual_domains表中有相同的域名:
mydestination = $myhostname, localhost
並且將local_recipient_maps的值設為空
local_recipient_maps =
====================================new================================
在aliyun上部署郵件服務器的步驟
參考網址:
http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/10/16/2214272.html
http://www.cnblogs.com/dudu/archive/2012/12/12/linux-postfix-mailserver.html
http://www.haiyun.me/archives/953.html
首先切換到root用戶
su - root
防火牆處理,開放MySQL服務器程序的3306端口
service iptables stop #停止防火牆 /sbin/iptables -F /sbin/iptables -I INPUT -p tcp --dport 3306 -j ACCEPT #MySQL的3306端口 /etc/rc.d/init.d/iptables save #保存 service iptables restart #重啟防火牆
安裝MySQL
yum install mysql yum install mysql-server yum install mysql-devel chgrp -R mysql /var/lib/mysql chmod -R 770 /var/lib/mysql service mysqld start #啟動mysql服務 mysql #啟動mysql客戶端
#初始化MySQL的root用戶的密碼 mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('your_password'); #如果要自啟動,則運行這個命令 chkconfig --levels 35 mysqld on
由於CentOS 6.5系統已經自帶postfix,不需要再安裝. 下面安裝dovecot及其MySQL擴展
yum install dovecot yum install dovecot-mysql
再次以MySQL的root用戶登錄MySQL,創建數據庫mail,新建用戶mailuser(密碼為mailuserpass):
CREATE DATABASE mail; GRANT SELECT ON mail.* TO 'mailuser'@'127.0.0.1' IDENTIFIED BY 'mailuserpass'; FLUSH PRIVILEGES; USE mail;
下面繼續創建三個表:1.虛擬域表 2.虛擬用戶表 3.虛擬別名表
--虛擬域表 CREATE TABLE `virtual_domains` ( `id` int(11) NOT NULL auto_increment, `name` varchar(50) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; --虛擬用戶表 CREATE TABLE `virtual_users` ( `id` int(11) NOT NULL auto_increment, `domain_id` int(11) NOT NULL, `password` varchar(106) NOT NULL, `email` varchar(100) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `email` (`email`), FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; --虛擬用戶別名 CREATE TABLE `virtual_aliases` ( `id` int(11) NOT NULL auto_increment, `domain_id` int(11) NOT NULL, `source` varchar(100) NOT NULL, `destination` varchar(100) NOT NULL, PRIMARY KEY (`id`), FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
下面添加一些測試數據,其中,新增了郵箱用戶user@gogo.so,密碼為12345678:
INSERT INTO `mail`.`virtual_domains`(`name`) VALUES('gogo.so');
INSERT INTO `mail`.`virtual_users`(`domain_id`, `password` , `email`) VALUES ('1', ENCRYPT('12345678', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'user@gogo.so');
INSERT INTO `mail`.`virtual_aliases`(`domain_id`, `source`, `destination`) VALUES('1', 'alias@gogo.so', 'user@gogo.so');
在/etc/postfix/main.cf中添加下列配置
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf
#使用dovecot lmtp交付虛擬域郵件,省卻postfix配置用戶郵件目錄及權限問題 virtual_transport = lmtp:unix:private/dovecot-lmtp
#使用dovecot驗證,后面dovecot配置 smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth smtpd_sasl_auth_enable = yes smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination
配置Postfix支持Mysql查詢表
#虛擬域
新建文件/etc/postfix/mysql-virtual-mailbox-domains.cf ,並添加如下內容
user = mailuser password = mailuserpass hosts = 127.0.0.1 dbname = mail query = SELECT 1 FROM virtual_domains WHERE name='%s'
#虛擬用戶
新建文件/etc/postfix/mysql-virtual-mailbox-maps.cf ,並添加如下內容
user = mailuser password = mailuserpass hosts = 127.0.0.1 dbname = mail query = SELECT 1 FROM virtual_users WHERE email='%s'
#虛擬別名
新建文件/etc/postfix/mysql-virtual-alias-maps.cf ,並添加如下內容
user = mailuser password = mailuserpass hosts = 127.0.0.1 dbname = mail query = SELECT destination FROM virtual_aliases WHERE source='%s'
#修改文件/etc/postfix/main.cf ,將相應的值設為如下所示:
myhostname = mail.gogo.so mydomain = gogo.so myorigin = $mydomain inet_interfaces = all inet_protocols = ipv4 mydestination = $myhostname, localhost #local_recipient_maps設為空 local_recipient_maps = mynetworks = 127.0.0.0/8 home_mailbox = Maildir/
#重啟postfix使設置生效
service postfix restart
#測試查詢,看是否有數據返回
postmap -q gogo.so mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf postmap -q user@gogo.so mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf postmap -q alias@gogo.so mysql:/etc/postfix/mysql-virtual-alias-maps.cf
#Dovecot配置
修改文件/etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:/var/mail/vhosts/%d/%n
修改文件/etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = no #開啟明文驗證 auth_mechanisms = plain login #支持驗證方法 #!include auth-system.conf.ext #取消默認系統驗證 !include auth-sql.conf.ext #使用mysql驗證
修改文件/etc/dovecot/conf.d/10-logging.conf
auth_verbose = yes # 認證詳細日志
auth_debug = yes # 認證debug
修改文件/etc/dovecot/conf.d/10-ssl.conf
ssl = no
修改文件/etc/dovecot/conf.d/auth-sql.conf.ext
#用戶驗證 passdb { driver = sql args = /etc/dovecot/dovecot-sql.conf.ext } #用戶郵箱目錄 %d為domain,%n為user userdb { driver = static args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n }
新建文件/etc/dovecot/dovecot-sql.conf.ext
driver = mysql connect = host=127.0.0.1 dbname=mail user=mailuser password=mailuserpass default_pass_scheme = SHA512-CRYPT password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';
修改文件/etc/dovecot/conf.d/10-master.conf
#lmtp服務,postfix通過lmtp交付郵件 service lmtp { unix_listener /var/spool/postfix/private/dovecot-lmtp { mode = 0600 user = postfix group = postfix } } #驗證服務,postfix也通過此驗證用戶 service auth { unix_listener /var/spool/postfix/private/auth { mode = 0666 user = postfix group = postfix } unix_listener auth-userdb { mode = 0600 user = vmail #group = } user = dovecot } service auth-worker { user = vmail }
修改文件/etc/dovecot/conf.d/15-lda.conf
postmaster_address = postmaster@gogo.so
修改文件/etc/dovecot/dovecot.conf
protocols = imap pop3 lmtp
listen = *
新建用戶用以訪問郵件目錄數據
useradd -M -u 5000 vmail -d /var/mail -s /sbin/nologin chown -R vmail:vmail /var/mail/
重啟dovecot服務
service dovecot restart
完成,一切OK