Ubuntu Postfix Mail Server 設定筆記 (四) MSA (Dovecot SMTP 認證)

本系列第四篇: 設定 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:<tiger@domain1.com>
2014-02-19 17:21:45	CLIENT -> SERVER: RCPT TO:<tiger@domain.com>
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: <sender@domain1.com>
2014-02-19 17:21:45	CLIENT -> SERVER: To: User <tiger@tiger-workshop-mail.com>
2014-02-19 17:21:45	CLIENT -> SERVER: From: Tiger-workshop-mail EDM <tiger@domain1.com>
2014-02-19 17:21:45	CLIENT -> SERVER: Reply-To: Tiger <reply@domain1.com>
2014-02-19 17:21:45	CLIENT -> SERVER: Subject: Here is the subject
2014-02-19 17:21:45	CLIENT -> SERVER: Message-ID: <e34996cffad3e0a7ef2fe916e9f56109@domain1.com>
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 比較容易吧。

One Reply to “Ubuntu Postfix Mail Server 設定筆記 (四) MSA (Dovecot SMTP 認證)”

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.