在 CentOS 7 上搭建屬於自己的 「完美」 郵件系統

更正

步驟 8.4 中的三個 special_use = 後面差了反斜杠,已補上。這可能是由於多次的複製粘貼被編輯器忽略了。

步驟 9.1 中 Selector 後面應該為 mail 而不是 default ,已更正。這是由於我沒測試 DNS 造成的(測試環境中沒搭建 DNS 伺服器)。

(感謝知乎網友 anonymous03 )

(文章很長哦)

一、前言

為什麼要自己搭建郵件系統?

  • 自從小學上信息技術課接觸到電子郵件開始,我就對 @ 後面那幾個字母充滿了疑惑,為什麼 @ 後面的幾個字母一定要是 qq 、gmail 呢?難道不能自定義嗎?直到初三我弄懂了域名這個概念之後,這個謎團才被解開:我們用的是別人的伺服器來使用電子郵件服務。自己有域名當然也可以搭建一個啊!由於當時還基本上沒有雲主機這種東西,而且家裡也不讓我整天開著電腦(電信有公網 IP ),所以該計劃暫時擱置。直到前年,用 163 郵箱的 Apple ID 大規模被盜(很慶幸我逃過了一劫),我這才明白了自己有個郵箱伺服器那是多麼重要!恰好高考完了,可以折騰一番了。當時用的是傻瓜式的 macOS Server ,啥原理都不懂,點幾下就搭建成功了,就這樣湊合著用了一年,系統非常穩定,除了停電以及升級系統之外沒有重啟過(這裡贊一下 macOS Server )。macOS Server 最大的缺點就是可以自己定製的功能太少了!現在熟悉了 Linux 的基本操作和伺服器的基礎知識,是時候該在 Linux 平台上搭建一個了!
  • 其實,Linux 上也有傻瓜式郵件系統,iRedMail 就是其中之一。不過我玩 Linux 的目的就是為了學習伺服器以及網路知識,還是自己搭建一個才能學到東西。

郵件系統所涉及的模塊較多,而且軟體又是不斷更新的,不同 Linux 發行版的系統環境和默認配置文件也可能不相同,想只看一篇教程然後一次完美的幾率太低了。我自己折騰了一個星期,中途也遇到過各種各樣的錯誤,不過好在最後都解決了。所以說,想要自己親手搭建一個完美的郵件系統,耐心是必不可少的。

我把我搭建的整個過程整理一下,步驟盡量精簡,然後寫下了這一篇文章,主要目的是想給大家分享下我的學習經驗,讓新手少走一點彎路,也能給自己增加點印象。所有的步驟(除了域名參數)我在寫完之後都有重裝系統然後全部重新走一遍驗證一次。如果想提高一次成功的幾率,建議使用全新安裝的系統,然後嚴格按照我的步驟要求來做。如有錯誤,請及時留言提出,謝謝!

二、所需軟體 & 環境

  • 操作系統:CentOS 7.3.1611 最小安裝 (已關閉 SELinux 和防火牆)
  • 應用軟體: Postfix 2.10.1 、Dovecot 2.2.10 、MariaDB 5.5.52 、OpenDKIM 2.11.0 、Nginx 1.10.2 、PHP 5.4.16 、Roundcube WebMail 1.3.0
  • 域名: example.com
  • 公網 IP: 1.1.1.1
  • example.com mail.example.com 數字證書 (推薦免費的 Lets Encrypt )

說明

  1. 下文的 MySQL 均代表 MariaDB 。
  2. Nginx 和 PHP 不做詳細配置,只確保 Webmail 可以正常使用。

三、原理 & 關係圖

不用過多的解釋,兩張圖說明足以一切。

說明

? SMTP 是 Postfix 發件的模塊,SMTPD 是 Postfix 收件的模塊,請注意區分。

四、安裝軟體

yum -y update && yum -y install epel-release && yum -y update && yum -y install postfix dovecot dovecot-mysql mariadb-server opendkim nginx php-mysql php-fpm php-xml php-mbstring wget tarn

若出現密鑰警告,按 y 回車即可。

五、配置 MySQL

5.1 初始化 MySQL

5.1.1 啟動服務

systemctl start mariadbn

5.1.2 進行安全設置

