iT邦幫忙

2025 iThome 鐵人賽

DAY 10
0
Build on AWS

從一個網站的誕生,看懂 AWS 架構與自動化的全流程!系列 第 10

Day 10 會員信件自動寄送:Lambda x SES 打造註冊通知

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20250924/20172743NHFPS6FjND.png

一、前言

會員完成註冊後,系統應該即時寄送確認信或歡迎信,不僅能提升使用者體驗,也能作為安全驗證的一環。

若完全人工處理,容易延遲或遺漏,因此需要自動化寄送,這次的架構可以有效解決以下問題:
(1) 使用者註冊後沒有收到通知,容易懷疑註冊是否成功。
(2) 手動寄送或使用外部郵件服務,缺乏彈性與一致性。
(3) 缺乏寄信紀錄與錯誤追蹤,難以維運。

在 Serverless 架構中,Day 10 串接 Cognito 註冊事件 → Lambda → SES 自動寄信,讓註冊流程更加完整與專業,也作為會員體驗與安全通知的重要一環。

💡由於這是一個實驗架構,所以帳號的SES是在Sandbox中,本Lab不會將SES申請升級至 Production。

二、需要使用到的服務

  • Amazon Cognito:觸發會員註冊事件。
  • AWS Lambda:處理註冊後事件,並呼叫 SES API。
  • Amazon SES (Simple Email Service):負責寄送電子郵件。
  • Amazon CloudWatch Logs:記錄寄送過程與錯誤追蹤。

三、架構/概念圖

https://ithelp.ithome.com.tw/upload/images/20250924/20172743HAp4k0g6Ux.png

四、技術重點

(1) 在 SES 中設定 DKIM / SPF,避免郵件被判定為垃圾信。
(2) 使用 模板化信件(SES Template)管理多語系、多樣式郵件。
(3) Lambda 加上 重試機制(Dead Letter Queue)避免信件寄送失敗被忽略。
(4) 使用 CloudWatch Metrics 監控 SES 的發信量與退信率。
(5) 對於敏感通知(例如安全警告),建議同時寄送 Email 與 SMS(可搭配 SNS)。

五、Lab流程

1️⃣ 前置作業

完成架構後、測試前,記得要確認收件E-mail是否已有在SES做信箱驗證。(因為現在SES在Sandbox中)

2️⃣ 主要配置

1. 在 SES 中驗證網域(發信方)。

  1. 進入「Amazon Simple Email Service(SES)」服務頁面。
    https://ithelp.ithome.com.tw/upload/images/20250924/20172743zjL2DuvsWg.png

  2. 點選「建立身分」。
    https://ithelp.ithome.com.tw/upload/images/20250924/20172743suIUoyYigx.png

  3. 輸入現在託管在Route 53的網域名稱,並點選「建立身分」。
    https://ithelp.ithome.com.tw/upload/images/20250924/20172743pSJLbeHw8o.png
    https://ithelp.ithome.com.tw/upload/images/20250924/20172743mWvx5yFivt.png

  4. 創建完成畫面。
    https://ithelp.ithome.com.tw/upload/images/20250924/201727434QF5u7Erz0.png

  5. 網域託管在Route 53的話,會自動被驗證。(會需要等待1~3分鐘)
    https://ithelp.ithome.com.tw/upload/images/20250924/20172743M1ZwTS6IjN.png

2. 在SES驗證收件人 Email

💡SES尚未從「sandbox」中移出前,都屬於「非生產狀態」,所以只能寄信給「已驗證過的電子信箱」,故如果已經移出沙箱,那就可以不用「驗證信箱」。

  1. 點選「建立身分」。
    https://ithelp.ithome.com.tw/upload/images/20250924/20172743TYHeJ0XxmR.png

  2. 建立一個信箱作為SES收件用。
    https://ithelp.ithome.com.tw/upload/images/20250924/20172743PFNAus2wUN.png

  3. 點擊連結,驗證信箱。
    https://ithelp.ithome.com.tw/upload/images/20250924/201727436H9hWT2UM9.png

  4. 確認E-mail已通過驗證。(這樣才可以收到信件)
    https://ithelp.ithome.com.tw/upload/images/20250924/20172743b9p8TOVN8d.png

3. 創建Lambda

  1. 進入「Lambda」頁面。
    https://ithelp.ithome.com.tw/upload/images/20250924/20172743KShaOTNqZ5.png

  2. 創建一個新的函數。
    https://ithelp.ithome.com.tw/upload/images/20250924/20172743sy2kXfWn7T.png

  3. 輸入函數名稱,並選擇編撰語言。
    https://ithelp.ithome.com.tw/upload/images/20250924/201727434JIbAwitJT.png

  4. 跳過建議畫面。
    https://ithelp.ithome.com.tw/upload/images/20250924/20172743kIU5KFkW6k.png

  5. 寫入程式碼,並部署。

    • 程式碼範本:
        // 使用 AWS SDK v3
        import { SESClient, SendEmailCommand } from "@aws-sdk/client-ses";
    
        const sesClient = new SESClient({ region: process.env.AWS_REGION });
    
        // 從環境變數中讀取寄件人 Email
        const SOURCE_EMAIL = process.env.SOURCE_EMAIL;
        if (!SOURCE_EMAIL) {
            throw new Error('Environment variable SOURCE_EMAIL must be set.');
        }
    
        export const handler = async (event) => {
            // 取得 Cognito 傳入的 Email
            const userEmail = event.request.userAttributes.email;
    
            const command = new SendEmailCommand({
                Source: SOURCE_EMAIL,
                Destination: { ToAddresses: [userEmail] },
                Message: {
                    Subject: { Data: '歡迎加入我們的服務!' },
                    Body: {
                        Text: { Data: '親愛的用戶,感謝您註冊本服務,祝您使用愉快!' }
                    }
                }
            });
    
            try {
                const response = await sesClient.send(command);
                console.log("Email sent:", response);
                return event;
            } catch (error) {
                console.error("Failed to send email:", error);
                throw new Error("Failed to send welcome email.");
            }
        };
    
    
    

    https://ithelp.ithome.com.tw/upload/images/20250924/20172743pRlRfeoLIc.png

