AWS Lambda笔记-SES发电子邮件-12【含源代码】

应用程序中最常用的功能是发电子邮件。例如:用户注册成功,找回密码,电子账单等都需要。AWS也提供了发电子邮件的服务叫SES(Simple Email Service),只需要几行代码即可方便的发送各种邮件。

  1. SES配置和注意事项
  2. 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是一个在检测电子邮件欺诈的电子邮件认证方法,把这个设置添加到域中对于确保邮件的可交付性是个不错的选择。

配置域名并验证
验证域名

创建Route53记录

我们登陆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的白名单中,所有我们可以任意模拟一个邮箱前缀就可以通过代码发送邮件,例如:[email protected](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": "[email protected]"

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

你可能感兴趣的:(AWS Lambda笔记-SES发电子邮件-12【含源代码】)