會員完成註冊後,系統應該即時寄送確認信或歡迎信,不僅能提升使用者體驗,也能作為安全驗證的一環。
若完全人工處理,容易延遲或遺漏,因此需要自動化寄送,這次的架構可以有效解決以下問題:
(1) 使用者註冊後沒有收到通知,容易懷疑註冊是否成功。
(2) 手動寄送或使用外部郵件服務,缺乏彈性與一致性。
(3) 缺乏寄信紀錄與錯誤追蹤,難以維運。
在 Serverless 架構中,Day 10 串接 Cognito 註冊事件 → Lambda → SES 自動寄信,讓註冊流程更加完整與專業,也作為會員體驗與安全通知的重要一環。
💡由於這是一個實驗架構,所以帳號的SES是在Sandbox中,本Lab不會將SES申請升級至 Production。
(1) 在 SES 中設定 DKIM / SPF,避免郵件被判定為垃圾信。
(2) 使用 模板化信件(SES Template)管理多語系、多樣式郵件。
(3) Lambda 加上 重試機制(Dead Letter Queue)避免信件寄送失敗被忽略。
(4) 使用 CloudWatch Metrics 監控 SES 的發信量與退信率。
(5) 對於敏感通知(例如安全警告),建議同時寄送 Email 與 SMS(可搭配 SNS)。
完成架構後、測試前,記得要確認收件E-mail是否已有在SES做信箱驗證。(因為現在SES在Sandbox中)
進入「Amazon Simple Email Service(SES)」服務頁面。
點選「建立身分」。
輸入現在託管在Route 53的網域名稱,並點選「建立身分」。
創建完成畫面。
網域託管在Route 53的話,會自動被驗證。(會需要等待1~3分鐘)
💡SES尚未從「sandbox」中移出前,都屬於「非生產狀態」,所以只能寄信給「已驗證過的電子信箱」,故如果已經移出沙箱,那就可以不用「驗證信箱」。
點選「建立身分」。
建立一個信箱作為SES收件用。
點擊連結,驗證信箱。
確認E-mail已通過驗證。(這樣才可以收到信件)
進入「Lambda」頁面。
創建一個新的函數。
輸入函數名稱,並選擇編撰語言。
跳過建議畫面。
寫入程式碼,並部署。
// 使用 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.");
}
};
💡環境變數設定 SOURCE_EMAIL
為已驗證的寄件地址。
進入「組態」分頁,設定環境變數。
變數key「SOURCE_EMAIL」,Value為你在 SES 中驗證過的寄件人信箱(如:no-reply@your-domain.com)。
進入「IAM 」頁面。
進入IAM role的頁面,點選該Lambda自動創建的IAM role。
新增「許可政策」。
增加SES的「SendEmail」、「SendRawEmail」權限,授權範圍為「全部」。
設定「許可政策」名稱。
完成畫面。
進入「Cognito」頁面。
進入Day9創建的Cognito。
在「延伸功能」分頁中,添加Lambda觸發。
將觸發動作與Lambda函數設定好。
完成畫面。
💡要註冊已完成SES驗證的E-mail為user。
註冊一個未通過SES驗證的使用者。
會發現Lambda會有一個被拒絕的信件紀錄。
且信箱無法收到註冊成功信件。
今天完成了註冊後的自動化 Email 寄送,讓會員在完成註冊的同時就能收到即時確認或歡迎信,提升了專業感與安全性。
此登入機制將在 Day 11 的「忘記密碼與 MFA」安全強化中繼續被沿用,讓整體會員系統更完整。