gmail
ドメイン
メール

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

この記事では独自ドメインのメールを、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で受信できるようになる。