為何以 587 及 465 號連接埠發送
25 號連接埠是郵件伺服器之間轉交郵件的連接埠。由伺服器直接發到收件方郵件伺服器,IP 信譽、反向 DNS 以至發送量管理都要親自處理,而由新伺服器 IP 發出的郵件容易被列入垃圾郵件。
587 及 465 號是已登入用戶交付郵件的提交連接埠。以帳號及密碼登入郵件發送服務交付郵件,由信譽受管理的發送伺服器代為轉交。這是讓會員註冊確認、找回密碼、訂單通知等郵件順利到達收件匣最可靠的方法。
- 587 號:以明文連線後,以 STARTTLS 開始加密。大部分服務及程式預設使用此連接埠。
- 465 號:由一開始以 TLS 加密連線。設定畫面多數顯示為 SSL 或 SSL/TLS。
選擇郵件發送服務
郵件發送服務大致分兩種:一種是大量發送網站及應用程式通知郵件的交易郵件服務,另一種是已在使用的公司郵件或個人郵件帳戶的 SMTP 功能。無論哪種,取得以下四項資料便完成設定準備。
- SMTP 伺服器位址:例如 smtp.example.com
- 連接埠:587(STARTTLS)或 465(SSL/TLS)
- 用戶名稱:服務指定的帳號或郵件地址
- 密碼:服務的 SMTP 專用密碼或 API 金鑰
發送量大的網店或服務,交易郵件服務會代為處理發送紀錄、退信及取消訂閱管理,十分方便。如只有幾封通知,郵件帳戶的 SMTP 已足夠。
在伺服器確認 SMTP 連線
設定前先確認伺服器能否順利連到發送服務。以下指令只確認連線,不會發送郵件。
nc -vz smtp.example.com 587
openssl s_client -starttls smtp -connect smtp.example.com:587 -crlf -quiet
openssl s_client -connect smtp.example.com:465 -crlf -quiet首行顯示 succeeded 或 open,而 openssl 指令顯示以 220 開頭的伺服器問候語,即表示準備完成。以 Ctrl+C 離開。如沒有 nc 指令,Ubuntu 及 Debian 以 apt install -y netcat-openbsd、AlmaLinux 以 dnf install -y nmap-ncat 安裝。
把 Postfix 連接到發送服務
想把伺服器程式、cron 通知及 mail 指令發出的郵件集中一處,請把 Postfix 設定為轉交發送服務的轉發。伺服器內所有郵件都會經 587 號連接埠登入後發出。
第 1 步:安裝
apt install -y postfix libsasl2-modules mailutils安裝期間詢問郵件設定類型時選擇 Internet Site,郵件名稱填入你的網域。AlmaLinux 10 以 dnf install -y postfix cyrus-sasl-plain s-nail 安裝,再以 systemctl enable --now postfix 啟用。
第 2 步:轉發設定
postconf -e 'relayhost = [smtp.example.com]:587'
postconf -e 'smtp_sasl_auth_enable = yes'
postconf -e 'smtp_sasl_password_maps = texthash:/etc/postfix/sasl_passwd'
postconf -e 'smtp_sasl_security_options = noanonymous'
postconf -e 'smtp_tls_security_level = encrypt'
postconf -e 'inet_interfaces = loopback-only'inet_interfaces = loopback-only 只接收伺服器內發出的郵件,防止外部把此伺服器用作郵件中繼。
第 3 步:儲存登入資料
echo '[smtp.example.com]:587 SMTP_USER:SMTP_PASSWORD' > /etc/postfix/sasl_passwd
chmod 600 /etc/postfix/sasl_passwd
systemctl restart postfix如服務使用 465 號連接埠,把 relayhost 及 sasl_passwd 的連接埠改為 465,並多加一行 postconf -e 'smtp_tls_wrappermode = yes'。
第 4 步:測試發送及查看日誌
echo "VPS mail test" | mail -s "Test from VPS" you@example.com
postqueue -p
journalctl -t postfix/smtp -n 20日誌顯示 status=sent,即表示發送服務已接收郵件。postqueue -p 顯示尚未發出的郵件清單。如修改了登入資料,執行 systemctl restart postfix 後以 postqueue -f 重新發送。
在 WordPress 及應用程式設定 SMTP
網站及應用程式大多有 SMTP 設定欄,毋須在伺服器設置 Postfix,可直接連接發送服務。WordPress 安裝 SMTP 外掛並填入以下數值,會員註冊及找回密碼郵件便經該服務發出。
- SMTP 主機:發送服務位址
- 加密:587 號用 TLS(STARTTLS),465 號用 SSL
- 連接埠:587 或 465
- 驗證:啟用,輸入用戶名稱及密碼
- 寄件人地址:你網域的地址(例如 no-reply@example.com)
Node.js、PHP、Python 應用程式亦以相同數值設定郵件程式庫。密碼不要直接寫在程式碼,以環境變數或設定檔放入最整潔。WordPress 安裝見WordPress 安裝指南。
在網域 DNS 加入 SPF、DKIM、DMARC
收件方郵件伺服器會以 DNS 記錄確認郵件是否真的來自你網域允許的地方。加入三項記錄,收件匣到達率會大幅提升。
- SPF:可發送你網域郵件的伺服器清單。把發送服務提供的 include 值放入一項 TXT 記錄。
- DKIM:附在郵件上的電子簽名。照樣加入發送服務畫面產生的 TXT 或 CNAME 記錄。
- DMARC:決定如何處理 SPF 及 DKIM 確認失敗的郵件。一開始如下以只接收報告的設定起步。
_dmarc.example.com TXT "v=DMARC1; p=none; rua=mailto:dmarc@example.com"數週內查看報告、確認所有郵件均通過後,提升至 p=quarantine,再到 p=reject,防止網域被冒充。
接收郵件與下一步
想接收寄到你網域的郵件,請在網域加入郵件寄存服務的 MX 記錄。收件交給郵件寄存、發出的通知郵件交給發送服務,伺服器便可專注於網站及應用程式。
以郵件發送服務發信的方式,即使遷移或新建伺服器,只需搬移幾行設定便可延續。伺服器 IP 更改,發送信譽亦照樣留在服務方,把網站遷到其他地區時郵件到達率亦不受影響。