4. 設定環境變數

💡環境變數設定 SOURCE_EMAIL 為已驗證的寄件地址。

  1. 進入「組態」分頁,設定環境變數。
    https://ithelp.ithome.com.tw/upload/images/20250924/20172743jZxan4s8bq.png

  2. 變數key「SOURCE_EMAIL」,Value為你在 SES 中驗證過的寄件人信箱(如:no-reply@your-domain.com)。
    https://ithelp.ithome.com.tw/upload/images/20250924/20172743OJBuKRSBXi.png

5. 授予Lambda IAM Role使用SES寄信的權限

  1. 進入「IAM 」頁面。
    https://ithelp.ithome.com.tw/upload/images/20250924/20172743nSvZAjsvIk.png

  2. 進入IAM role的頁面,點選該Lambda自動創建的IAM role。
    https://ithelp.ithome.com.tw/upload/images/20250924/20172743dA5Dpubr1Z.png

  3. 新增「許可政策」。
    https://ithelp.ithome.com.tw/upload/images/20250924/20172743pnlDkFQX01.png

  4. 增加SES的「SendEmail」、「SendRawEmail」權限,授權範圍為「全部」。
    https://ithelp.ithome.com.tw/upload/images/20250924/20172743tv2fg9wKJY.png
    https://ithelp.ithome.com.tw/upload/images/20250924/20172743jm93LMNSNz.png

  5. 設定「許可政策」名稱。
    https://ithelp.ithome.com.tw/upload/images/20250924/20172743QnEQJGy3Ie.png

  6. 完成畫面。
    https://ithelp.ithome.com.tw/upload/images/20250924/20172743W6NO3Z2Llh.png

6. 設定Cognito觸發Lambda發信

  1. 進入「Cognito」頁面。
    https://ithelp.ithome.com.tw/upload/images/20250924/20172743idbzcCfzIy.png

  2. 進入Day9創建的Cognito。
    https://ithelp.ithome.com.tw/upload/images/20250924/201727439uKvVqgb2y.png

  3. 在「延伸功能」分頁中,添加Lambda觸發。
    https://ithelp.ithome.com.tw/upload/images/20250924/20172743Fg942LGnFo.png

  4. 將觸發動作與Lambda函數設定好。
    https://ithelp.ithome.com.tw/upload/images/20250924/20172743xfBpLwUkry.png

  5. 完成畫面。
    https://ithelp.ithome.com.tw/upload/images/20250924/20172743YnMzXy9kIA.png

3️⃣ 測試驗證

1. 把Day9創建的使用者刪除

https://ithelp.ithome.com.tw/upload/images/20250924/201727430eYoISIxAE.png

2. 新增一位會員,完成 Cognito 註冊。(參照Day9的步驟)

💡要註冊已完成SES驗證的E-mail為user。
https://ithelp.ithome.com.tw/upload/images/20250924/20172743JJVNziD4fe.png

3. 確認使用者信箱是否收到寄出的信件。

https://ithelp.ithome.com.tw/upload/images/20250924/20172743InBoiT5CO7.png

4. 在 CloudWatch Logs 查看 Lambda 日誌,確認寄送成功。

https://ithelp.ithome.com.tw/upload/images/20250924/20172743W8zi3tru10.png

5. 測試錯誤案例(例如:未驗證的寄件人),觀察 SES 拒絕訊息。

  1. 註冊一個未通過SES驗證的使用者。
    https://ithelp.ithome.com.tw/upload/images/20250924/20172743ph19PJwScC.png

  2. 會發現Lambda會有一個被拒絕的信件紀錄。
    https://ithelp.ithome.com.tw/upload/images/20250924/20172743zC474zTzs2.png

  3. 且信箱無法收到註冊成功信件。

六、結語

今天完成了註冊後的自動化 Email 寄送,讓會員在完成註冊的同時就能收到即時確認或歡迎信,提升了專業感與安全性。
此登入機制將在 Day 11 的「忘記密碼與 MFA」安全強化中繼續被沿用,讓整體會員系統更完整。


上一篇
Day9 會員註冊流程建置:Cognito全託管式身分驗證管理系統
系列文
從一個網站的誕生,看懂 AWS 架構與自動化的全流程!10
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言