64
56

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Gmail + AWSで独自ドメインのメールを受信する

Posted at

この記事では独自ドメインのメールを、GmailとAWSを使って受信できるようにすることを目的としています。Gmailで 送信 できるようにしたい場合はもっと簡単にできるので、以下の記事を参照にしてください。

お名前.comで取得したドメインでGmailからメール送信する
※ 上の記事では、レジストラとしてお名前.comを想定しているが、他のレジストラであってもやり方は基本的には同じ。

0. メール受信方式の概要

  • 独自ドメインのネームサーバをRoute53にする
  • Route53でMXレコードを設定する
  • SESで独自ドメインメールを受信できるように設定する
  • 受信したメールをS3に保存するよう設定する
  • S3にメールが保存されたときにGmailに転送するLambdaスクリプトを作成する

1. 独自ドメインのネームサーバをRoute53にする

AWSコンソールでRoute53を開き、「Create Hosted Zone」をクリック

ss 2018-07-01 18.19.05.png

ドメイン名を入力する。例えばメールアドレスsupport@example.comのようのメールアドレスを運用したい場合、example.comと入力すればOK。
コメントは任意。TypeはPublic Hosted Zone。

ss 2018-07-0118.19.20.png

以下のような画面になるはず。この画面で「NSレコード」の欄に表示されている4つのネームサーバの名前をメモっておく。

ss 2018-07-01 18.24.50.png

お名前.comのドメインNaviにアクセスし、「ネームサーバの変更」をクリック

ss 2018-07-01 18.36.29.png

対象のドメインを選択し、画面中段のタブ「他のネームサーバを利用」をクリック。画面下部に表示される「ネームサーバー情報を入力」の入力欄に、さきほどメモったRoute53の4つのネームサーバを入力

ss 2018-07-01 18.37.09.png

しばらく待つ(最大でも72時間)と、ドメインのネームサーバがDNS全体に反映される。

2. Amazon S3でメールを受け取れるようにする

AWSのサービス群の中からSESを選択
ss 2018-07-01 20.09.53.png

画面右上のリージョンが「バージニア北部」になっていることを確認し、左のメニューの中からDomainsを選択
ss 2018-07-01 18.50.03.png

「Verify a New Domain」をクリック
ss 2018-07-01 18.50.14.png

ドメイン名を入力。「Generate DKIM Setting」にチェック。
ss 2018-07-01 18.50.49.png

そのまま「Use Route 53」をクリック
ss 2018-07-01 18.51.01.png

「Domain Verification Record」「DKIM Record Set」「Email Receiving Record」「Hosted Zones」にチェックを入れ、「Create Record Sets」をクリック
ss 2018-07-01 18.51.21.png

しばらく待ち、有効化されることを確認する。以下のようになればOK
ss 2018-07-01 20.44.03.png

次に、メールを受け取るGmailを有効化しておく。左のメニューから「Email Addresses」をクリック。画面上部の「Verify a New Email Address」をクリック。
ss 2018-07-01 18.52.19.png

この画面で、独自ドメインのメールを受け取るGmailアカウント(メールアドレス)を入力。Gmailに確認メールが届いているのでURLをクリックして有効化する。
ss 2018-07-01 18.52.25.png

これでSESからGmailにメールが送れるようになった。
次に、独自ドメインのメールをS3に保存できるようにする。

AWSのサービス群の中から「S3」を選択する。

ss 2018-07-01 21.34.25.png

「バケットを作成する」をクリック
ss 2018-07-01 22.30.24.png

バケット名(任意)を入力。ここでは「ドメイン名-mailbox」というバケット名にする。リージョンは「東京」を選択。「作成」ボタンをクリック。
ss 2018-07-01 22.31.00.png

作成されたバケットを編集する。「アクセス制限」のタブから「バケットポリシー」をクリック。
ss 2018-07-01 22.33.03.png

エディターには以下のポリシーを貼り付ける。YOUR_BUCKET_NAMEYOUR_AWS_IDはそれぞれ、さきほど作ったバケット名、自身のAWSアカウントIDを表している。適宜読み替えてほしい。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowSESPuts",
            "Effect": "Allow",
            "Principal": {
                "Service": "ses.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::[YOUR_BUCKET_NAME]/*",
            "Condition": {
                "StringEquals": {
                    "aws:Referer": "[YOUR_AWS_ID]"
                }
            }
        }
    ]
}

再びSESの画面に戻り、左側の「Rule Sets」をクリック。画面上部の「View Active Rule Set」をクリック。

ss 2018-07-01 22.34.00.png

「Create Rule」をクリック。
ss 2018-07-01 22.34.53.png

