振り返ること、2011年にAmazon Simple Email Service (SES)をリリースしました。これはメール受信者への到達性にフォーカスしたサービスです。現在、Amazonやお客様によって、年間数十億のやり取りがなされ、マーケティングメールに使われています。
本日、多くの要望がよせられていたSESの新機能をリリースします。SESをドメイン全体あるいは、そのドメインの個別のメールアドレスのメール受信に使うことができるようになりました。これによって、スケーラブルかつ高度に自動化されたメール送受信および処理システムを作ることができます。
洗練されたルールセットおよびIPアドレスフィルタをつかって、個々のメッセージの行き先をコントロールできます。ルールに適合したメールにヘッダを付加したり、S3バケットに格納したり、SNSトピックに誘導したり、Lambdaファンクションに渡したり、バウンスさせたりできます。
メール受信および処理
この機能を使うためには、使いたいドメインをあなたが保持しているかを確認しなければなりません。SESをメール送信に使っているのであれば、すでに準備はできています。
あなたにやってくるメールをSESに処理させるためには、メールを振り向けなければなりません。そのためには2つの方法があります。1つは、ドメインのMXレコードをリージョン別に用意されたSESのSMTPエンドポイントにふりむけることです。もうひとつは、すでに持っているメールシステムをSESのSMTPエンドポイントに転送することです。
次にやることは、そのメッセージに対して行いたいことの指定です。このために、受信ルールを作ります。ルールはルールセットとしてグループ化され、複数のドメインに適用することができます。他の多くのAWSサービスと同じく、ルールおよびルールセットはリージョン毎に個別に指定する必要があります。アクティブなルールセットはそれぞれのリージョンで一つだけです。そのルールがなければ、全てのメールは受信拒否(reject)されます。
ルールには次のような属性があります。
- Enabled - このルールが有効か無効かのフラグ
- Recipients - 適応するメールアドレスもしくは、ドメイン、およびその両方のリスト。この属性が与えられていない場合、ルールはドメイン全てのアドレスに適応されます。
- Scan - スパムおよびウィルススキャンを行うかどうかのフラグ(デフォルトはtrueです)
- TLS - ルールにマッチしたメールをTLSで暗号して渡すかどうかのフラグ
- Action List - ルールにマッチしたメッセージにどのような処理をするかの、順番付きリスト。
SESがメッセージを受信すると、そのメッセージに続く処理を許可するかどうかのチェックをします。何が行われるかというと、
- ソースIPアドレスは、SESが内部でメンテナンスしているリストと照合してrejectする(このリスト自体は、上書きすることができます)
- ソースIPアドレスは、ユーザが作ったIPアドレスリストと照合してrejectする
- メッセージは、ルール内のメールアドレスもしくはドメインと照合してacceptする
メッセージがルールに適合しなければ、課金は発生しません。いったんメッセージがacceptされれば、SESはルールしたがってアクションを起こします。アクションとしては、
- Add: メッセージにヘッダを付与します
- Store: S3バケットにメッセージを保存します。オプションで、AWS Key Management Service (KMS)内の鍵をつかった暗号化ができます。メッセージ全体(ヘッダおよび本文)は30MB以下でなければいけません。
- Publish: メッセージをSNSのトピックに送ります。メッセージ全体は150KB以下でなければいけません。
- Invoke: Lambdaファンクションを実行します。同期および非同期(デフォルト)で実行されます。
- Return: 送信者にメッセージをバウンスします。
- Stop: ルールのアクションを中止します。
アクションは、ルールの記述順に処理されます。Lambdaのアクションはspamおよびvirusスキャンの結果にアクセスします。Lambdaファンクションをメッセージ本文に適用するのであれば、先にメッセージをS3にStoreしなければなりません。
クイックデモ
受信メールをLambdaファンクション(MyFunction)に渡し、SNSトピック(MyTopic)に送り、さらにメッセージをKMSの鍵(aws/ses)で暗号化してS3(MyBucket)に保存するルールをつくることにします。
自分のルールを一覧もできます
SpamやVirusチェックの結果失敗した場合にその後の処理をとめるようなLambdaファンクションの例です。このファンクションを意図したように動作させるには、同期で実行します。
exports.handler = function(event, context) {
console.log('Spam filter');
var sesNotification = event.Records[0].ses;
console.log("SES Notification:\n", JSON.stringify(sesNotification, null, 2));
// Check if any spam check failed
if (sesNotification.receipt.spfVerdict.status === 'FAIL'
|| sesNotification.receipt.dkimVerdict.status === 'FAIL'
|| sesNotification.receipt.spamVerdict.status === 'FAIL'
|| sesNotification.receipt.virusVerdict.status === 'FAIL')
{
console.log('Dropping spam');
// Stop processing rule set, dropping message
context.succeed({'disposition':'STOP_RULE_SET'});
}
else
{
context.succeed();
}
};
更に詳しい情報は、 Amazon SES Developer GuideのReceiving Email を御覧ください。
価格と利用
受信費用は1000通毎に0.10ドルです。メッセージは256KBまたは、256KBのチャンクとして、1000チャンク毎に0.09ドルが課金されます。たとえば768KBのメッセージは3チャンクとして数えます。また、S3やSNAあるいはLambdaに使ったリソースにも課金されます。詳細は、Amazon SES Pricingをご覧ください。
この新機能は今日から、US East(北バージニア)、US West(オレゴン)、ヨーロッパ(アイルランド)リージョンで使えます。
-- Jeff;
(本記事は https://aws.amazon.com/blogs/aws/new-receive-and-process-incoming-email-with-amazon-ses/ の翻訳です。翻訳は、荒木が担当しました)