在日常開發中,郵件發送是個比較常見的場景。因此出現了很多相關的軟體和服務,各大雲廠商也推出自己的郵件服務。今天筆者就像大家介紹一種常見的組合,AWS的郵件服務 SES 與郵件伺服器 postfix 的配置和使用方法。 概述 什麼是 AWS-SES Amazon Simple Email Servic ...
在日常開發中,郵件發送是個比較常見的場景。因此出現了很多相關的軟體和服務,各大雲廠商也推出自己的郵件服務。今天筆者就像大家介紹一種常見的組合,AWS的郵件服務 SES 與郵件伺服器 postfix 的配置和使用方法。
概述
- 什麼是 AWS-SES
Amazon Simple Email Service (SES) 是一種經濟高效、靈活且可擴展的電子郵件服務,使開發人員能夠從任何應用程式中發送電子郵件。 您可以快速配置Amazon SES 以支持多種電子郵件使用案例,包括交易、營銷或群發電子郵件通信。
- 什麼是 postfix
Postfix 是一種電子郵件伺服器,它是由任職於IBM華生研究中心(T.J. Watson Research Center)的荷蘭籍研究員Wietse Venema為了改良sendmail郵件伺服器而產生的。
它是為了改良 sendmail 產生的,同時它相容 sendmail,是比較常用的一種郵件伺服器。
開通Amazon Simple Email Service (SES)服務
- 創建一個 identity
此處我們為了演示方便,使用Email address
方式來驗證。按下圖填入後續要發送郵件的郵箱,隨後 AWS 會給對應郵箱發一個確認驗證的郵件,點擊一下郵件連接即可表示確認授權。
- 創建憑證
選擇 Account dashboard,此處的 SMTP endpoint 就是我們的郵件伺服器地址,後面配置郵件伺服器的時候需要使用。
點擊創建憑證,創建好後,新頁面會有下載按鈕,一定要及時下載憑證文件。
憑證文件里有 Smtp Username 和 Smtp Password,後面配置 postfix 郵件伺服器的時候需要用到。
- 測試郵件發送
使用 AWS 自帶的功能發送一下測試郵件,查看是否成功。
- 其他說明
SES 的驗證方式支持單個郵箱驗證和 domain 驗證。本文中筆者為了演示簡單,採用了單個郵箱驗證,如果實際使用中,郵件發送者就是固定的幾個郵箱,採用該方法就比較簡單。若是郵件發送者比較多,不固定,每個郵箱驗證一次不太現實,就可以採用 domain 驗證的方式,由功能變數名稱管理員來配合驗證即可,具體的使用 dimain 方式驗證的方法,可以參考 aws 官網文檔,添加對應的 dns 記錄即可。
至此, SES 服務已經初步開通完畢,下麵我們來看下 postfix 的相關配置。
EC2 安裝 postfix 並配置 SES 發送郵件
筆者的環境是 ubuntu 20.04,其他版本的 ubuntu 方法基本類似。
shell> cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.3 LTS"
- 安裝 postfix 郵件服務
使用如下命令安裝,安裝過程中間直接選擇預設的配置一路確認即可,後面我們單獨修改配置。
sudo apt-get install mailutils -y
安裝完成之後,在 AWS 的 EC2 上是無法直接使用 mail 命令發郵件的,需要配置郵件伺服器。
此處我們以 AWS 的 SES 服務為例,配合 postfix 進行郵件發送。
- 修改 postfix 配置
sudo postconf -e "relayhost = [email-smtp.us-west-2.amazonaws.com]:587" \
"smtp_sasl_auth_enable = yes" \
"smtp_sasl_security_options = noanonymous" \
"smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd" \
"smtp_use_tls = yes" \
"smtp_tls_security_level = encrypt" \
"smtp_tls_note_starttls_offer = yes"
sudo postconf -e "smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt"
通過上述命令修改 postfix 的配置,其實修改的就是 /etc/postfix/main.cf
文件,也可以手動使用 vim 等修改,為了保持格式,直接使用自帶的 postconf 命令修改即可。
註意:上述命令中的 email-smtp.us-west-2.amazonaws.com
根據實際情況換成你自己開通的 SES 服務的地址,上文 SES 開通部分有介紹過。
- 填寫賬號文件
vim /etc/postfix/sasl_passwd
# 輸入如下內容
[email-smtp.us-west-2.amazonaws.com]:587 SMTPUSERNAME:SMTPPASSWORD
email-smtp.us-west-2.amazonaws.com:換成你自己的 SES 服務地址
SMTPUSERNAME:SMTP用戶名,上文 SES 開通部分有介紹過
SMTPPASSWORD:SMTP密碼,同上
- 編碼賬號文件和修改許可權
sudo postmap hash:/etc/postfix/sasl_passwd
sudo chown root:root /etc/postfix/sasl_passwd
sudo chown root:root /etc/postfix/sasl_passwd.db
sudo chmod 0600 /etc/postfix/sasl_passwd
sudo chmod 0600 /etc/postfix/sasl_passwd.db
- 重啟 postfix 服務
systemctl reload postfix
- 測試郵件發送並查看日誌
echo test | mail -s "test message" -a "From: [email protected]" [email protected]
tail -f /var/log/mail.log
註意,此處的發送者和收件者郵件需要在 AWS 上進行驗證,否則發送郵件會失敗。驗證方式見前面的 AWS開通 SES 服務部分。
如果 SES 是在 sandbox 環境中,則發送者
[email protected]
和 收件人[email protected]
都需要在 AWS 上進行驗證。如果是在 production 環境中,則只需要發送者郵件驗證通過即可。
- 其他說明
若按照如上配置方式,郵件還是發送失敗,可以查看機器上的日誌,如/var/log/mail.log
。還可以檢查安全組,看是否是郵件相關埠未開放。
參考文檔:https://docs.aws.amazon.com/ses/latest/dg/postfix.html
更多技術文章,請關註我的個人博客 www.immaxfang.com 和小公眾號 Max的學習札記
。