本篇文章更新時間:2023/12/27
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣 或 新台幣 贊助支持。
前幾天假日在研究 Email Server 郵件伺服器的方案時,看到這款 A serverless email server on AWS using S3 and SES 透過 AWS SES + AWS S3 來開源架設郵件伺服器的工具。意外地打開新靈感,沒想到 AWS SES 服務也能這樣玩,作者真的是運用 AWS 的高手,不過這款服務的開源比較像是一種炫技的實力證明,跟你說有其他架構需要,歡迎找他XD
對我來說,我看的重點比較偏向是「讓 AWS SES 能使用常見的信箱管理工具收信管理」,目前 AWS SES 可以收到信後,轉儲存在 AWS S3 上,但要讓他有「收到信之後的事件」現在也只能去呼叫 AWS Lambda 這個服務處理。
不過既然已經有收到信件了,其實就可以做點什麼事,於是就在想「要如何避開呼叫 Lambda 這個 Serverless 服務就能處理?」的時候,剛好就找到這一款開源工具 POP3 💌 server for Amazon Simple Email Service
關於前述的更多重點摘要,我筆記在粉絲頁上,有興趣可以看看。
本篇著墨在實作上篇的筆記,搭配那款 POP3 Server 的處理讓 AWS SES + S3 變成我的 Email Server 郵件伺服器!
內容目錄
前置準備
- 一個請客服「要求提高限制」開通過 SES 服務用量的 AWS 帳號
- 一台可以 SSH 遠端連線作業的 VPS 網站主機
- 一個需要架設信箱的網域
- 思路清晰且對 Email 信件與網路服務還有 AWS 有操作概念的大腦
這邊我使用 Oracle 的 ARM 免費 VPS 主機,系統是 Ubuntu 22.04 。其實可以不用 VPS 的,但如果考慮到手機也要連線使用的話,就有這需求。本文筆記比照上線服務的規格來處理。
AWS SES 驗證網域
請求額度開通是一回事,本篇就不提了。但不管是收信或發信,都會需要驗證你的網域或是信箱,只能透過驗證過的單位來進行操作。
這邊只需要到「已驗證的身分」然後「建立身分」,按照指示把你的網域給填入,並且在 DNS 設定的地方把它提供的 DKIM
資訊給紀錄上去就好。
要注意我這邊是驗證「網域」,不是「信箱」,填寫的是你想用來收信的網域名稱。
DNS 設定接收信件的 MX 郵件伺服器資訊
驗證過網域後,就可以把你的接收信件伺服器資訊順便填入 DNS 紀錄裡。
AWS SES 後台沒有這個紀錄提示,要看一下文件,照指示操作。
重點就是記下你當下 SES 申請額度與驗證過的 Region
區域是哪一個,把 inbound-smtp.REGION.amazonaws.com
替換成你的區域就可以。
像是我的區域是 us-west-2
那 MX 紀錄中就是填寫 inbound-smtp.us-west-2.amazonaws.com
,至於 Priority 順序,數字越小越前面請求。這邊預設你就是要用它為主,所以填寫 1
就好。
設定 DNS 的 SPF 紀錄
儘管「發信」還沒寫到,但這邊既然已經在操作更新 DNS 紀錄,就順便要把「授權給哪個單位發信」的 SPF 紀錄給更新上。
新增一個 TXT
紀錄,內容如下:
v=spf1 mx include:amazonses.com ~all
設定 AWS SES 電子郵件接收規則
驗證過網域、更新上 DNS 的 MX 紀錄都只是對外宣告可以往這裡發信。但實際上,還要到「電子郵件接收」這功能,把規則給設定上。
沒設定好會回傳「找不到此信箱」的回應
首先點選「建立規則集」,設定這規則名稱(隨意),再來「建立規則」,名稱也是隨意,主要是自己日後還能回憶就好。
緊接著就是「新增收件人條件」,這邊要填寫剛剛驗證過的網域名稱或信箱。
指南這邊寫得很清楚,可以多加參考!
基本上輸入網域的話,不管是發信給哪個地址,你都可以收得到,也就是可以擁有無限多個郵件地址的意思~
「安全性和保護選項」中的 TLS 連線 與 垃圾郵件和病毒掃描 都勾起來,省得日後被垃圾信灌入的麻煩。
到了關鍵的「新增動作」部分,選擇「交付至 Amazon S3 儲存貯體」然後透過他這邊的介面幫你建立一個 Bucket 存貯體來處理。
其他連動的關鍵都在這邊,只是目前我們其實只需要他把信給回存到 AWS S3 裡就好。
取得收信與發信的 IAM 角色憑證權限
IAM 是一個服務操作者角色的一種服務,用來讓外部程式以此呼叫 AWS 服務,用來做權限控管機制。
我們要從 AWS S3 收信,所以會需要一組 S3 的權限,要發信,需要一組 SMTP 的權限。
SMTP 發信權限
這步驟極其簡單,到「SMTP 設定」,簡易郵件傳輸協定 (SMTP) 設定中,「建立 SMTP 憑證」,照他流程也是先填寫一個識別用名稱,然後取得一組 SMTP 使用者名稱
、SMTP 密碼
下載回來後先保存好,晚點在信箱管理軟體中會用到。
S3 收信讀取權限
把 AWS 服務切換到 IAM 後,到「使用者」功能「建立使用者」。
名稱記得住就好,關鍵是「許可政策」要填寫正確,如果測試的話,直接連結許可,選個 AmazonS3FullAccess
權限全開給他(?)。
準備上線狀態的話,建議使用下方的內嵌政策(自行替換內容關鍵字)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "s3:*",
"Resource": "arn:aws:s3:::YOUR-S3-BUCKET-NAME*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "IP.IP.IP.IP/32"
}
}
}
]
}
設定限制的 IP 存取以及存取哪一個 S3 Bucket 存貯體,確保這組 Key 外流時不會造成其他嚴重意外。
權限設定好後也會拿到一組授權的密碼 Access key ID
、Secret access key
,下載回來存好,晚點 POP3 Server 會用到。
架設 AWS S3 POP3 Server
到這步, AWS 端的設定就沒了。可以打開你的其他信箱,往 隨意名稱@SES驗證過的網域
地址發送測試信件看看。有看到 S3 Bucket 裡有多出一個信件原始檔案就代表成功。
現在就是需要一個 POP3 的服務來去幫我們當郵件軟體的中間人角色去跟這些原始郵件檔案交互作用。
SSH 連線進主機後,先安裝 GVM 這套 Go 的版本管理工具。
bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
再來是安裝 Go 來準備開始編譯 POP3 Server。
gvm install go1.21.0 -B
gvm use go1.21.0
下載原始碼並編譯:
git clone https://github.com/markushinz/aws-ses-pop3-server.git
cd aws-ses-pop3-server
go build
注意,這邊因為我是 ARM 的機器,所以會需要自己編譯安裝,如果你同樣步驟,但是使用在 Mac 或是 x86_64 架構的電腦,可以選擇直接使用作者編譯好的程式使用。
編輯設定描述檔案:
vi ~/.aws-ses-pop3-server/config.yaml
描述組態內容,把前述拿到的 S3 授權密碼填入:
# GENERAL SETTINGS
host: "0.0.0.0" # optional, defaults to "" (or 0.0.0.0; [::]; listening on all NICs)
port: 2995 # optional, defaults to 2110 (or 2995 if you specified tls-cert / tls-key or tls-cert-path / tls-key-path)
# 上線用可以搭配伺服器的 SSL 憑證
tls-cert-path: "/usr/local/nginx/conf/ssl/domain/fullchain.cer" # optional, only valid in combination with tls-key-path
tls-key-path: "/usr/local/nginx/conf/ssl/domain/hcchiang.com.key" # optional, only valid in combination with tls-cert-path
verbose: false
# 登入這個 POP3 伺服器需要的密碼
user: "[email protected]" # optional, defaults to "user"
password: "PASSWORD" # optional, defaults to "changeit". DO CHANGE IT!
# S3 授權的密碼資訊
aws-access-key-id: "AKIXXXLGXMMM5JYPPPB3"
aws-secret-access-key: "oOOLKJUTmqaPGZWXF2ncAJXi7GdyZfSLO1o5L+AI"
aws-session-token: ""
# S3 區域資訊
aws-s3-region: "us-west-2"
aws-s3-bucket: "YOUR-S3-BUCKET-NAME"
aws-s3-prefix: "" # optional, defaults to "" (set this if the emails are not stored in the root directory of the S3 bucket)
TLS 資訊非必要,但是要掛上線對外的時候,就強烈建議補一下了。可以剛好放置在網站伺服器中,一起共用 Let's Encrypt 的 SSL 憑證。
處理好這個 config.yaml
設定組態檔案後,就可以啟用這個 POP3 Server 啦!
./aws-ses-pop3-server
看到他顯示 2023/12/26 20:54:02 Info: Listening on [::]:2995
這樣就代表運作中。
設定開啟防火牆
不論是主機外的防火牆設定,還是主機內作業系統裡用的 iptables
都要確認有沒有封鎖了 2995
這個阜號。
iptables
的加入允許清單方法: iptables -I INPUT 1 -p tcp --dport 2995 -j ACCEPT
設定信箱管理軟體
信箱管理軟體 Mail Client 的選擇,這邊我使用跨平台的 Thunderbird。
安裝好建立帳號的時候,選一個你想用的信箱名稱,密碼先不用填寫,選擇進階設定,把 POP3 伺服器的位置(IP或網域)以及阜(Port)號 2995
填寫入,連線方式選擇 TLS 以及帳號密碼方式授權。
都先只需要填寫「帳號」部分,等正式連線時,會再問一次密碼的部分。
發信的部分填入 AWS SES 的 SMTP 資訊,在 SMTP 設定頁面有提供,自行根據顯示的設定值設定。
收信與發信這兩個資訊都填寫完儲存後,就大功告成啦!
後記
標題說得無限容量,其實還是有一個基本限制,像是單封信件不能超過 40MB 上限,還需要注意發信速度不能超過當初配給的額度(我的是 14封/秒 )。
正常使用下,真的是碰不到那個限制,使用信箱管理軟體也會幫你同時備份回本機,如果要省一點就是記得去刪除 S3 上的信件。(Thunderbird 這邊要完全從垃圾桶刪除,才會去刪除 S3 上的原始郵件)
這樣的架構彈性其實很大,要在自己的電腦架設 POP3 Server 也沒問題,不用特別去搞一個 VPS 主機,連 TLS 也可以省去。每次開信箱管理軟體的之前記得先啟用 POP3 Server 軟體就好。
每天正常收發,我相信一個月要超過 1 USD 都是很拼了,用來當自己品牌網域掛上去的信箱服務,目前這樣組合很超值!