

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon WorkMail AWS Lambda の の設定
<a name="lambda"></a>

インバウンドおよびアウトバウンドの E メールフロールールで **Lambda 実行**アクションを使用して、ルールに一致する E メールメッセージを処理用の AWS Lambda 関数に渡します。

次の設定から Amazon WorkMail で **[Lambda を実行]** アクションを選択します。

**同期 **[Lambda を実行]** の設定**  
フロールールに一致する E メールメッセージは、送信または配信される前に処理のために Lambda 関数に渡されます。この設定を使用してメールの内容を変更します。さまざまなユースケースに合わせて、受信または送信のメールフローを制御することもできます。たとえば、Lambda 関数に渡されるルールは、機密性の高いメールメッセージの配信をブロックしたり、添付ファイルを削除したり、免責事項を追加したりできます。

**非同期 **[Lambda を実行]** の設定**  
フロールールに一致する E メールメッセージは、送信または配信中の処理のために Lambda 関数に渡されます。この設定は、E メールの配信には影響せず、受信または送信の E メールメッセージのメトリクスの収集などのタスクに使用されます。

同期設定と非同期設定のどちらを選択した場合でも、Lambda 関数に渡されるイベントオブジェクトには、受信または送信の E メールイベントのメタデータが含まれます。メタデータ内のメッセージ ID を使用して、E メールメッセージの完全なコンテンツにアクセスすることもできます。詳細については、 [を使用したメッセージコンテンツの取得 AWS Lambda](lambda-content.md) を参照してください。E メールイベントの詳細については、[Lambda イベントデータ](#lambda-data) を参照してください。

受信および送信 E メールフロールールの詳細については、[E メールフローの管理](email-flows.md) を参照してください。Lambda の詳細については、[AWS Lambda デベロッパーガイド **](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) を参照してください。

**注記**  
現在、Lambda E メールフロールールは、設定されている Amazon WorkMail 組織と同じ AWS リージョン内の Lambda 関数のみを参照 AWS アカウント します。

## AWS Lambda for Amazon WorkMail の開始方法
<a name="start-lambda"></a>

Amazon WorkMail AWS Lambda で の使用を開始するには、[WorkMail Hello World Lambda 関数](https://console.aws.amazon.com/lambda/home#/create/app?applicationId=arn:aws:serverlessrepo:us-east-1:489970191081:applications/workmail-hello-world-python)を から AWS Serverless Application Repository アカウントにデプロイすることをお勧めします。この関数には、お客様に必要なすべてのリソースと権限が設定されています。その他の例については、GitHub の [amazon-workmail-lambda-templates](https://github.com/aws-samples/amazon-workmail-lambda-templates) リポジトリを参照してください。

独自の Lambda 関数を作成する場合は、 AWS Command Line Interface () を使用してアクセス許可を設定する必要がありますAWS CLI。次のコマンドの例を使用するには、次の操作を行います。
+ `MY_FUNCTION_NAME` の部分はお客様の Lambda 関数の名前に置き換えます。
+ `REGION` の部分はお客様の Amazon WorkMail AWS リージョンに置き換えます。使用可能な Amazon WorkMail リージョンには、`us-east-1` (米国東部 (バージニア北部))、`us-west-2` (米国西部 (オレゴン))、`eu-west-1` (欧州 (アイルランド)) があります。
+ `AWS_ACCOUNT_ID` を、ご自身の 12 桁の AWS アカウント ID に置き換えます。
+ `WORKMAIL_ORGANIZATION_ID` の部分はお客様の Amazon WorkMail 組織 ID に置き換えます。これは、**[組織]** ページの組織のカードに記載されています。



```
aws --region REGION lambda add-permission --function-name MY_FUNCTION_NAME 
--statement-id AllowWorkMail 
--action "lambda:InvokeFunction" 
--principal workmail.REGION.amazonaws.com
--source-arn arn:aws:workmail:REGION:AWS_ACCOUNT_ID:organization/WORKMAIL_ORGANIZATION_ID
```

の使用の詳細については AWS CLI、[https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)」を参照してください。

## 同期 **[Lambda を実行]** ルールの設定
<a name="synchronous-rules"></a>

同期 **[Lambda を実行]** ルールを設定するには、**[Lambda の実行]** アクションを持つ E メールフロールールを作成し、**[同期して実行]** チェックボックスをオンにます。メールフロールールの作成の詳細については、[E メールフロールールの作成](create-email-rules.md) を参照してください。

同期ルールの作成を完了するには、Lambda Amazon リソースネーム (ARN) を追加し、次のオプションを設定します。

****フォールバックアクション****  
Amazon WorkMail アクションは、Lambda 関数の実行に失敗した場合に適用されます。このアクションは、**[すべての受信者]** が設定されていない場合、Lambda 応答からはずされた受信者にも適用されます。**[フォールバックアクション]** を別の Lambda アクションにすることはできません。

****[ルール]** (分)**  
Amazon WorkMail が呼び出しに失敗した場合に Lambda 関数が再試行される期間。**[フォールバックアクション]** は、この期間の終了時に適用されます。

**注記**  
同期 **[Lambda を実行]** ルールは、**\$1** 宛先指定の条件のみをサポートしています。

## Lambda イベントデータ
<a name="lambda-data"></a>

Lambda 関数は、以下のイベントデータを使用してトリガーされます。データの表示は、Lambda 関数に使用されているデータプログラミング言語に応じて異なります。

```
{
    "summaryVersion": "2018-10-10",
    "envelope": {
        "mailFrom" : {
            "address" : "from@example.com"
        },
        "recipients" : [
           { "address" : "recipient1@example.com" },
           { "address" : "recipient2@example.com" }
        ]
    },
    "sender" : {
        "address" :  "sender@example.com"
    },
    "subject" : "Hello From Amazon WorkMail!",
    "messageId": "00000000-0000-0000-0000-000000000000",
    "invocationId": "00000000000000000000000000000000",
    "flowDirection": "INBOUND",
    "truncated": false
}
```

イベント JSON には、次に示すデータが含まれます。

**summaryVersion**  
`LambdaEventData` のバージョン番号。`LambdaEventData` で後方互換性のない変更を加えた場合にのみ更新されます。

**envelope**  
E メールメッセージのエンベロープ。次のフィールドが含まれています。    
**mailFrom**  
**[送信元]** アドレス。通常、E メールメッセージを送信したユーザーの E メールアドレスです。ユーザーが E メールメッセージを別のユーザーとして送信したか別のユーザーの代理で送信した場合、**[mailFrom]** フィールドは、実際の送信者の E メールアドレスではなく、E メールメッセージの名目上の送信者であるユーザーの E メールアドレスを返します。  
**受信者**  
受信者の E メールアドレスのリスト。Amazon WorkMail では、 **To**、 **CC**、 または **BCC** を区別しません。  
受信 E メールフロールールの場合、このリストには、ルールを作成する Amazon WorkMail 組織内のすべてのドメインの受信者が含まれます。この Lambda 関数は、送信者からの SMTP 会話ごとに個別に呼び出され、受信者フィールドには、その SMTP 会話からの受信者がリストされます。外部ドメインの受信者は含まれません。

**送信者**  
別のユーザーの代理で E メールメッセージを送信したユーザーの E メールアドレス。このフィールドは、E メールメッセージが別のユーザーの代理で送信された場合にのみ設定されます。

**subject**  
E メールの件名。256 文字の制限を超えると切り捨てられます。

**messageId**  
Amazon WorkMail Message Flow SDK を使用するときに E メールメッセージの完全なコンテンツにアクセスするために使用される一意の ID。

**invocationId**  
一意の Lambda 呼び出しの ID。同じ **LambdaEventData** に対して Lambda 関数が複数回呼び出された場合でもこの ID に変わりはありません。再試行を検出し、重複を避けるために使用します。

**flowDirection**  
E メールフローの方向を示します。**INBOUND** または **OUTBOUND** のどちらかです。

**truncated**  
件名の長さではなく、ペイロードサイズに適用されます。`true` の場合、ペイロードサイズが 128 KB の制限を超えると、受信者のリストが制限を満たすように切り捨てられます。

## 同期 **[Lambda を実行]** 応答スキーマ
<a name="synchronous-schema"></a>

同期 **[Lambda を実行]** アクションを持つ E メールフロールールが受信または送信メールメッセージと一致した場合、Amazon WorkMail は設定された Lambda 関数を呼び出して、E メールメッセージに対してアクションを実行する前に応答を待ちます。この Lambda 関数は、アクション、アクションタイプ、適用可能なパラメータ、およびアクションが適用される受信者をリストする事前定義されたスキーマに従って応答を返します。

次の例は、同期 **[Lambda を実行]** 応答です。応答は、Lambda 関数に使用されるプログラミング言語によって異なります。

```
{
    "actions": [                          
      {
        "action" : {                       
          "type": "string",                 
          "parameters": { various }       
        },
        "recipients": [list of strings],      
        "allRecipients": boolean            
      }
    ]
}
```

レスポンス JSON には、次のデータが含まれます。

**action**  
受信者に対して実行するアクション。

**型**  
アクションタイプ。非同期 **[Lambda を実行]** アクションの場合、アクションタイプは返されません。  
インバウンドルールのアクションタイプには、**BOUNCE**、**DROP**、**DEFAULT**、**BYPASS\$1SPAM\$1CHECK**、**MOVE\$1TO\$1JUNK** があります。詳細については、[受信 E メールルールアクション](email-flows.md#email-flows-rule-actions) を参照してください。  
アウトバウンドルールのアクションタイプには、**BOUNCE**、**DROP**、**DEFAULT** があります。詳細については、[送信 E メールルールアクション](email-flows.md#email-flows-rule-outbound) を参照してください。

**パラメータ**  
追加のアクションパラメータ。**BOUNCE** アクションタイプで、**bounceMessage** キーおよび **string** 値を持つ JSON オブジェクトとしてサポートされます。このバウンスメッセージは、バウンス E メールメッセージを作成するために使用されます。

**受信者**  
アクションを実行する必要がある E メールアドレスのリスト。元の受信者リストに含まれていない場合でも、新しい受信者を応答に追加できます。アクションに対して **AllRecipients** が true の場合、このフィールドは必須ではありません。  
受信メールに対して Lambda アクションが呼び出されると、組織からの新しい受信者のみを追加できます。新しい受信者は、**BCC** として応答に追加されます。

**allRecipients**  
true の場合、Lambda 応答内の別の特定のアクションの対象とならないすべての受信者にアクションを適用します。

### 同期 **[Lambda を実行]** アクション制限
<a name="synchronous-limits"></a>

Amazon WorkMail が同期 **[Lambda を実行]** アクションの Lambda 関数を呼び出す場合は、次の制限が適用されます。
+ Lambda 関数は 15 秒以内に応答します。応答しない場合、失敗した呼び出しとして扱われます。
**注記**  
システムが、指定した **[ルールタイムアウト]** 間隔で呼び出しを再試行します。
+ 最大 256 KB の Lambda 関数応答が許可されます。
+ 応答では、最大 10 個の固有のアクションが許可されます。10 を超えるアクションは、設定された**フォールバックアクション**の対象となります。
+ 送信 Lambda 関数には、最大 500 人の受信者が許可されます。
+ **[ルールタイムアウト]** の最大値は 240 分です。最小値 0 が設定されている場合、Amazon WorkMail がフォールバックアクションを適用する前に再試行は行われません。

### 同期 **[Lambda を実行]** アクションのエラー
<a name="synchronous-failures"></a>

Amazon WorkMail が、エラー、無効な応答、または Lambda タイムアウトのために Lambda 関数を呼び出すことができない場合、Amazon WorkMail は **[ルールタイムアウト]** 期間が完了するまで、エクスポネンシャルバックオフで呼び出しを再試行します。次に、**フォールバックアクション**が、E メールメッセージのすべての受信者に適用されます。詳細については、「[同期 **[Lambda を実行]** ルールの設定](#synchronous-rules)」を参照してください。

## 同期 **[Lambda を実行]** 応答の例
<a name="synchronous-responses"></a>

次の例は、一般的な同期 **[Lambda を実行]** 応答の構造を示します。

**Example : 指定した受信者を E メールメッセージから削除します。**  
次の例は、E メールメッセージから受信者を削除するための同期 **[Lambda を実行]** 応答の構造を示します。  

```
{
    "actions": [
      {
        "action": {
          "type": "DEFAULT"
        },
        "allRecipients": true
      },
      {
        "action": {
          "type": "DROP"
        },
        "recipients": [
          "drop-recipient@example.com"
        ]
      }
    ]
}
```

**Example : カスタム E メールメッセージでバウンスする**  
次の例は、カスタム E メールメッセージでバウンスするため同期 **[Lambda を実行]** 応答の構造を示します。  

```
{
    "actions" : [
      {
        "action" : {
          "type": 'BOUNCE',
          "parameters": {
            "bounceMessage" : "Email in breach of company policy."
          }
        },
        "allRecipients": true
      }
    ]
}
```

**Example : E メールメッセージに受信者を追加する**  
次の例は、E メールメッセージに受信者を追加するための同期 **[Lambda を実行]** 応答の構造を示します。これにより、E メールメッセージの **[To]** または **[CC]** フィールドは更新されません。  

```
{
    "actions": [
      {
        "action": { 
          "type": "DEFAULT" 
        },
        "recipients": [
          "new-recipient@example.com"
         ]
      },
      {
        "action": { 
          "type": "DEFAULT" 
        },
        "allRecipients": true
      }
    ]
}
```

**[Lambda を実行]** アクションのための Lambda 関数を作成するときに使用するその他のコード例については、[Amazon WorkMail Lambda テンプレート](https://github.com/aws-samples/amazon-workmail-lambda-templates) を参照してください。

## Amazon WorkMail での Lambda の使用に関する詳細
<a name="lambda-more"></a>

Lambda 関数をトリガーする E メールメッセージの完全なコンテンツにアクセスすることもできます。詳細については、「[を使用したメッセージコンテンツの取得 AWS Lambda](lambda-content.md)」を参照してください。

# を使用したメッセージコンテンツの取得 AWS Lambda
<a name="lambda-content"></a>

Amazon WorkMail の E メールフローを管理するように AWS Lambda 関数を設定したら、Lambda を使用して処理される E メールメッセージの完全なコンテンツにアクセスできます。Lambda for Amazon WorkMail の使用開始に関する詳細については、[Amazon WorkMail AWS Lambda の の設定](lambda.md) を参照してください。

E メールメッセージのすべてのコンテンツにアクセスするには、Amazon WorkMail Message Flow API の `GetRawMessageContent`アクションを使用します。呼び出し時に Lambda 関数に渡される E メールメッセージ ID は、API にリクエストを送信します。これを受けて、API は E メールメッセージの完全な MIME コンテンツで応答します。詳細については、*Amazon WorkMail API リファレンス* の [Amazon WorkMail Message Flow](https://docs.aws.amazon.com/workmail/latest/APIReference/API_Operations_Amazon_WorkMail_Message_Flow.html) を参照してください。

次の例では、Python ランタイム環境を使用する Lambda 関数が、メッセージコンテンツ全体を取得する方法を示します。

**ヒント**  
Amazon WorkMail [ Hello World Lambda 関数](https://console.aws.amazon.com/lambda/home#/create/app?applicationId=arn:aws:serverlessrepo:us-east-1:489970191081:applications/workmail-hello-world-python)を から AWS Serverless Application Repository アカウントにデプロイすることから始めると、システムは必要なすべてのリソースとアクセス許可を持つ Lambda 関数をアカウントに作成します。その後、ユースケースに基づいて Lambda 関数にビジネスロジックを追加できます。

```
import boto3
import email
import os

def email_handler(event, context):
    workmail = boto3.client('workmailmessageflow', region_name=os.environ["AWS_REGION"])
    msg_id = event['messageId']
    raw_msg = workmail.get_raw_message_content(messageId=msg_id)

    parsed_msg = email.message_from_bytes(raw_msg['messageContent'].read())
    print(parsed_msg)
```

転送中のメッセージのコンテンツを分析する方法の詳細な例については、GitHub の [amazon-workmail-lambda-templates](https://github.com/aws-samples/amazon-workmail-lambda-templates) リポジトリを参照してください。

**注記**  
Amazon WorkMail Message Flow API は、送信中の E メールメッセージにアクセスする場合のみ使用します。メッセージは、送受信されてから 24 時間以内にのみアクセス可能です。ユーザーのメールボックスのメッセージにプログラムを使ってアクセスするには、IMAP や Exchange Web Services (EWS) など、Amazon WorkMail でサポートされている他のプロトコルの 1 つを使用します。

# AWS Lambda を使用したメッセージコンテンツの更新
<a name="update-with-lambda"></a>

E メールフローを管理するように同期 AWS Lambda 関数を設定したら、Amazon WorkMail Message フロー API の `PutRawMessageContent`アクションを使用して、転送中の E メールメッセージの内容を更新できます。Amazon WorkMail 向け Lambda 関数の使用開始に関する詳細については、[同期 **[Lambda を実行]** ルールの設定](lambda.md#synchronous-rules) を参照してください。API の詳細については、[PutRawMessageContent](https://docs.aws.amazon.com/workmail/latest/APIReference/API_messageflow_PutRawMessageContent.html) を参照してください。

**注記**  
PutRawMessageContent API には boto3 1.17.8 が必要です。または、Lambda 関数にレイヤーを追加することもできます。正しい boto3 バージョンをダウンロードするには、[GitHub の boto ページ](https://github.com/boto/boto)を参照してください。レイヤーの追加の詳細については、[関数でレイヤーの使用を設定する](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html#configuration-layers-using)を参照してください。  
以下に `"LayerArn":"arn:aws:lambda:${AWS::Region}:489970191081:layer:WorkMailLambdaLayer:2"` のレイヤーの例を示します。この例では、`${AWS::Region}` を us-east-1 など、適切な AWS リージョンで代用します。

**ヒント**  
Amazon WorkMail をデプロイすることから始めたら [Hello World Lambda 関数](https://console.aws.amazon.com/lambda/home#/create/app?applicationId=arn:aws:serverlessrepo:us-east-1:489970191081:applications/workmail-hello-world-python) AWS Serverless Application Repository からアカウントまで、システムは必要なすべてのリソースとアクセス許可を持つ Lambda 関数をアカウントに作成します。その後、ユースケースに基づいて Lambda 関数にビジネスロジックを追加できます。

先へ進む場合、次の点に注意してください。
+ [GetRawMessageContent](https://docs.aws.amazon.com/workmail/latest/APIReference/API_messageflow_GetRawMessageContent.html) API を使用して元のメッセージコンテンツを取得します。詳細については、[を使用したメッセージコンテンツの取得 AWS Lambda](lambda-content.md) を参照してください。
+ 元のメッセージが表示されたら、MIME コンテンツを変更します。完了したら、メッセージをアカウントの Amazon Simple Storage Service (Amazon S3) バケットにアップロードします。S3 バケットが Amazon WorkMail オペレーション AWS アカウント と同じ を使用し、API コールと同じ AWS リージョンを使用していることを確認します。
+ Amazon WorkMail がリクエストを処理するには、S3 オブジェクトにアクセスするための正しいポリシーが S3 バケットに必要です。詳細については、「[Example S3 policy](#s3example)」を参照してください。
+ [PutRawMessageContent](https://docs.aws.amazon.com/workmail/latest/APIReference/API_messageflow_PutRawMessageContent.html) APIを使用して更新されたメッセージコンテンツを Amazon WorkMail に返信します。

**注記**  
`PutRawMessageContent` API は、更新されたメッセージの MIME コンテンツが RFC 標準を満たしていること、および [RawMessageContent](https://docs.aws.amazon.com/workmail/latest/APIReference/API_messageflow_RawMessageContent.html) データタイプで言及している基準を満たしていることを確認します。Amazon WorkMail 組織への受信メールは、必ずしもそれらの基準を満たすとは限らないため、`PutRawMessageContent` API はそれらを拒否する可能性があります。このような場合の問題の修正方法の詳細については、返されたエラーメッセージを参照してください。

**Example S3 ポリシーの例**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "workmail.REGION.amazonaws.com"
            },
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": "arn:aws:s3:::My-Test-S3-Bucket/*",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "111122223333"
                },
                "Bool": {
                    "aws:SecureTransport": "true"
                },
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:workmailmessageflow:us-east-1:111122223333:message/WORKMAIL_ORGANIZATION_ID/*"
                }
            }
        }
    ]
}
```

次の例は、Lambda 関数が Python ランタイムを使用して、送信中の E メールメッセージの件名を更新する方法を示しています。

```
    import boto3
    import os
    import uuid
    import email
     
    def email_handler(event, context):
        workmail = boto3.client('workmailmessageflow', region_name=os.environ["AWS_REGION"])
        s3 = boto3.client('s3', region_name=os.environ["AWS_REGION"])
        
        msg_id = event['messageId']
        raw_msg = workmail.get_raw_message_content(messageId=msg_id)
        parsed_msg = email.message_from_bytes(raw_msg['messageContent'].read())
        
        # Updating subject. For more examples, see https://github.com/aws-samples/amazon-workmail-lambda-templates.
        parsed_msg.replace_header('Subject', "New Subject Updated From Lambda")
       
        # Store updated email in S3
        key = str(uuid.uuid4());
        s3.put_object(Body=parsed_msg.as_bytes(), Bucket="amzn-s3-demo-bucket", Key=key)
     
        # Update the email in WorkMail
        s3_reference = {
            'bucket': "amzn-s3-demo-bucket",
            'key': key
        }
        content = {
            's3Reference': s3_reference
        }
        workmail.put_raw_message_content(messageId=msg_id, content=content)
```

送信中のメッセージのコンテンツを分析する方法の詳細な例については、GitHub の [amazon-workmail-lambda-templates](https://github.com/aws-samples/amazon-workmail-lambda-templates) リポジトリを参照してください。