本系列第四篇: 設定 MSA (Mail Submission Agent)
讓使用者透過伺服器發送郵件
一般使用者的發送 Email 的流程,不是 Webmail 就是用 SMTP。
這裡 SMTP 清晰一點是 SMTP Submission,即是 MUA 透過 MSA 委托 MTA 代為傳送郵件 (Relay)。
而 SMTP Submission 當然需要有登入設定,不然肯定會成為 Spam Mail 的 Open Relay了。
現在的 Postfix 預設設定已經不允許 Open Relay,所以必需先設定登入機制才能外部使用。
Postfix 使用模組化的設計,各部分都是分開的。
換句話說您可以使用很多不同的登入插件,
SASL (Simple Authentication and Security Layer) 就提供 Postfix 和 登入插件間的溝通。
Postfix 目前支援 Cyrus 和 Dovecot 的 SASL 實作。
本部分是為了將 SMTP 的 MSA 登入驗證整合到 Dovecot。
2017-04-26 更新: 更新文章格式
1. 啟用 SMTP Submission Port 587
之前提到很多 ISP 封鎖了 Port 25 的連線,所以要改用協議中定義的 Port 587 來收件。
修改 /etc/postfix/master.cf,把這一行 Uncomment 就好了。
submission inet n - - - - smtpd
當然不要忘記設定 Firewall 允許 Port 587 連線通過。
2. Dovecot SASL / Postfix 整合
啟用 Dovecot 內建的 SASL,修改 /etc/dovecot/conf.d/10-master.conf
Uncomment “#Postfix smtp-auth” 下面一段,並加入 user 及 group。
service auth { # auth_socket_path points to this userdb socket by default. It's typically # used by dovecot-lda, doveadm, possibly imap process, etc. Its default # permissions make it readable only by root, but you may need to relax these # permissions. Users that have access to this socket are able to get a list # of all usernames and get results of everyone's userdb lookups. unix_listener auth-userdb { #mode = 0600 #user = #group = } # Postfix smtp-auth unix_listener /var/spool/postfix/private/auth { mode = 0666 user = postfix group = postfix } # Auth process is run as this user. #user = $default_internal_user }
Dovecot 建議只在 SMTP Submission (Port 587) 啟用 SASL 驗證,
原因是當 Dovecot SASL 不可用時,也不至於連收信都失敗。
我們就按指引完成:
修改 /etc/postfix/master.cf,把之前指定在 main.cf 的設定都搬過來,並指定 SASL Socket Path
submission inet n - - - - smtpd -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination,reject_authenticated_sender_login_mismatch -o smtpd_sasl_local_domain=$myhostname -o smtpd_sasl_auth_enable=yes -o smtpd_sasl_security_options=noanonymous -o smtpd_sasl_type=dovecot -o smtpd_sasl_path=private/auth -o broken_sasl_auth_clients=yes
這個 master.cf 的格式 非常嚴格,我修改時錯了很多次:
- = 前後都不能有空格
- -o 前面必需有空格
- 每項 Option 的 Value 必不能有空格
- 不能換行,smtpd_recipient_restrictions 要用逗號隔開
修改完成用 Telnet 測試:
telnet 127.0.0.1 587
如果有沒有出現 220 Response 的話,恭喜中獎了
220 server.tiger-workshop-mail.com ESMTP Postfix
失敗的話,看看 Log 紀錄那邊出錯吧
tail /var/log/mail.log
設定成功後, 使用您最熟識的 SMTP Client 測試遠端登入是否成功。
我直接用 PHPMailer 測試,記得 Port 是 587。
結果:
2014-02-19 17:21:45 CLIENT -> SERVER: EHLO domain1.com 2014-02-19 17:21:45 CLIENT -> SERVER: AUTH LOGIN 2014-02-19 17:21:45 CLIENT -> SERVER: ****** 2014-02-19 17:21:45 CLIENT -> SERVER: ****** 2014-02-19 17:21:45 CLIENT -> SERVER: MAIL FROM:<[email protected]> 2014-02-19 17:21:45 CLIENT -> SERVER: RCPT TO:<[email protected]> 2014-02-19 17:21:45 CLIENT -> SERVER: DATA 2014-02-19 17:21:45 CLIENT -> SERVER: Date: Thu, 20 Feb 2014 01:21:45 +0800 2014-02-19 17:21:45 CLIENT -> SERVER: Return-Path: <[email protected]> 2014-02-19 17:21:45 CLIENT -> SERVER: To: User <[email protected]> 2014-02-19 17:21:45 CLIENT -> SERVER: From: Tiger-workshop-mail EDM <[email protected]> 2014-02-19 17:21:45 CLIENT -> SERVER: Reply-To: Tiger <[email protected]> 2014-02-19 17:21:45 CLIENT -> SERVER: Subject: Here is the subject 2014-02-19 17:21:45 CLIENT -> SERVER: Message-ID: <[email protected]> 2014-02-19 17:21:45 CLIENT -> SERVER: X-Priority: 3 2014-02-19 17:21:45 CLIENT -> SERVER: X-Mailer: Tiger-Workshop EDM System 2014-02-19 17:21:45 CLIENT -> SERVER: MIME-Version: 1.0 2014-02-19 17:21:45 CLIENT -> SERVER: Content-Type: text/plain; charset=iso-8859-1 2014-02-19 17:21:45 CLIENT -> SERVER: Content-Transfer-Encoding: 8bit 2014-02-19 17:21:45 CLIENT -> SERVER: 2014-02-19 17:21:45 CLIENT -> SERVER: This is the HTML message body <b>in bold!</b> 2014-02-19 17:21:45 CLIENT -> SERVER: 2014-02-19 17:21:45 CLIENT -> SERVER: . 2014-02-19 17:21:46 CLIENT -> SERVER: QUIT Message has been sent
透過外部 SMTP 發送成功了,Email 當然還帶有前面設定過的 SPF 和 DKIM。
到了這裏,只要設定 Dovecot 的 User,
SMTP、IMAP、POP3 都會使用同一個 Username & Password,
而且收信地址也會跟 Username 一樣,實在太美好了…
Ubuntu 其實有提供一個 Package “dovecot-postfix” 整合套件,直接完成以上的東西。
這跟 Windows 下的 XAMPP 和手動安裝 Apache, MySQL, PHP 然後手動整合一樣,
手動設定會學到比較多原理,Debug 比較容易吧。
Hi,
真的很感謝你這系列的文章,幫我節省很多時間
🙂