最近公司需要一臺郵件服務器,在查閱了大量的資料以後決定採用Postfix + Dovecot + MySQL來搭建這套郵件系統。由於僅僅需要通過客戶端來收發郵件,因此不安裝Postfixadmin這類WEB管理工具。
系統環境
操作系統:CentOS 5.5 x64
安裝需要的包
更新系統
- yum update
YUM安裝Postfix,Dovecot,MySQL
CentOS base和update repository的Postfix版本不包括對MySQL的支持,我們需要從CentOS plus repository安裝Postfix,在使用YUM安裝之前,先修改etc/yum.repos.d/CentOS-Base.repo文件
- [base]
- name=CentOS-$releasever - Base
- ...
- exclude=postfix*
- #released updates
- [updates]
- name=CentOS-$releasever - Updates
- ...
- exclude=postfix*
YUM安裝所需軟件包
- yum --enablerepo=centosplus install postfix
- yum install dovecot mysql-server
配置MySQL
設置MySQL開機啓動
- chkconfig mysqld on
- service mysqld start
設置root密碼,刪除匿名賬號,刪除test庫
- mysql_secure_installation
創建Virtual Domains和Users
登陸MySQL,創建postfix數據庫
- CREATE DATABASE postfix
創建MySQL賬號,並賦權限
- GRANT SELECT, INSERT, UPDATE, DELETE ON postfix.* TO 'postfix_admin'@'localhost' IDENTIFIED BY 'postfix_admin_password';
- GRANT SELECT, INSERT, UPDATE, DELETE ON postfix.* TO 'postfix_admin'@'localhost.locahdomain' IDENTIFIED BY 'postfix_admin_password';
- FLUSH PRIVILEGES;
創建表結構
- CREATE TABLE domains (domain varchar(50) NOT NULL, PRIMARY KEY (domain) );
- CREATE TABLE forwardings (source varchar(80) NOT NULL, destination TEXT NOT NULL, PRIMARY KEY (source) );
- CREATE TABLE users (email varchar(80) NOT NULL, password varchar(20) NOT NULL, PRIMARY KEY (email) );
- CREATE TABLE transport ( domain varchar(128) NOT NULL default '', transport varchar(128) NOT NULL default '', UNIQUE KEY domain (domain) );
配置Postfix
創建virtual domain配置文件/etc/postfix/mysql-virtual_domains.cf
- user = postfix_admin
- password = postfix_admin_password
- dbname = postfix
- query = SELECT domain AS virtual FROM domains WHERE domain='%s'
- hosts = 127.0.0.1
創建virtual forwarding配置文件/etc/postfix/mysql-virtual_forwardings.cf
- user = postfix_admin
- password = postfix_admin_password
- dbname = postfix
- query = SELECT destination FROM forwardings WHERE source='%s'
- hosts = 127.0.0.1
創建virtual mailbox配置文件/etc/postfix/mysql-virtual_mailboxes.cf
- user = postfix_admin
- password = postfix_admin_password
- dbname = postfix
- query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s'
- hosts = 127.0.0.1
創建virtual email配置文件/etc/postfix/mysql-virtual_email2email.cf
- user = postfix_admin
- password = postfix_admin_password
- dbname = postfix
- query = SELECT email FROM users WHERE email='%s'
- hosts = 127.0.0.1
給配置文件設置合適的權限
- chmod o= /etc/postfix/mysql-virtual_*.cf
- chgrp postfix /etc/postfix/mysql-virtual_*.cf
創建處理email的用戶和組,所有的郵件都會存放在該用戶的home目錄下
- groupadd -g 5000 vmail
- useradd -g vmail -u 5000 vmail -d /home/vmail -m
執行以下命令完成Postfix的配置
- postconf -e 'myhostname = server.example.com'
- postconf -e 'mydestination = $myhostname, localhost, localhost.localdomain'
- postconf -e 'mynetworks = 127.0.0.0/8'
- postconf -e 'inet_interfaces = all'
- postconf -e 'message_size_limit = 30720000'
- postconf -e 'virtual_alias_domains ='
- postconf -e 'virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf'
- postconf -e 'virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf'
- postconf -e 'virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf'
- postconf -e 'virtual_mailbox_base = /home/vmail'
- postconf -e 'virtual_uid_maps = static:5000'
- postconf -e 'virtual_gid_maps = static:5000'
- postconf -e 'smtpd_sasl_type = dovecot'
- postconf -e 'smtpd_sasl_path = private/auth'
- postconf -e 'smtpd_sasl_auth_enable = yes'
- postconf -e 'broken_sasl_auth_clients = yes'
- postconf -e 'smtpd_sasl_authenticated_header = yes'
- postconf -e 'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination'
- postconf -e 'smtpd_use_tls = yes'
- postconf -e 'smtpd_tls_cert_file = /etc/pki/dovecot/certs/dovecot.pem'
- postconf -e 'smtpd_tls_key_file = /etc/pki/dovecot/private/dovecot.pem'
- postconf -e 'virtual_create_maildirsize = yes'
- postconf -e 'virtual_maildir_extended = yes'
- postconf -e 'proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps'
- postconf -e 'virtual_transport = dovecot'
- postconf -e 'dovecot_destination_recipient_limit = 1'
編輯/etc/postfix/master.cf文件,在文件底部增加dovecot服務
- dovecot unix - n n - - pipe
- flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -f ${sender} -d ${recipient}
停止sendmail,啓動postfix
- service sendmail stop
- chkconfig sendmail off
- chkconfig postfix on
- service postfix start
Postfix配置到這裏就完成了
配置Dovecot
Dovecot的配置文件是/etc/dovecot.conf,在編輯之前我們先備份一下
- cp -a /etc/dovecot.conf /etc/dovecot.conf-backup
修改/etc/dovecot.conf,修改過後的配置文件應該是這樣的
- grep -v "#" /etc/dovecot.conf | sed "/^\s*$/d"
- protocols = imap imaps pop3 pop3s
- log_timestamp = "%Y-%m-%d %H:%M:%S "
- mail_location = maildir:/home/vmail/%d/%n/Maildir
- ssl_cert_file = /etc/pki/dovecot/certs/dovecot.pem
- ssl_key_file = /etc/pki/dovecot/private/dovecot.pem
- namespace private {
- separator = .
- prefix = INBOX.
- inbox = yes
- }
- protocol lda {
- log_path = /home/vmail/dovecot-deliver.log
- auth_socket_path = /var/run/dovecot/auth-master
- postmaster_address = [email protected]
- }
- protocol pop3 {
- pop3_uidl_format = %08Xu%08Xv
- }
- auth default {
- user = root
- passdb sql {
- args = /etc/dovecot-sql.conf
- }
- userdb static {
- args = uid=5000 gid=5000 home=/home/vmail/%d/%n allow_all_users=yes
- }
- socket listen {
- master {
- path = /var/run/dovecot/auth-master
- mode = 0600
- user = vmail
- }
- client {
- path = /var/spool/postfix/private/auth
- mode = 0660
- user = postfix
- group = postfix
- }
- }
- }
由於用戶名和密碼是存放在MySQL中的,因此我們需要創建配置文件/etc/dovecot-sql.conf
- driver = mysql
- connect = host=127.0.0.1 dbname=postfix user=postfix_admin password=postfix_admin_password
- default_pass_scheme = CRYPT
- password_query = SELECT email as user, password FROM users WHERE email='%u';
更改/etc/dovecot-sql.conf權限,只允許dovecot組訪問
- chgrp dovecot /etc/dovecot-sql.conf
- chmod o= /etc/dovecot-sql.conf
啓動Dovecot
- chkconfig dovecot on
- service dovecot start
Dovecot配置完成
配置別名
編輯/etc/aliases
增加以下兩行內容:
- postmaster: root
- root: [email protected]
執行以下命令使新的別名生效,並重啓Postfix
- newaliases
- service postfix restart
測試Postfix和Dovecot
測試Postfix
使用telnet測試Postfix
- telnet localhost 25
連接到Postfix後輸入
- ehlo localhost
Postfix工作正常的話,輸出是
- Trying 127.0.0.1...
- Connected to localhost.
- Escape character is '^]'.
- 220 plato.example.com ESMTP Postfix
- ehlo localhost
- 250-plato.example.com
- 250-PIPELINING
- 250-SIZE 30720000
- 250-VRFY
- 250-ETRN
- 250-STARTTLS
- 250-AUTH PLAIN
- 250-AUTH=PLAIN
- 250-ENHANCEDSTATUSCODES
- 250-8BITMIME
- 250 DSN
測試Dovecot
使用telnet測試Dovecot
- telnet localhost pop3
Dovecot正常工作的話,輸出應該是
- Trying 127.0.0.1...
- Connected to localhost.localdomain.
- Escape character is '^]'.
- +OK Dovecot ready.
當Postfix和Dovecot測試都通過以後,我們接下來應該建立域和郵箱用戶了
建立域和郵箱用戶
在建立域之前,首先需要確認你的DNS服務器做了正確的MX解析,DNS做好之後,我們登錄MySQL插入域和郵箱用戶的記錄
- mysql -u root -p
- USE mail;
- INSERT INTO domains (domain) VALUES ('example.com');
- INSERT INTO users (email, password) VALUES ('[email protected]', ENCRYPT('password'));
測試MailBox
域和郵箱建立好之後,我們試着給用戶發送一封測試郵件
- mailx [email protected]
爲了確認是否收到郵件,我們進入郵箱目錄/home/vmail/example.com/sales/Maildir,輸入find命令
- find
應該能夠看到以下輸出
- .
- ./dovecot-uidlist
- ./cur
- ./new
- ./new/1285609582.P6115Q0M368794.li172-137
- ./dovecot.index
- ./dovecot.index.log
- ./tmp
接下來可以使用Foxmail,Outlook之類的客戶端工具來收發郵件了。
排錯
在安裝過程中有問題,可以通過以下日誌文件來查看日誌,排查問題
- /var/log/maillog
- /home/vmail/dovecot-deliver.log