所在位置:
首頁 >
營銷資訊 >
建站知識 > 免費托管域名郵箱:AWS SES + Lambda
免費托管域名郵箱:AWS SES + Lambda
時間:2023-02-10 06:12:01 | 來源:建站知識
時間:2023-02-10 06:12:01 來源:建站知識
本文源自于我的英文Medium:Forwarding Personal Domain Emails to Gmail with AWS Lambda and CloudFormation
QQ郵箱已經(jīng)停止域名郵箱托管,常見的WorkMail provider簡單調(diào)查發(fā)現(xiàn)可信的提供商,基本都有不同程度的月功能費(GSuite: $6~, AWS WorkMail: $4~, Microsoft 365: $5~),免費的午餐應該只能DIY了。
AWS的Simple Email Service(SES)提供了高可靠性的API,并且有永久免費的Free Tier,感覺是長期托管個人域名郵箱的選項;然而SES并沒有內(nèi)置的存儲和web UI,因此還需要轉(zhuǎn)發(fā)郵件到其他的個人郵箱,例如Gmail。利用CloudFormation等Infrastructure-as-code工具,本文分享了一個一鍵生成的Email solution。
先睹為快
代碼源文件均保存在Github gist:
https://gist.github.com/willings/7f0310c971278cddada267616a39f091準備工作
- 一個可用的AWS免費 賬號(申請)
- 在AWS控制臺驗證域名的所有權(quán)
- 驗證收信郵箱(例如@gmail)的所有權(quán)
- 安裝AWS Cli
配置信息
# Only needed if aws credentials are not set in ~/.aws/config, ensures your IAM user has permission to deploy CloudFormation stackexport AWS_ACCESS_KEY_ID=...export AWS_SECRET_ACCESS_KEY=...export AWS_DEFAULT_REGION=... e.g. us-west-2# Configure domain and destination email informationSTACK_NAME="EmailProxyStack"DOMAINS="mydomain1.com,mydomain2.com"MAIL_RECIPIENT="proxy_destination_email@gmail.com"
創(chuàng)建服務棧
# Get the CloudFormation template file (containing lambda code)curl https://gist.githubusercontent.com/willings/7f0310c971278cddada267616a39f091/raw/43ccabcbb5254375e47a006d7d5878a2afff6eaa/email-proxy-stack.yaml > email-proxy-stack.yaml# Create CloudFormation stack and deployaws cloudformation deploy / --capabilities CAPABILITY_IAM / --template-file email-proxy-stack.yaml / --stack-name ${STACK_NAME} / --parameter-overrides Domains="${DOMAINS}" MailRecipient="${MAIL_RECIPIENT}"
后續(xù)操作
- 激活郵件規(guī)則過濾(開始接收郵件)
- 向自己的域名郵箱發(fā)送測試郵件
- 在Gmail(或者其他的郵箱)上配置規(guī)則過濾器來分類收到的郵件
以下內(nèi)容自動翻譯自英文文章工作原理
- 將MX設置更新為SES記錄后,域電子郵件將轉(zhuǎn)發(fā)到AWS SES:10 inbound-smtp.regionInboundUrl.amazonaws.com,有關詳細信息,請參閱SES文檔。
- 在“電子郵件規(guī)則”過濾器中,我們添加了一個操作,將整個MIME電子郵件消息放入S3存儲桶中,以實現(xiàn)并稍后使用。 存儲桶中的文件名與電子郵件ID相同。
- 在電子郵件規(guī)則過濾器中,存儲到S3之后,另一個操作將通過SES通知觸發(fā)Lambda函數(shù),然后lambda函數(shù)代碼從S3存儲桶中提取電子郵件,并將消息更新為所需的格式,并記錄到CloudWatch日志中以供將來搜索。
- Lambda函數(shù)調(diào)用SES send_raw_email api來轉(zhuǎn)發(fā)修改后的電子郵件。
- SES執(zhí)行SMTP協(xié)議以將電子郵件發(fā)送到目的地。
更多細節(jié)
優(yōu)點
- 免費(S3服務有1年的有效期,之后可能有很低的費用)
- 無限的電子郵件帳戶
- 可靠,與EC2上的自托管電子郵件服務器相比,無需擔心服務器停機
為什么要再造一個輪子?
在以下方面,現(xiàn)有的幾個例子(參見英文)都不理想:
- 未實現(xiàn)為基礎架構(gòu)即代碼,需要大量手動配置,可能會發(fā)生人為錯誤
- AWS博客示例以.eml文件轉(zhuǎn)發(fā),無法在Gmail上本地查看
- Github代碼使用基于文本的處理,代碼有點復雜; python的內(nèi)置lib電子郵件包聽起來是更好的解決方案
可以改進的地方
- 現(xiàn)在,我們?nèi)匀恍枰謩硬僮?,以將非活動?guī)則集移至活動狀態(tài),可以通過在cloudformation堆棧中添加自定義資源lambda來自動執(zhí)行此步驟。
- 如果處理失敗,我們可能希望有一個SNS到SMS的通知,以便我們可以捕獲和查看原始電子郵件
故障排除
- 電子郵件未轉(zhuǎn)發(fā)到我的目標郵箱,在哪里可以開始調(diào)試?
遵循答案2?5。 - 我怎么知道SES正在處理我的電子郵件?
確保正確設置了域上的MX記錄,請注意DNS記錄更新可能會有些延遲。某些MX DNS查找工具(例如https://mxtoolbox.com/)也可以幫助進行驗證。 - 為什么發(fā)送到域的電子郵件被拒絕并顯示“地址不可達”?
可能是由于沒有激活電子郵件規(guī)則過濾器引起的,請檢查創(chuàng)建的規(guī)則過濾器是否激活。 - 我怎么知道我的lambda正在處理請求?
a) 檢查S3存儲桶以查看是否存在新文件
b) 檢查CloudWatch日志以查看lambda是否有任何處理失敗 - 為什么即使正確觸發(fā)了lambda也無法將代理電子郵件發(fā)送到我的目標郵箱?
可能是由于目標郵件地址未列入白名單,默認情況下,SES阻止將電子郵件發(fā)送到未驗證的域。 - 如何找到在堆棧中創(chuàng)建的資源?
在控制臺中檢查CloudFormation堆棧,請注意,您可能需要切換到正確的區(qū)域。