この記事では独自ドメインのメールを、GmailとAWSを使って受信できるようにすることを目的としています。Gmailで 送信 できるようにしたい場合はもっと簡単にできるので、以下の記事を参照にしてください。
お名前.comで取得したドメインでGmailからメール送信する
※ 上の記事では、レジストラとしてお名前.comを想定しているが、他のレジストラであってもやり方は基本的には同じ。
0. メール受信方式の概要
- 独自ドメインのネームサーバをRoute53にする
- Route53でMXレコードを設定する
- SESで独自ドメインメールを受信できるように設定する
- 受信したメールをS3に保存するよう設定する
- S3にメールが保存されたときにGmailに転送するLambdaスクリプトを作成する
1. 独自ドメインのネームサーバをRoute53にする
AWSコンソールでRoute53を開き、「Create Hosted Zone」をクリック
ドメイン名を入力する。例えばメールアドレスsupport@example.comのようのメールアドレスを運用したい場合、example.comと入力すればOK。
コメントは任意。TypeはPublic Hosted Zone。
以下のような画面になるはず。この画面で「NSレコード」の欄に表示されている4つのネームサーバの名前をメモっておく。
お名前.comのドメインNaviにアクセスし、「ネームサーバの変更」をクリック
対象のドメインを選択し、画面中段のタブ「他のネームサーバを利用」をクリック。画面下部に表示される「ネームサーバー情報を入力」の入力欄に、さきほどメモったRoute53の4つのネームサーバを入力
しばらく待つ(最大でも72時間)と、ドメインのネームサーバがDNS全体に反映される。
2. Amazon S3でメールを受け取れるようにする
画面右上のリージョンが「バージニア北部」になっていることを確認し、左のメニューの中からDomainsを選択
ドメイン名を入力。「Generate DKIM Setting」にチェック。
「Domain Verification Record」「DKIM Record Set」「Email Receiving Record」「Hosted Zones」にチェックを入れ、「Create Record Sets」をクリック
しばらく待ち、有効化されることを確認する。以下のようになればOK
次に、メールを受け取るGmailを有効化しておく。左のメニューから「Email Addresses」をクリック。画面上部の「Verify a New Email Address」をクリック。
この画面で、独自ドメインのメールを受け取るGmailアカウント(メールアドレス)を入力。Gmailに確認メールが届いているのでURLをクリックして有効化する。
これでSESからGmailにメールが送れるようになった。
次に、独自ドメインのメールをS3に保存できるようにする。
AWSのサービス群の中から「S3」を選択する。
バケット名(任意)を入力。ここでは「ドメイン名-mailbox」というバケット名にする。リージョンは「東京」を選択。「作成」ボタンをクリック。
作成されたバケットを編集する。「アクセス制限」のタブから「バケットポリシー」をクリック。
エディターには以下のポリシーを貼り付ける。YOUR_BUCKET_NAME
とYOUR_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」をクリック。
入力ボックスにドメインを入力。「Add Recipient」をクリック。「Next Step」をクリック。
「Add Action」でS3を選択。「S3 bucket」で先程作成したバケットを選択。「Next Step」をクリック。
「Rule name」にルール名(任意)を入力。ここでは、「ドメイン名-mailbox-rule」とする。「Next Step」をクリック。
以上で、S3にメールを保存するルールファイルが出来上がった。試しにsupport@_独自ドメイン_でメールを送ってみて、S3にメールが保存されているか確認しよう。
3. S3に保存されたメールをGmailに送る
AWSのサービス群の中から「IAM」を選択する。
左のメニューの中から「ロール」をクリック。画面中央の「ロールの作成」をクリック。
「AmazonSESFullAccess」と「AmazonS3FullAccess」を選択し、「次のステップ」をクリック
任意の「ロール名」および「ロールの説明」を記入して「ロールの作成」をクリック。
これでロールは完成。
次に、AWSのサービス群の中から「Lambda」を選択。
「名前」に任意の関数名を入力。ここでは「xxxxxxx-email-transportation」とした。「ランタイム」は「Python2.7」を選択。「ロール」は「既存のロールを選択」を選択。「既存のロール」には、先程作成した、S3とSESの権限が含まれているロールを選択。以上ができたら「関数の作成」をクリック。
左上部のリストの中からS3を選択。画面下部のトリガーの設定画面で、先程作ったメール保存用のバケットを選択。以上ができたら右下の「追加」をクリック。
画面中央の「xxxxxxx-email-transportation」をクリック。
画面下部のエディタの欄に以下のコードを貼り付け。ただし、
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で受信できるようになる。