Lambda と Amazon SES を使用して E メールを送信する方法を教えてください。

所要時間3分
0

AWS Lambda と Amazon Simple Email Service (Amazon SES) を使用してメールを送信したいと考えています。

簡単な説明

Amazon SES を使用して Lambda 関数から E メールを送信するには、次の手順を実行します。

1.    Lambda が API 呼び出しを実行するための AWS Identity and Access Management (IAM) ポリシーと実行ロールを作成します。

2.    Amazon SES の ID (ドメインまたは E メールアドレス) を確認してください。

3.    Amazon SES 経由で E メールを送信するロジックを含む Lambda 関数を作成または更新します。

**注:**E メールに PDF の添付ファイルを含めるには、Amazon SES SendRawEmail APIオペレーションを使用する必要があります。詳細については、GitHub の「Amazon SES API を使用して未処理の E メールを送信する」を参照してください。

解決策

注: この記事の Node.jsPythonRuby Lambda 関数のコード例は、ユースケースに応じて変更する必要があります。例をユースケースに合わせて調整するか、任意のプログラミング言語で自分自身でコードを設計してください。

Lambda が API 呼び出しを実行するための IAM ポリシーと実行ロールを作成する

1.    JSON ポリシーエディタを使用して IAM ポリシーを作成します。ポリシーを作成したら、次の JSON ポリシードキュメントをポリシーエディタに貼り付けます。

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

**注:**このポリシーへのアクセスを制限する方法の詳細と例については、Amazon SES の IAM ポリシーの例を参照してください。

2.    IAM ポリシーを IAM ロールにアタッチします。手順については、「IAM ID アクセス権限の追加 (コンソール)」の「管理ポリシーをアイデンティティのアクセスポリシーとして使用するには (コンソール)」セクションを参照してください。

**注:**次のステップで、この IAM ロールを Lambda 関数に割り当てます。

Amazon SES の ID (ドメインまたは E メールアドレス) を確認する

ドメインを検証するには、「DNS プロバイダーによる DKIM ドメイン ID の検証」を参照してください。

E メールアドレスを確認するには、「E メールアドレス ID の検証」を参照してください。

Amazon SES 経由で E メールを送信するロジックを含む Lambda 関数を作成または更新する

1.    まだの場合は、Lambda 関数を作成してください

注: Lambda 関数は、Lambda コンソールを使用するか、デプロイパッケージをビルドしてアップロードすることで作成できます。

2.    Lambda コンソールの左側のナビゲーションペインで、[Functions] (関数) を選択します。

3.    関数の名前を選択します。

4.    [設定] タブの [許可] ペインで、関数の [実行ロール] を確認します。以前に作成した Amazon SES アクセス権限を持つ IAM ロールがリストされていることを確認します。正しい IAM ロールがリストにない場合は、関数に正しいロールを割り当ててください。

5.    [関数コード] の下のエディターペインに、以下のサンプル関数コードを貼り付けます。使用している Node.js、Python、または Ruby のランタイムとバージョンに関連する例を必ず使用してください。

重要: us-west-2 は、検証済みの Amazon SES の ID が属する AWS リージョンに置き換えてください。"RecipientEmailAddress", ... を、E メールアドレス、または E メールを送信したいアドレスに置き換えます。SourceEmailAddress を、Amazon SES 検証済み送信者の E メールアドレスまたは Amazon SES 検証済みドメインの E メールアドレスに置き換えます。必要に応じて、メッセージ本文 (「テスト」) と件名 (「テストメール」) を編集します。

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 の使用方法の詳細については、JavaScriptPythonRuby、および Java V2 の AWS SDK ドキュメントを参照してください。

6.    [デプロイ] を選択します。

(オプション) テスト E メールの送信

1.    Lambda コンソールで、関数のテストイベントを設定します。

注: テストペイロードは必須ですが、このコード例では使用していません。

2.    [テスト] を選択します。Lambda は Amazon SES を使用してテストメールを受信者に送信します。

関連情報

Amazon SES を使用して E メールを送信する

Amazon SES における ID およびアクセス管理

AWS公式
AWS公式更新しました 1年前
コメントはありません

関連するコンテンツ