AWS SESでメールを受信してGmailに転送する

公開日時

結構前ではあるがAWS SESでメール受信ができるようになったので、お試しがてら独自ドメインのメールをGmailに転送するようにした。

SES自体は東京リージョンにも対応しているがメール受信機能は無効化されていたので、バージニア北部(us-east-1)で設定を行った。

メール本文をs3に保存して、Lambdaでs3から本文を読み出してGmailに転送するようにしている。

Lambdaのコードは下記記事を参考にさせていただいた。

import os
import boto3
import logging
import json
import re
from email import message_from_string

s3_client = boto3.client('s3')
ses_client = boto3.client('ses')
logger = logging.getLogger()
logger.setLevel(logging.INFO)
s3_bucket = os.environ['S3_BUCKET']
s3_path_prefix = os.environ['S3_PATH_PREFIX']
forward_to = os.environ['FORWARD_TO']
domain_prefix = os.environ['DOMAIN_PREFIX']

def send_mail(message):
    regexStr = r'(\w+@%s).*' % domain_prefix.replace('.', '\.')
    matchobj = re.search(regexStr, message['To'])
    from_address = matchobj.group(1)
    return ses_client.send_raw_email(
        Source = from_address,
        Destinations = [
            forward_to
        ],
        RawMessage = {
            'Data': message.as_string()
        }
    )

def lambda_handler(event, context):
    message_id = event['Records'][0]['ses']['mail']['messageId']
    s3_key = s3_path_prefix + message_id

    response = s3_client.get_object(
        Bucket = s3_bucket,
        Key    = s3_key
    )

    raw_message = response['Body'].read().decode('utf-8')
    message = message_from_string(raw_message)

    del message['DKIM-Signature']
    del message['Sender']
    del message['Return-Path']

    original_from = message['From']
    del message['From']

    if not message['Reply-To']: message['Reply-To'] = original_from

    message['Return-Path'] = forward_to

    res = send_mail(message)
    logger.info(json.dumps(res))

環境変数で↓を設定

name内容
DOMAIN_PREFIX転送元メールのtoに指定されているドメイン(Verifyを行った独自ドメイン)
FORWARD_TO転送先Gmailアドレス
S3_BUCKETSES受信時のActionに設定したS3バケット名
S3_PATH_PREFIXSES受信時のActionに設定したS3設定のObject key prefix

これで独自ドメイン宛のメールがGmailに転送されるようになった。

ついでに下記記事を参考にさせていただき、Gmailから独自ドメインメールアドレスとして送信もできるようにしておいた。

これでSESを使って独自ドメインメールの送受信ができるようになった。

独自ドメインのメール設定をSESに統一したかったので今回の対応を行ったが、「とりあえず手軽に独自ドメインメールの送受信がしたい」という場合はMailgunの方が楽。


Related #lambda

マネージメントコンソール上のエディタでLambdaのコードを書く際にnpmライブラリを追加したい

ローカルでライブラリをインストールしてからインポートする必要があった

Amazon API Gatewayのタイムアウト設定は最大29秒まで

上限緩和もできないので注意

Lambdaでaws cli configureを設定できるようにする

AWS_CONFIG_FILE=/tmp/.aws/configを設定した

CDK aws-lambda-nodejsのビルド時間を短縮する

Parcel v2.0.0-beta.1を使ってローカルでバンドルする

s3の署名付きURLが有効期限より前に見れなくなってしまう

IAMロールではなくIAMユーザの権限でURLを生成する必要があった

AWS Lambdaでpuppeteerを動かしスクリーンショットをs3に保存する

前から気になっていたHeadless Chromeをjsから操作できるpuppeteerを使って、スクリーンショットをs3に保存するAPIを作ることにした。