應(yīng)用程序中最常用的功能是發(fā)電子郵件。例如:用戶注冊成功,找回密碼项钮,電子賬單等都需要。AWS也提供了發(fā)電子郵件的服務(wù)叫SES(Simple Email Service)希停,只需要幾行代碼即可方便的發(fā)送各種郵件烁巫。
- SES配置和注意事項
- Lambda發(fā)送電子郵件
源代碼
代碼下載地址:https://pan.baidu.com/s/1vpBnbuxbiPwy1W_y51B6yw
提取碼:v2a3
工程說明
首先配置SES的域名并確認配置成功,然后在用戶注冊工程(lambda-userregistration)中添加發(fā)送郵件功能宠能,在cloudformation.template中配置權(quán)限和發(fā)件箱環(huán)境變量亚隙。
1. SES配置和注意事項
使用SES服務(wù),需要進行簡單的域名配置违崇“⑵可以通過AWS CLI,也可以通過AWS SES控制臺配置羞延。
1)配置域名并驗證
2)配置DNS服務(wù)
3)SNS沙盒模式限制和白名單配置
4)解鎖SNS沙盒模式
1)配置域名并驗證
準備一個域名并在Route 53 上進行NS配置渣淳。若沒有配置可以參考《AWS Lambda筆記-內(nèi)容分發(fā)(CDN)-7》-2. 配置自定義域名樱拴。
登陸SES控制臺https://console.aws.amazon.com/ses/home選擇左邊菜單“Domains”誊抛,按以下截圖配置。圖片第4步深碱,勾選DKIM是一個在檢測電子郵件欺詐的電子郵件認證方法嗤谚,把這個設(shè)置添加到域中對于確保郵件的可交付性是個不錯的選擇砂客。
我們登陸Route 53 控制臺,我們會發(fā)現(xiàn)記錄自動創(chuàng)建完成,登陸并確認下呵恢。刷新下SES控制臺會發(fā)現(xiàn)之前驗證域名的狀態(tài)從“pending verification” >“verified”通過驗證鞠值。整個過程非常快渗钉,只需幾秒即可完成彤恶。
注意:如果域名不在Route53上,以上TXT鳄橘,MX声离,CNAME記錄需要Copy添加到手動配置到自己的域名解析中。
3)SNS沙盒模式限制和白名單配置
目前域名順利驗證通過瘫怜,但是還處于“沙盒模式”术徊,在沙盒模式下賬戶不能通過賬號隨便發(fā)送給其他郵箱,如果想發(fā)郵件鲸湃,可以通過添加白名單赠涮,對方郵箱驗證通過后才能給對方郵箱發(fā)郵件子寓。
4)解鎖SNS沙盒模式
要解鎖沙盒模式,給想要的人發(fā)郵件笋除,我們需要申請一個技術(shù)支持才能解鎖賬戶斜友。訪問導(dǎo)航頁面填寫表單https://aws.amazon.com/ses/extendedaccessrequest/按照表單的要求填寫內(nèi)容即可。
2. Lambda發(fā)送電子郵件
用戶注冊成功后可以發(fā)送一份歡迎郵件垃它,AWS提供了發(fā)送郵件的SDK(aws-java-sdk-ses), 這里只是單純的發(fā)郵件鲜屏,并且郵箱在SES的白名單中,所有我們可以任意模擬一個郵箱前綴就可以通過代碼發(fā)送郵件国拇,例如:hello@domain.com(domain.com 是上一步我們認證通過的域名洛史,hello是隨意取的名稱)。
1)添加aws-java-sdk-ses的依賴包
2)向Lambda的IAM許可中添加權(quán)限
3)Lambda發(fā)送Email
1)添加aws-java-sdk-ses的依賴包
在用戶注冊工程(lambda-userregistration)的build.gradle中添加SES JDK依賴
compile group: 'com.amazonaws', name: 'aws-java-sdk-ses', version: '1.11.+'
2)向Lambda的IAM許可中添加權(quán)限
在cloudformation.template的LambdaCustomPolicy權(quán)限中添加酱吝,若忘記添加權(quán)限也殖,在發(fā)郵件是log日志中會有個 Service: AmazonSimpleEmailService; Status Code: 403; Error Code: AccessDenied; 的提醒。
{
"Effect": "Allow",
"Action": [
"ses:*"
],
"Resource": "*"
}
為方便配置掉瞳,可以把發(fā)送的Email地址寫到Lambda的環(huán)境變量中毕源,在取出是只需要System.getenv("SenderEmail")
即可。(example.com換成自己通過SES認證的域名)
UserRegistrationLambda的Lambda配置中添加環(huán)境變量:
"SenderEmail": "lazy@example.com"
3)Lambda發(fā)送Email
我們在lambda-userregistration的Handle.java 中添加發(fā)送郵件的代碼陕习,通過SES發(fā)郵件霎褐,我們需要創(chuàng)建AmazonSimpleEmailServiceClient的實例,我們是通過Guice來完成依賴注入该镣。
注意冻璃,這里的 setSimpleEmailServiceClient()的@Inject是采用默認依賴注入。即通過new AmazonSimpleEmailServiceClient()的方式注入到setSimpleEmailServiceClient()中损合。
private AmazonSimpleEmailServiceClient simpleEmailServiceClient;
//直接注入new的AmazonSimpleEmailServiceClient對象
@Inject
public Handler setSimpleEmailServiceClient(
AmazonSimpleEmailServiceClient simpleEmailServiceClient) {
this.simpleEmailServiceClient = simpleEmailServiceClient;
return this;
}
private void sendEmail(final String emailAddress) {
//收件地址
Destination destination = new Destination().withToAddresses(emailAddress);
//郵件內(nèi)容
Message message = new Message()
.withBody(new Body().withText(new Content("Welcome J⊙蕖!!")))
.withSubject(new Content("Welcome!"));
//發(fā)送郵件嫁审,發(fā)件地址從配置的環(huán)境變量中獲取System.getenv("SenderEmail")
try {
LOGGER.debug("Sending welcome mail to " + emailAddress);
simpleEmailServiceClient.sendEmail(new SendEmailRequest()
.withDestination(destination)
.withSource(System.getenv("SenderEmail"))
.withMessage(message)
);
LOGGER.debug("Sending welcome mail to " + emailAddress + " succeeded");
} catch (Exception anyException) {
LOGGER.error("Sending welcome mail to " + emailAddress + " failed: ", anyException);
}
}
@Override
public RegistrationOutput handleRequest(RegistrationInput input, Context context) {
User createdUser = userService.registerNewUser(input.username, input.email);
//用戶注冊成功跋炕,發(fā)送郵件
sendEmail(input.email);
//返回生成user的原始URL
return new RegistrationOutput(createdUser);
}
發(fā)布工程./gradlew delploy
我們可以驗證下,注冊的email目前必須在SES中添加的白名單中律适。
異常一
com.amazonaws.services.simpleemail.model.AmazonSimpleEmailServiceException:
User `arn:aws:sts::083845954160:assumed-role/serverlessbook-LambdaExecutionRole-1CQQ1SF5ASHEB/serverlessbook-UserRegistrationLambda-J9E431B4RLGX' is not authorized to perform `ses:SendEmail' on resource `arn:aws:ses:us-east-1:083845954160:identity/cdn.kkkkkk.com' (Service: AmazonSimpleEmailService; Status Code: 403; Error Code: AccessDenied; Request ID: f89ffbff-8c20-4ac2-b819-5313ef181f88; Proxy: null)
這邊主要是在Lambda的IAM中沒有配置權(quán)限辐烂,添加發(fā)送郵件權(quán)限即可。
{
"Effect": "Allow",
"Action": [
"ses:*"
],
"Resource": "*"
}
源代碼
代碼下載地址:https://pan.baidu.com/s/1vpBnbuxbiPwy1W_y51B6yw
提取碼:v2a3