如何使用 Lambda 和 Amazon SES 來傳送電子郵件?

3 分的閱讀內容
0

我想要使用 AWS Lambda 和 Amazon Simple Email Service (Amazon SES) 來傳送電子郵件。

簡短描述

若要使用 Amazon SES 從 Lambda 函數傳送電子郵件,請完成以下步驟:

1.    為 Lambda 建立 AWS Identity and Access Management (IAM) 政策和執行角色,以執行 API 呼叫。

2.    驗證您的 Amazon SES 身分 (網域或電子郵件地址)。

3.    建立或更新 Lambda 函數,其中包含透過 Amazon SES 傳送電子郵件的邏輯。

**注意:**若要在電子郵件中包含 PDF 附件,您必須使用 Amazon SES SendRawEmail API 操作。如需詳細資訊,請參閱 GitHub 上的使用 Amazon SES API 傳送原始電子郵件

解決方法

**注意:**本文中的 Node.jsPythonRuby Lambda 函數程式碼範例需要根據您的使用案例來修改。調整範例以適用您的使用案例,或使用您的偏好程式設計語言來設計您自己的範例。

為 Lambda 建立 IAM 政策和執行角色以執行 API 呼叫

1.    使用 JSON 政策編輯器建立 IAM 政策。您建立政策時,請將下列 JSON 政策文件貼到政策編輯器:

{
 "Version": "2012-10-17",
 "Statement": [
 {
 "Effect": "Allow",
 "Action": [
 "ses:SendEmail",
 "ses:SendRawEmail"
 ],
 "Resource": "*"
 }
 ]
}

**注意:**如需如何限制存取此政策的詳細資訊和範例,請參閱 Amazon SES 的範例 IAM 政策

2.    將 IAM 政策連接到 IAM 角色。如需說明,請參閱新增 IAM 身分許可 (主控台)將受管理政策當做身分的許可政策來使用 (主控台) 一節。

**注意:**您要依照下列步驟將此 IAM 角色指派給您的 Lambda 函數。

驗證您的 Amazon SES 身分 (網域或電子郵件地址)

若要驗證網域,請參閱驗證 DNS 提供者的 DKIM 網域身分

若要驗證電子郵件地址,請參閱驗證電子郵件地址身分

建立或更新 Lambda 函數,其中包含透過 Amazon SES 傳送電子郵件的邏輯

1.    如果您還沒有這樣做,請建立 Lambda 函數

**注意:**您可以藉由使用 Lambda 主控台或建立並上傳部署套件,來建立 Lambda 函數。

2.    在 Lambda 主控台的左側導覽窗格中,選擇函數

3.    選擇函數的名稱。

4.    在組態標籤上的許可窗格中,查看函數的執行角色。確認已列出您先前所建立具有 Amazon SES 許可的 IAM 角色。如果未列出正確的 IAM 角色,請將正確的角色指派給函數。

5.    在函數程式碼下的編輯器窗格中,貼上下列其中一個函數程式碼範例。請務必使用適用於您執行期以及 Node.js、Python 或 Ruby 版本的相關範例。

**重要:**將 us-west-2 取代為已驗證的 Amazon SES 身分所在的 AWS 區域。將 "RecipientEmailAddress", ... 取代為您想要傳送電子郵件的一個或多個電子郵件地址。將 SourceEmailAddress 取代為經過 Amazon SES 驗證的寄件者電子郵件地址,或經過 Amazon SES 驗證網域中的任何電子郵件地址。或者,編輯訊息內文 (「測試」) 和主旨行 (「測試電子郵件」)。

若為 Node.js 第 18 版及更新版本,請參閱下列範例程式碼:

// Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

import { SESClient, SendEmailCommand } from "@aws-sdk/client-ses";
const ses = new SESClient({ region: "us-west-2" });

export const handler = async(event) => {
  const command = new SendEmailCommand({
    Destination: {
      ToAddresses: ["RecipientEmailAddress", ...],
    },
    Message: {
      Body: {
        Text: { Data: "Test" },
      },

      Subject: { Data: "Test Email" },
    },
    Source: "SourceEmailAddress",
  });

  try {
    let response = await ses.send(command);
    // process data.
    return response;
  }
  catch (error) {
    // error handling.
  }
  finally {
    // finally.
  }
};

若為 Node.js 第 16 版及更早版本,請參閱下列範例程式碼:

// Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

var aws = require("aws-sdk");
var ses = new aws.SES({ region: "us-west-2" });
exports.handler = async function (event) {
  var params = {
    Destination: {
      ToAddresses: ["RecipientEmailAddress", ...],
    },
    Message: {
      Body: {
        Text: { Data: "Test" },
      },

      Subject: { Data: "Test Email" },
    },
    Source: "SourceEmailAddress",
  };

  return ses.sendEmail(params).promise()
};

若為 Python 3.9 版,請參閱下列範例程式碼:

import json
import boto3

client = boto3.client('ses', region_name='us-west-2')

def lambda_handler(event, context):

    response = client.send_email(
    Destination={
        'ToAddresses': ['RecipientEmailAddress']
    },
    Message={
        'Body': {
            'Text': {
                'Charset': 'UTF-8',
                'Data': 'This is the message body in text format.',
            }
        },
        'Subject': {
            'Charset': 'UTF-8',
            'Data': 'Test email',
        },
    },
    Source='SourceEmailAddress'
    )

    print(response)

    return {
        'statusCode': 200,
        'body': json.dumps("Email Sent Successfully. MessageId is: " + response['MessageId'])
    }

若為 Ruby 2.7 版,請參閱下列範例程式碼:

require "aws-sdk-ses"

$ses = Aws::SES::Client.new(region: "us-west-2")

def lambda_handler(event:, context:)

  resp = $ses.send_email({
  destination: {
    to_addresses: ["RecipientEmailAddress"],
  },
  message: {
    body: {
      text: {
        charset: "UTF-8",
        data: "This is the message body in text format.",
      },
    },
    subject: {
      charset: "UTF-8",
      data: "Test email",
    },
  },
  source: "SourceEmailAddress"
})
    { statusCode: 200, body: JSON.generate("Message Sent Successfully. #{resp.to_h} ") }
end

如需使用 sendEmail API 的詳細資訊,請參閱適用於 JavaScriptPythonRubyJava V2 的 AWS SDK 文件。

6.    選擇部署

(選用) 傳送測試電子郵件

1.    在 Lambda 主控台中,為您的函數設定測試事件

**注意:**測試有效負載為必要項目,但未用於此程式碼範例。

2.    選擇測試。Lambda 會使用 Amazon SES 將測試電子郵件傳送給您的收件者。

相關資訊

使用 Amazon SES 傳送電子郵件

Amazon SES 中的身分和存取權管理

AWS 官方
AWS 官方已更新 2 年前