CentOS Linux郵件系統搭建


背景

操作系統版本(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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM