应用程序中最常用的功能是发电子邮件。例如:用户注册成功,找回密码,电子账单等都需要。AWS也提供了发电子邮件的服务叫SES(Simple Email Service),只需要几行代码即可方便的发送各种邮件。
- SES配置和注意事项
- Lambda发送电子邮件
源代码
代码下载地址:https://pan.baidu.com/s/1vpBnbuxbiPwy1W_y51B6yw
提取码:v2a3
工程说明
首先配置SES的域名并确认配置成功,然后在用户注册工程(lambda-userregistration)中添加发送邮件功能,在cloudformation.template中配置权限和发件箱环境变量。
工程关系配置
1. SES配置和注意事项
使用SES服务,需要进行简单的域名配置。可以通过AWS CLI,也可以通过AWS SES控制台配置。
1)配置域名并验证
2)配置DNS服务
3)SNS沙盒模式限制和白名单配置
4)解锁SNS沙盒模式
1)配置域名并验证
准备一个域名并在Route 53 上进行NS配置。若没有配置可以参考《AWS Lambda笔记-内容分发(CDN)-7》-2. 配置自定义域名。
登陆SES控制台https://console.aws.amazon.com/ses/home选择左边菜单“Domains”,按以下截图配置。图片第4步,勾选DKIM是一个在检测电子邮件欺诈的电子邮件认证方法,把这个设置添加到域中对于确保邮件的可交付性是个不错的选择。
我们登陆Route 53 控制台,我们会发现记录自动创建完成,登陆并确认下。刷新下SES控制台会发现之前验证域名的状态从“pending verification” >“verified”通过验证。整个过程非常快,只需几秒即可完成。
注意:如果域名不在Route53上,以上TXT,MX,CNAME记录需要Copy添加到手动配置到自己的域名解析中。 Route 53控制台界面
SES控制台域名验证成功
3)SNS沙盒模式限制和白名单配置
目前域名顺利验证通过,但是还处于“沙盒模式”,在沙盒模式下账户不能通过账号随便发送给其他邮箱,如果想发邮件,可以通过添加白名单,对方邮箱验证通过后才能给对方邮箱发邮件。
添加验证邮箱 打开验证的邮箱 验证通过
4)解锁SNS沙盒模式
要解锁沙盒模式,给想要的人发邮件,我们需要申请一个技术支持才能解锁账户。访问导航页面填写表单https://aws.amazon.com/ses/extendedaccessrequest/按照表单的要求填写内容即可。
2. Lambda发送电子邮件
用户注册成功后可以发送一份欢迎邮件,AWS提供了发送邮件的SDK(aws-java-sdk-ses), 这里只是单纯的发邮件,并且邮箱在SES的白名单中,所有我们可以任意模拟一个邮箱前缀就可以通过代码发送邮件,例如:hello@domain.com(domain.com 是上一步我们认证通过的域名,hello是随意取的名称)。
1)添加aws-java-sdk-ses的依赖包
2)向Lambda的IAM许可中添加权限
3)Lambda发送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许可中添加权限
在cloudformation.template的LambdaCustomPolicy权限中添加,若忘记添加权限,在发邮件是log日志中会有个 Service: AmazonSimpleEmailService; Status Code: 403; Error Code: AccessDenied; 的提醒。
{
"Effect": "Allow",
"Action": [
"ses:*"
],
"Resource": "*"
}
为方便配置,可以把发送的Email地址写到Lambda的环境变量中,在取出是只需要System.getenv("SenderEmail")
即可。(example.com换成自己通过SES认证的域名)
UserRegistrationLambda的Lambda配置中添加环境变量:
"SenderEmail": "lazy@example.com"
3)Lambda发送Email
我们在lambda-userregistration的Handle.java 中添加发送邮件的代码,通过SES发邮件,我们需要创建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);
//邮件内容
Message message = new Message()
.withBody(new Body().withText(new Content("Welcome !!!")))
.withSubject(new Content("Welcome!"));
//发送邮件,发件地址从配置的环境变量中获取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);
//用户注册成功,发送邮件
sendEmail(input.email);
//返回生成user的原始URL
return new RegistrationOutput(createdUser);
}
发布工程./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中没有配置权限,添加发送邮件权限即可。
{
"Effect": "Allow",
"Action": [
"ses:*"
],
"Resource": "*"
}
源代码
代码下载地址:https://pan.baidu.com/s/1vpBnbuxbiPwy1W_y51B6yw
提取码:v2a3
网友评论