mysql_secure_installation nnnnNOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQLn SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!nnIn order to log into MySQL to secure it, well need the currentnpassword for the root user. If youve just installed MySQL, andnyou havent set the root password yet, the password will be blank,nso you should just press enter here.nnEnter current password for root (enter for none): t#回車即可nOK, successfully used password, moving on...nnSetting the root password ensures that nobody can log into the MySQLnroot user without the proper authorisation.nnSet root password? [Y/n] yt#使用密碼驗證nNew password: t#輸入 root 密碼nRe-enter new password: nPassword updated successfully!nReloading privilege tables..n ... Success!nn#後面的問題全部按y回車,這裡省略。n

5.2 郵件系統資料庫的創建

注意

? SQL 語句後面要加上分號才能執行。

5.2.1 進入 MySQL 命令行界面

mysql -u root -pnnEnter password: #輸入密碼按回車n

出現 MariaDB [(none)]> 指示符就說明進入了。

5.2.2 創建一個用戶用於讀取郵件系統資料庫

CREATE USER mail_sys@localhost IDENTIFIED BY mail_sys;n

5.2.3 創建郵件系統資料庫

CREATE DATABASE mail_sys;n

說明

? 這裡的「郵件系統資料庫」並不存儲郵件,只用作域名、用戶、別名的驗證。郵件默認是存儲在 /var/spool/mail 裡面的。

5.2.4 為用戶授予讀取許可權

GRANT SELECT ON mail_sys.* TO mail_sys@localhost IDENTIFIED BY mail_sys;n

5.2.5 刷新許可權表

FLUSH PRIVILEGES;n

5.2.6 進入郵件系統資料庫

USE mail_sys;n

5.2.7 創建域名表