入力ボックスにドメインを入力。「Add Recipient」をクリック。「Next Step」をクリック。
ss 2018-07-01 22.35.30.png

「Add Action」でS3を選択。「S3 bucket」で先程作成したバケットを選択。「Next Step」をクリック。
ss 2018-07-01 22.35.55.png

「Rule name」にルール名(任意)を入力。ここでは、「ドメイン名-mailbox-rule」とする。「Next Step」をクリック。

ss 2018-07-01 22.39.36.png

「Create Rule」をクリック。
ss 2018-07-01 22.39.50.png

以上で、S3にメールを保存するルールファイルが出来上がった。試しにsupport@_独自ドメイン_でメールを送ってみて、S3にメールが保存されているか確認しよう。

3. S3に保存されたメールをGmailに送る

AWSのサービス群の中から「IAM」を選択する。

ss 2018-07-01 23.35.06.png

左のメニューの中から「ロール」をクリック。画面中央の「ロールの作成」をクリック。
ss 2018-07-01 23.35.31.png

「Lambda」を選択し「次のステップ」をクリック。
ss 2018-07-01 23.35.45.png

「AmazonSESFullAccess」と「AmazonS3FullAccess」を選択し、「次のステップ」をクリック
ss 2018-07-01 23.36.22.png
ss 2018-07-01 23.36.10.png

任意の「ロール名」および「ロールの説明」を記入して「ロールの作成」をクリック。
ss 2018-07-01 23.36.38.png

これでロールは完成。

次に、AWSのサービス群の中から「Lambda」を選択。

ss 2018-07-01 23.45.26.png

リージョンを「東京」にし、「関数の作成」を選択。
ss 2018-07-01 23.45.51.png

「名前」に任意の関数名を入力。ここでは「xxxxxxx-email-transportation」とした。「ランタイム」は「Python2.7」を選択。「ロール」は「既存のロールを選択」を選択。「既存のロール」には、先程作成した、S3とSESの権限が含まれているロールを選択。以上ができたら「関数の作成」をクリック。
ss 2018-07-01 23.46.58.png

左上部のリストの中からS3を選択。画面下部のトリガーの設定画面で、先程作ったメール保存用のバケットを選択。以上ができたら右下の「追加」をクリック。
ss 2018-07-01 23.48.14.png

画面中央の「xxxxxxx-email-transportation」をクリック。
ss 2018-07-01 23.50.28.png

画面下部のエディタの欄に以下のコードを貼り付け。ただし、

ORIGIN_TO  = "support@[YOUR_DOMAIN]"
FORWARD_TO = "[YOUR_GMAIL]@gmail.com"
SES_REGION = "us-east-1"
S3_BUCKET  = "[YOUR_BUCKET_NAME]"

の部分は適宜読み替えてほしい。

import boto3
import email
import re

ORIGIN_TO  = "support@[YOUR_DOMAIN]"
FORWARD_TO = "[YOUR_GMAIL]@gmail.com"
SES_REGION = "us-east-1"
S3_BUCKET  = "[YOUR_BUCKET_NAME]"

def parse_mail(raw_message):
    
    from_name = 'No Name'
    
    pattern = re.compile(r'^From:\s*(.+?)$', re.MULTILINE)
    m = re.search(pattern, raw_message)
    if m:
        from_name = m.group(1)[:-1]
    replaced_message = raw_message.replace(ORIGIN_TO, FORWARD_TO)
    replaced_message = re.sub(r'^From:\s*.+?$', r'From: "%s" <%s>' % (from_name, ORIGIN_TO), replaced_message, flags=re.MULTILINE)
    replaced_message = re.sub(r'^Return-Path:\s*.+?$', r'Return-Path: "%s" <%s>' % (from_name, ORIGIN_TO), replaced_message, flags=re.MULTILINE)

    return replaced_message

def send_mail(message):

    ses = boto3.client('ses', region_name=SES_REGION)

    ses.send_raw_email(
        Source = FORWARD_TO,
        Destinations=[
            FORWARD_TO
        ],
        RawMessage={
            'Data': message
        }
    )

def lambda_handler(event, context):
    try:
        s3_key = event['Records'][0]['s3']['object']['key']

        s3 = boto3.client('s3')
        response = s3.get_object(
            Bucket = S3_BUCKET,
            Key    = s3_key
        )
        raw_message = response['Body'].read()
        message = parse_mail(raw_message)

        send_mail(message)

    except Exception as e:
        print(e)

以上ができたら、「保存」をクリック。

これで、独自ドメインに送ったメールをGmailで受信できるようになる。

64
56
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
64
56

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?