はじめに
個人事業主になってから半年くらいになりますが、未だにメールアドレスをGmailにしていて
そろそろ独自ドメインのメールアドレスで事業主っぽい環境を整えようかと思い構築しました。
※当記事ではAWSを使いエンジニアリングな環境で構築することを目的としています。
手っ取り早く設定したい場合はSendGridなど各種サービスを使用することを推奨します。
前提条件
今回使用するリソースは以下になります。
-
お名前.com
- ※既にドメインを取得していますので流用しています
- ※新規でドメインから登録する場合はAWSのRoute53を推奨します
-
AWS
- アカウントがない場合は新規に作成しておきます
-
Gmail
- 既存で使用可能なフリーのメールアドレスを用意しておきます
-
Node.jsライブラリ
- https://github.com/arithmetric/aws-lambda-ses-forwarder を使います
- ローカル環境で
npm install
等のコマンドが使用できることとします
ドメイン取得
当記事ではお名前.comで取得したドメインで進めていきます。
ドメインの取得方法は割愛します。
https://www.onamae.com/
なお、AWSのRoute53からも取得することができます。
当記事ではRoute53にホスティングしますので、新規ユーザーの方は親和性の高いAWSから取得することも選択肢の一つとしてよいでしょう。
取得方法は以下を参考にしましょう。
https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/registrar.html
Route53の設定
お名前.comで取得したドメインをRoute53でホスティングします。
ホストゾーンの作成
から自身のドメインを入力し、登録が完了すればOKです。
ネームサーバーの設定
お名前.comを使用する場合の例です。
お名前.com Naviにログインしネームサーバー情報
から変更する
で以下のネームサーバーの情報を入力し保存します。
保存後に設定した情報が反映されていることを確認します。
SESの設定
Amazon Simple Email Service
メールの送受信に使用するサービスです。
2019/08時点では東京リージョンに対応していないのでバージニア北部あたりで設定を進めます。
まずはドメインを登録するためにVerify a New Domain
から自身のドメインを登録します。
Generate DKIM Settings
はONにしておきます。
数分待ち、検証が完了するとVerification Status
がVerified
になっていることを確認します。
送受信用メールアドレスの設定
SESはデフォルトでは自身が登録したメールアドレスでのみ受信が可能です。
申請により制限が解除されれば問題ありませんが、制限解除まで時間がかかるので後述の設定のために
Verify a New Email Address
よりフリーのメールアドレス(Gmailなど)を登録しておきます。
SMTP認証ユーザー設定
SMTP Settings
よりCreate My SMTP Credentials
を押下します。
IAMユーザーが作成されますので、アクセスキーとシークレットアクセスキーをメモしておきます。
この情報は後ほどGmailの送信設定からSMTPのユーザー名/パスワードとして登録します。
受信ルール設定
独自ドメインメールアドレスでメールを受信するために、RuleSetを作成します。
メニューのRule Sets
より受信ルールを設定します。
Recipientには自身で使用したいメールアドレスを記載します。
受信先は一旦S3にしておきます。
※後述のSMTP認証を行なうための受信先になりますので仮です
あとは画面の手順に従い、RuleSetの登録を完了します。
この時点では先ほどのVerify a New Email Address
で設定したメールアドレスからのみ受信できるようになっています。
SESの制限解除申請
SESのデフォルトでは自身がVerify a New Email Address
より登録したメールアドレスのみ受信ができます。
外部のあらゆるメールアドレスと送受信できるようにするために、AWSサポートから制限の解除を申請します。
以下を参考にするとよいでしょう。
https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/request-production-access.html
私は1日50,000メッセージ、最大送信レートが毎秒14メッセージまで制限が緩和されました。
Gmail設定
さて、先ほどSMTPの設定をしましたが実際にSMTPを通してメールを送信するところまでやってみます。
当記事ではGmailを利用した例で設定します。
Gmailの設定
からアカウントとインポート
を選択し、他のメールアドレスを追加
を押下します。
以下の画面より、先ほどの受信ルール設定で登録したメールアドレスを入力します。
次のステップで、SMTPの情報を入力します。
SMTPサーバーはSESの画面から確認できます。
ユーザー名は先ほど作成したIAMユーザーのアクセスキー、パスワードはシークレットアクセスキーを入力します。
そうするとS3に確認用のメールが届いていますので、拡張子をeml
にして中を確認し、確認用URLへリンクもしくは確認用コードを入力して設定を完了します。
Lambda作成
SESではメールをPOP3やIMAPなどを通して受信する手段はありません。
S3に配置するかLambdaで転送するなどの方法があります。
当記事では以下のライブラリを使用する例を挙げます。
https://github.com/arithmetric/aws-lambda-ses-forwarder
あらかじめLambdaを実行するロールに以下のポリシーを付与しておきます。
S3バケットは先ほどの手順で受信先に設置したバケットで問題はありません。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:*"
},
{
"Effect": "Allow",
"Action": "ses:SendRawEmail",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::S3-BUCKET-NAME/*"
}
]
}
index.js
に各種アドレスの設定を記述します。
以下の例では
{独自ドメインのメールアドレス}
に受信したメールが、Fromをforwarder@{独自ドメイン}
として{Gmail}
に転送される
ということになります。
なお、Reply-Toが適切に設定された状態で転送されるので、返信先がforwarder@{独自ドメイン}
になることはありません。
var LambdaForwarder = require("aws-lambda-ses-forwarder");
exports.handler = function(event, context, callback) {
// See aws-lambda-ses-forwarder/index.js for all options.
var overrides = {
config: {
fromEmail: "forwarder@{独自ドメイン}",
emailBucket: "{バケット名}",
emailKeyPrefix: "",
forwardMapping: {
"{独自ドメインのメールアドレス}": [
"{Gmail}"
]
}
}
};
LambdaForwarder.handler(event, context, callback, overrides);
};
設定が完了したらZIPにしてLambda関数を作成します。
※あらかじめnpm install
でnode_modules
パッケージをインストールしておくことを忘れずに
実行ロールは先ほどのポリシーが適用されていることを確認します。
最後に、SESのRule Sets
を更新します。
受信アクションにLambdaを追加し、最終的に以下のようなルールになっていればOKです。
メール送信
最後にテストしてみましょう。
外部のメール(yahoo)から独自ドメイン宛てに受信したメールに対して、外部のメール(yahoo)宛に返信ができることを確認できると思います。