CREATE TABLE `domains` ( `id` int(20) NOT NULL auto_increment, `name` varchar(100) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;n

5.2.8 創建用戶表

CREATE TABLE `users` ( `id` int(20) NOT NULL auto_increment, `domain_id` int(20) NOT NULL, `password` varchar(200) NOT NULL, `email` varchar(200) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `email` (`email`), FOREIGN KEY (domain_id) REFERENCES domains(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;n

5.2.9 創建別名表

CREATE TABLE `aliases` ( `id` int(20) NOT NULL auto_increment, `domain_id` int(20) NOT NULL, `source` varchar(200) NOT NULL, `destination` varchar(200) NOT NULL, PRIMARY KEY (`id`), FOREIGN KEY (domain_id) REFERENCES domains(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;n

5.3 往郵件系統資料庫里添加或刪除域名、用戶、別名

說明

  1. 為了方便以後添加或刪除,下面我把 SQL 語句的格式寫出來。
  2. 索引號從 1 開始依次遞增,需手動指定。
  3. 由於密碼需要使用 SQL 語句進行 SHA512 運算來存儲散列值,因此圖形化資料庫管理工具可能無法實現。
  4. 當添加多行數據時,非末行的行分隔符為逗號,直到末行才使用分號。

5.3.1 添加或刪除域名

添加域名

INSERT INTO `mail_sys`.`domains` (`id` ,`name`) nVALUES (<域名索引號>, <域名>);n

例如

MariaDB [mail_sys]> INSERT INTO `mail_sys`.`domains` (`id` ,`name`) n -> VALUES (1, example.com);n

刪除域名

DELETE FROM `mail_sys`.`domains` WHERE `id`=<域名索引號>;n

5.3.2 添加或刪除用戶

添加用戶

INSERT INTO `mail_sys`.`users`n(`id`, `domain_id`, `password` , `email`) VALUESn(<用戶索引號>, <域名索引號>, ENCRYPT(<密碼>, CONCAT($6$, SUBSTRING(SHA(RAND()), -16))), <郵箱地址>),n(<用戶索引號>, <域名索引號>, ENCRYPT(<密碼>, CONCAT($6$, SUBSTRING(SHA(RAND()), -16))), <郵箱地址>),n(<用戶索引號>, <域名索引號>, ENCRYPT(<密碼>, CONCAT($6$, SUBSTRING(SHA(RAND()), -16))), <郵箱地址>);n

例如

MariaDB [mail_sys]> INSERT INTO `mail_sys`.`users`n -> (`id`, `domain_id`, `password` , `email`) VALUESn -> (1, 1, ENCRYPT(12345678, CONCAT($6$, SUBSTRING(SHA(RAND()), -16))), user1@example.com),n -> (2, 1, ENCRYPT(password, CONCAT($6$, SUBSTRING(SHA(RAND()), -16))), user2@example.com),n -> (3, 1, ENCRYPT(11111111, CONCAT($6$, SUBSTRING(SHA(RAND()), -16))), user3@example.com);n#以後再繼續添加用戶名的時候,用戶索引就應該從4開始,下同。n

刪除用戶

DELETE FROM `mail_sys`.`users` WHERE `id`=<用戶索引號>;n

5.3.3 添加或刪除別名(可選)

說明

? 別名的意思就比如說:設置 user1@example.com 的別名是 user11@example.com ,那麼其他人往 user11@example.com 里發送郵件時,郵件就會到 user1@example.com 的郵箱里去。

添加別名

INSERT INTO `mail_sys`.`aliases`n(`id`, `domain_id`, `source`, `destination`) VALUESn(<別名索引號>, <域名索引號>, <別名地址>, <目的地址>),n(<別名索引號>, <域名索引號>, <別名地址>, <目的地址>),n(<別名索引號>, <域名索引號>, <別名地址>, <目的地址>);n

例如

MariaDB [mail_sys]> INSERT INTO `mail_sys`.`aliases`n -> (`id`, `domain_id`, `source`, `destination`) VALUESn -> (1, 1, user11@example.com, user1@example.com),n -> (2, 1, user22@example.com, user2@example.com),n -> (3, 1, user33@example.com, user3@example.com);n

刪除別名

DELETE FROM `mail_sys`.`aliases` WHERE `id`=<別名索引號>;n

5.4 檢查資料庫

5.4.1 檢查域名表

SELECT * FROM mail_sys.domains;n

若出現以下格式的輸出結果,說明設置正確。

+----+-------------+n| id | name |n+----+-------------+n| 1 | example.com |n+----+-------------+n1 row in set (0.00 sec)n

5.4.2 檢查用戶表

SELECT * FROM mail_sys.users;n

若出現以下格式的輸出結果,說明設置正確。

+----+-----------+------------------------------------------------------------------------------------------------------------+-------------------+n| id | domain_id | password | email |n+----+-----------+------------------------------------------------------------------------------------------------------------+-------------------+n| 1 | 1 | $6$afbdd821f68a3f27$QH9yDKslGZMNZjzvBBvMtYXzzclbnNgb1AhmB7lqu6fj6PU04QTgCTvcvPwqsAaW6mJt9kcKPicN0VCQGalg5/ | user1@example.com |n| 2 | 1 | $6$a4f819161bd19901$oeDntXEyiY6RiM369ugKZrMfsK6yeV3CG/fhFF4ruPJImLCyzi2hR/PX8f2nBDBRWiMvWv7zWiNv5yEruRsW// | user2@example.com |n| 3 | 1 | $6$2a85aaab0ec76f64$KRQ2H8Zgn0YjTzDDnfwqim3mZynZ05iPMZ1GQPw7GNuJApcXuLi5LOmR9yDC6Jh2eAKbhuG4lgHG.I5FdIrf4. | user3@example.com |n+----+-----------+------------------------------------------------------------------------------------------------------------+-------------------+n3 rows in set (0.00 sec)n

5.4.3 檢查別名表(可選)

SELECT * FROM mail_sys.aliases;n

若出現以下格式的輸出結果,說明設置正確。

+----+-----------+--------------------+-------------------+n| id | domain_id | source | destination |n+----+-----------+--------------------+-------------------+n| 1 | 1 | user11@example.com | user1@example.com |n| 2 | 1 | user22@example.com | user2@example.com |n| 3 | 1 | user33@example.com | user3@example.com |n+----+-----------+--------------------+-------------------+n3 rows in set (0.00 sec)n

資料庫設置完成。按 Ctrl + D 退出 MySQL 命令行界面。

六、設置郵件系統專用用戶

說明

  1. 所有的郵件用戶都映射到系統的同一個真實的用戶上。
  2. 不建議直接使用系統自帶的 mail 賬戶。

6.1 創建郵件系統專用組

groupadd -g 2000 mail_sysn

6.2 創建郵件系統專用用戶

useradd -g mail_sys -u 2000 mail_sys -d /var/spool/mail -s /sbin/nologinn

6.3 修改郵件目錄所有者

chown -R mail_sys:mail_sys /var/spool/mailn

七、配置 Postfix

7.1 備份原版配置文件

cp -r /etc/postfix /etc/postfix.bakn

7.2 修改 main.cf

說明

? 該文件配置 Postfix 的全局參數。

cat > /etc/postfix/main.cf << EOFn

請按實際情況以及注釋提示修改以下內容,完成去除 # 號和後面的注釋,然後粘貼到命令行窗口中按回車即可。

myhostname = example.comtttt#本機域名,需要修改nalias_maps = hash:/etc/aliasesnalias_database = hash:/etc/aliasesnmyorigin = /etc/mailnamenmydestination = localhostnrelayhost =nmynetworks = 127.0.0.0/8nmailbox_size_limit = 0nrecipient_delimiter = +ninet_interfaces = allnsmtpd_banner = $myhostname ESMTP $mail_namenbiff = nonappend_dot_mydomain = nonreadme_directory = nonsmtpd_tls_cert_file=/etc/pki/tls/certs/cert.pemtt# example.com 證書文件位置,需要修改nsmtpd_tls_key_file=/etc/pki/tls/certs/key.pemtt# example.com 證書私鑰文件位置,需要修改nsmtpd_use_tls=yesnsmtpd_tls_auth_only = nonsmtpd_tls_security_level = maynsmtp_tls_security_level = maynvirtual_transport = lmtp:unix:private/dovecot-lmtpnsmtpd_sasl_type = dovecotnsmtpd_sasl_path = private/authnsmtpd_sasl_auth_enable = yesnvirtual_mailbox_domains = mysql:/etc/postfix/mysql_mailbox_domains.cfnvirtual_mailbox_maps = mysql:/etc/postfix/mysql_mailbox_maps.cfnvirtual_alias_maps = mysql:/etc/postfix/mysql_alias_maps.cf, mysql:/etc/postfix/mysql_email2email.cfnsmtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destinationnvirtual_uid_maps = static:2000nvirtual_gid_maps = static:2000nmessage_size_limit = 102400000nEOFn

7.3 修改 master.cf

說明

? 該文件配置 Postfix 中各模塊的參數。

cat > /etc/postfix/master.cf << EOFn

以下內容直接粘貼到命令行窗口中按回車即可。

smtp inet n - n - - smtpdnsubmission inet n - n - - smtpdn -o syslog_name=postfix/submissionn -o smtpd_tls_security_level=encryptn -o smtpd_sasl_auth_enable=yesn -o smtpd_tls_auth_only=no n -o smtpd_client_restrictions=permit_sasl_authenticated,rejectn -o milter_macro_daemon_name=ORIGINATINGnpickup unix n - n 60 1 pickupncleanup unix n - n - 0 cleanupnqmgr unix n - n 300 1 qmgrntlsmgr unix - - n 1000? 1 tlsmgrnrewrite unix - - n - - trivial-rewritenbounce unix - - n - 0 bouncendefer unix - - n - 0 bouncentrace unix - - n - 0 bouncenverify unix - - n - 1 verifynflush unix n - n 1000? 0 flushnproxymap unix - - n - - proxymapnproxywrite unix - - n - 1 proxymapnsmtp unix - - n - - smtpnrelay unix - - n - - smtpn -o smtp_helo_timeout=120 -o smtp_connect_timeout=120nshowq unix n - n - - showqnerror unix - - n - - errornretry unix - - n - - errorndiscard unix - - n - - discardnlocal unix - n n - - localnvirtual unix - n n - - virtualnlmtp unix - - n - - lmtpnanvil unix - - n - 1 anvilnscache unix - - n - 1 scachennEOFn

7.4 與 MySQL 對接

7.4.1 指定域名數據表

cat > /etc/postfix/mysql_mailbox_domains.cf << EOFn

以下內容直接粘貼到命令行窗口中按回車即可。

user = mail_sysnpassword = mail_sysnhosts = localhostndbname = mail_sysnquery = SELECT 1 FROM domains WHERE name=%snEOFn

7.4.2 指定用戶數據表

cat > /etc/postfix/mysql_mailbox_maps.cf << EOFn

以下內容直接粘貼到命令行窗口中按回車即可。

user = mail_sysnpassword = mail_sysnhosts = localhostndbname = mail_sysnquery = SELECT 1 FROM users WHERE email=%snEOFn

7.4.3 指定別名數據表

cat > /etc/postfix/mysql_alias_maps.cf << EOFn

以下內容直接粘貼到命令行窗口中按回車即可。

user = mail_sysnpassword = mail_sysnhosts = localhostndbname = mail_sysnquery = SELECT destination FROM aliases WHERE source=%snEOFn

7.4.4 指定用戶收件目標數據表

(這個有點懵,Linode 上面的教程要求添加這個,懂的大神麻煩解釋下)

cat > /etc/postfix/mysql_email2email.cf << EOFn

以下內容直接粘貼到命令行窗口中按回車即可。

user = mail_sysnpassword = mail_sysnhosts = localhostndbname = mail_sysnquery = SELECT email FROM users WHERE email=%snEOFn

7.5 測試資料庫讀取

7.5.1 啟動 Postfix 服務

systemctl start postfixn

7.5.2 測試域名數據表的讀取

下面的 http://example.com 請替換為自己設定的域名。

postmap -q example.com mysql:/etc/postfix/mysql_mailbox_domains.cfn

若返回 1 ,則說明設置正確。

7.5.3 測試用戶名數據表的讀取

下面的 user2@example.com 請替換為自己設定的用戶名其中一個。

postmap -q user2@example.com mysql:/etc/postfix/mysql_mailbox_maps.cfn

若返回 1 ,則說明設置正確。

7.5.4 測試別名數據表的讀取(可選)

下面的 user11@example.com 請替換為自己設定的別名其中一個。

postmap -q user11@example.com mysql:/etc/postfix/mysql_alias_maps.cfn

若返回別名所對應的真實用戶名 ,則說明設置正確。

7.5.5 停止 Postfix 服務

等全部配置完成後再啟動。

systemctl stop postfixn

八、配置 Dovecot

8.1 備份原版配置文件

cp -r /etc/dovecot /etc/dovecot.bakn

8.2 修改 dovecot.conf

說明

? 該文件配置 Dovecot 的全局參數。

cat > /etc/dovecot/dovecot.conf << EOFn

以下內容直接粘貼到命令行窗口中按回車即可。

protocols = imap lmtpndict {n}n!include conf.d/*.confn!include_try local.confnEOFn

8.3 修改 conf.d/10-mail.conf

說明

? 該文件配置郵箱文件存儲的位置和命名空間。

cat > /etc/dovecot/conf.d/10-mail.conf << EOFn

以下內容直接粘貼到命令行窗口中按回車即可。

namespace inbox {n inbox = yesn}nfirst_valid_uid = 1000nmbox_write_locks = fcntlnmail_location = maildir:/var/spool/mail/%d/%nnmail_privileged_group = mailnEOFn

8.4 修改 conf.d/15-mailboxes.conf

說明

? 該文件配置郵箱內部的目錄結構。

cat > /etc/dovecot/conf.d/15-mailboxes.conf << EOFn

以下內容直接粘貼到命令行窗口中按回車即可。

namespace inbox {n mailbox Drafts {n auto = createn special_use = Draftsn }n mailbox Trash {n auto = createn special_use = Trashn }n mailbox Sent {n auto = createn special_use = Sentn }n}nEOFn

8.5 修改 conf.d/10-auth.conf

說明

? 該文件配置用戶身份認證流程。

cat > /etc/dovecot/conf.d/10-auth.conf << EOFn

以下內容直接粘貼到命令行窗口中按回車即可。

auth_mechanisms = plain loginn!include auth-sql.conf.extnEOFn

8.6 修改 conf.d/auth-sql.conf.ext

說明

? 該文件配置資料庫認證的參數。

cat > /etc/dovecot/conf.d/auth-sql.conf.ext << EOFn

以下內容直接粘貼到命令行窗口中按回車即可。

passdb {n driver = sqln args = /etc/dovecot/dovecot-sql.conf.extn}nuserdb {n driver = staticn args = uid=mail_sys gid=mail_sys home=/var/spool/mail/%d/%nn}nEOFn

8.7 修改 dovecot-sql.conf.ext

說明

? 該文件配置驗證用戶名密碼所用的數據表以及認證方法。

cat > /etc/dovecot/dovecot-sql.conf.ext << EOFn

以下內容直接粘貼到命令行窗口中按回車即可。

driver = mysqlnconnect = host=localhost dbname=mail_sys user=mail_sys password=mail_sysndefault_pass_scheme = SHA512-CRYPTnpassword_query = SELECT email as user, password FROM users WHERE email=%u;nEOFn

8.8 修改 conf.d/10-ssl.conf

說明

? 該文件配置 SSL 加密參數。

cat > /etc/dovecot/conf.d/10-ssl.conf << EOFn

請按實際情況以及注釋提示修改以下內容,完成去除 # 號和後面的注釋,然後粘貼到命令行窗口中按回車即可。

ssl = requirednssl_cert = </etc/pki/tls/certs/cert.pemt# example.com 證書文件位置,需要修改tnssl_key = </etc/pki/tls/certs/key.pemt# example.com 證書私鑰文件位置,需要修改tnssl_protocols = !SSLv3nssl_cipher_list = ALL:!LOW:!SSLv3:!EXP:!aNULLnssl_prefer_server_ciphers = nonEOFn

8.9 修改 conf.d/10-master.conf

說明

? 該文件配置 Dovecot 中各服務的參數。

cat > /etc/dovecot/conf.d/10-master.conf << EOFn

以下內容直接粘貼到命令行窗口中按回車即可。

service imap-login {n inet_listener imap {n port = 143n }n inet_listener imaps {n port = 993n ssl = yesn }n}nnservice lmtp {n unix_listener /var/spool/postfix/private/dovecot-lmtp {n mode = 0600n user = postfixn group = postfixn }n}nnservice imap {nn}nnservice auth {n unix_listener /var/spool/postfix/private/auth {n mode = 0666n user = postfixn group = postfixn }nn unix_listener auth-userdb {n mode = 0600n user = mail_sysn }n user = dovecotn}nnservice auth-worker {n user = mail_sysn}nEOFn

九、配置 OpenDKIM

9.1 修改 OpenDKIM 配置文件

cat > /etc/opendkim.conf << EOFn

請按實際情況以及注釋提示修改以下內容,完成去除 # 號和後面的注釋,然後粘貼到命令行窗口中按回車即可。

Syslog yesnUMask 002nOversignHeaders FromnSocket inet:8891@127.0.0.1nDomain example.com #本機域名,需要修改nKeyFile /etc/opendkim/keys/mail.privatenSelector mailnRequireSafeKeys nonEOFn

9.2 生成私鑰

下面的 http://example.com 請替換成您的域名。

opendkim-genkey -D /etc/opendkim/keys/ -d example.com -s mail && chown -R opendkim:opendkim /etc/opendkim/keys/n

9.3 配置 Postfix 的 main.cf

配置發件增加 DKIM 簽名。

cat >> /etc/postfix/main.cf << EOFn

以下內容直接粘貼到命令行窗口中按回車即可。

milter_protocol = 2nmilter_default_action = acceptnsmtpd_milters = inet:localhost:8891nnon_smtpd_milters = inet:localhost:8891nEOFn

9.4 啟動所有服務

systemctl start postfix dovecot opendkimn

如需開機啟動,請執行以下命令。

systemctl enable postfix dovecot opendkim mariadbn

十、配置域名參數

以下項目需要在域名服務商或雲主機服務商的控制面板中設置。下文的域名服務商以 DNSPOD 為例,其他域名服務商或雲主機服務商請自行參閱相關說明文檔。

10.1 A 記錄的設定

在域名控制面板中添加一條記錄,主機記錄@ ,記錄類型A 記錄值1.1.1.1 ,其他保持默認,保存即可。

10.2 MX 記錄的設定

在域名控制面板中添加一條記錄,主機記錄@ ,記錄類型MX ,記錄值http://mail.example.com,其他保持默認;

再添加一條記錄,主機記錄mail ,記錄類型A ,記錄值1.1.1.1,其他保持默認,保存即可。

10.3 SPF 記錄的設定

在域名控制面板中添加一條記錄,主機記錄@ ,記錄類型TXT ,記錄值v=spf1 mx -all,其他保持默認,保存即可。

10.4 DMARC 記錄的設定

在域名控制面板中添加一條記錄,主機記錄_dmarc ,記錄類型TXT ,記錄值v=DMARC1; p=none,其他保持默認,保存即可。

10.5 DKIM 記錄的設定

(以我的密鑰文件為例)

執行以下命令

cat /etc/opendkim/keys/mail.txt n

會出現以下結果

mail._domainkeytINtTXTt( "v=DKIM1; k=rsa; "nt "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDU5nkxbS36hOa2FCJqotvahTbxb83CvLt5XqV4WAPzJQmfaA1eHyvOz9XiZgE8vWRgP2jJFlL+J4yEroB3YV/8EBjAM8lFTi31DVgRsoHMwH6f3GuLAfcuVofymDfRxHxPzIlm7rgzfWwrGcPrIzt64NLuZG4yusTWp8MTfWZxvQIDAQAB" ) ; ----- DKIM key default for example.comn

把括弧內的值複製出來,去掉所有引號並整理成一行,形如:

v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDU5nkxbS36hOa2FCJqotvahTbxb83CvLt5XqV4WAPzJQmfaA1eHyvOz9XiZgE8vWRgP2jJFlL+J4yEroB3YV/8EBjAM8lFTi31DVgRsoHMwH6f3GuLAfcuVofymDfRxHxPzIlm7rgzfWwrGcPrIzt64NLuZG4yusTWp8MTfWZxvQIDAQABn

在域名控制面板中添加一條記錄,主機記錄mail._domainkey ,記錄類型TXT ,記錄值v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDU5nkxbS36hOa2FCJqotvahTbxb83CvLt5XqV4WAPzJQmfaA1eHyvOz9XiZgE8vWRgP2jJFlL+J4yEroB3YV/8EBjAM8lFTi31DVgRsoHMwH6f3GuLAfcuVofymDfRxHxPzIlm7rgzfWwrGcPrIzt64NLuZG4yusTWp8MTfWZxvQIDAQAB,其他保持默認,保存即可。

上述五個步驟完成後域名控制面板的效果如圖

10.6 IP 反向解析的設定

這個……普通家庭寬頻用戶就別想了,企業寬頻和國內雲主機用戶需要網站通過備案才能設置。如果用國外雲主機的話,有些可以支持(我使用的 Vultr 支持)。為您的域名配置 IP 地址反向解析可以大幅降低外發郵件被拒收的幾率。

十一、配置 Web 郵箱

11.1 下載並安裝 Roundcube

11.1.1 下載

wget https://github.com/roundcube/roundcubemail/releases/download/1.3.0/roundcubemail-1.3.0-complete.tar.gzn

11.1.2 解壓 & 安裝

tar -xf roundcubemail-1.3.0-complete.tar.gz && mv roundcubemail-1.3.0 /usr/share/roundcube && chown -R apache:apache /usr/share/roundcuben

11.2 配置 Nginx 、PHP

11.2.1 配置 Nginx

vi /etc/nginx/conf.d/mail.confn

請按實際情況以及注釋提示修改以下內容,在命令行窗口按下 i ,將內容直接粘貼到命令行窗口中,再按下 ESC ,最後輸入 :wq 按回車。

server {n listen 80;n server_name mail.example.com; # 本機域名前面加上mail. 需要修改n return 301 https://$server_name$request_uri;n}nnserver {n listen 443 ssl http2;n server_name mail.example.com; # 本機域名前面加上mail. 需要修改n ssl_certificate "/etc/pki/tls/certs/cert.pem"; # mail.example.com 證書文件位置,需要修改n ssl_certificate_key "/etc/pki/tls/certs/key.pem"; # mail.example.com 證書私鑰文件位置,需要修改n add_header Strict-Transport-Security "max-age=15552000; includeSubDomains";n location / {n root /usr/share/roundcube;n index index.php; n }tntlocation ~ .php$ {n root /usr/share/roundcube;n fastcgi_pass 127.0.0.1:9000;n fastcgi_index index.php;n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;n include fastcgi_params;n }nn}n

11.2.2 配置 PHP

設置時區

echo "date.timezone = Asia/Shanghai" >> /etc/php.ini n

創建會話文件夾

mkdir /var/lib/php/session && chown apache:apache /var/lib/php/sessionn

11.3 配置資料庫

11.3.1 進入 MySQL 命令行界面

mysql -u root -pnnEnter password: #輸入密碼按回車n

出現 MariaDB [(none)]> 指示符就說明進入了。

11.3.2 創建一個用戶用於讀寫 Roundcube 資料庫

CREATE USER roundcube@localhost IDENTIFIED BY roundcube;n

11.3.3 創建 Roundcube 資料庫

CREATE DATABASE roundcube;n

11.3.4 為用戶授予讀寫許可權

GRANT ALL ON roundcube.* TO roundcube@localhost IDENTIFIED BY roundcube;n

11.3.5 刷新許可權表

FLUSH PRIVILEGES;n

資料庫設置完成。按 trl + D 退出 MySQL 命令行界面。

11.4 啟動服務

systemctl start nginx php-fpmn

如需開機啟動,請執行以下命令。

systemctl enable nginx php-fpmn

11.5 配置 Roundcube

打開瀏覽器,輸入 mail.example.com/instal ,回車打開。然後按圖片提示進行配置。

配置完成後,關閉瀏覽器頁面。執行以下命令來使安裝程序不可用。

chmod -R 000 /usr/share/roundcube/installer/n

11.6 登錄!

打開瀏覽器,輸入 https://mail.example.com ,然後輸入您的用戶名密碼登錄。

登錄之後,默認只會有一個收件箱,我們再設置一下就完美了!

最終效果如下圖

十二、收發件測試

12.1 收件測試

非常簡單,從 QQ 或者 Gmail 給自己的郵箱發一封郵件,如果可以收到,說明外網已經可以連通這台伺服器了。

12.2 發件測試

打開瀏覽器,輸入 http://www.mail-tester.com ,回車打開。發一封郵件到它指定的郵箱里。然後過一分鐘左右查看下結果,重點檢查 SPF 記錄DMARC 記錄DKIM 簽名是不是有效的。如果都是有效的,那恭喜您!您的郵件系統已經搭建完了!至於這個得分,由於受 IP 地址可能被拉黑的影響,因此各人的分數有可能不同。如果有 8 分以上的話發出去的郵件基本上就不會被拒收了。如果很不幸 IP 地址被拉黑了,建議換一個 IP 地址。

教程完!

十三、不完美的地方 & 總結

  • 之所以標題上的完美打了個雙引號,原因之一是本來我計劃配置垃圾郵件過濾和來信校驗 SFP 功能的,但是不知道是不是我設置錯誤還是網路問題,很多非垃圾郵件都被拒收了,在網上搜索了兩天還是無解,所以暫時放棄。( PS :幾個月前我用過一次 iRedMail ,裡面的垃圾郵件過濾模塊也同樣導致很多非垃圾郵件被拒收,所以我感覺網路問題大一些。)
  • 此外,這個郵件系統並沒有實現使用 Web 界面管理郵件系統(如增減用戶)的功能,由於我搭建的郵件系統只有我一個人在用,所以近期也就不想折騰啦。
  • 最後非常感謝能夠耐心讀完這篇文章的人,希望您有所收穫!如果想轉載本文,可以的話請留下言然後註明下出處,謝謝啦~

參考文獻

  1. Email with Postfix, Dovecot, and MySQL
  2. How To Configure a Mail Server Using Postfix, Dovecot, MySQL, and SpamAssassin
  3. Postfix+Dovecot+MySQL搭建郵件伺服器
  4. Ubuntu Postfix Mail Server 設定筆記 (一) MTA (SPF, DKIM, rDNS 及 DMARC)
  5. Debian 8 Server搭建Postfix+Dovecot郵件伺服器
  6. How to install Roundcube
  7. Running Roundcube 0.7.1 On Nginx (LEMP) On Debian Squeeze/Ubuntu 11.10

推薦閱讀:

如何更換CentOS(Linux)系統默認字體?
如何詳細解釋圖片《我眼中的各 Linux 發行版用戶》?
在 Linux 環境下能用 Homebrew 嗎?
如何把VPS上的整個系統備份下來?

TAG:Linux运维 | Linux | CentOS |