LoginSignup
3
2

More than 5 years have passed since last update.

Amazon SESでメールを受信する設定をJavaScriptでやってみた

Posted at

CloudFormationにテンプレートがなかったのでAWS SDKで組んでみた。

前提

  • ドメインはRoute53で管理している
  • 受信用S3バケットは作成済み
  • SESのdefault-rule-setが作成済み

コード

index.js
// Input
var domain = "EXAMPLE.COM";
var s3BucketName = 'S3_BUCKET_NAME';
var mailAddress = "admin@" + domain;
var region = 'us-east-1';

//module
var AWS = require('aws-sdk');
var ses = new AWS.SES({
    apiVersion: '2010-12-01',
    accessKeyId: "ACCESS_KEY_ID",
    secretAccessKey: "SECRET_ACCESS_KEY",
    region: region
});
var route53 = new AWS.Route53({
  apiVersion: '2014-05-15',
  accessKeyId: "ACCESS_KEY_ID",
  secretAccessKey: "SECRET_ACCESS_KEY",
  region: region
});

//Params
var domainVerificationToken = '';

var params = {
  Rule: {
    Name: 'mail.' + domain,
    Actions: [
      {
        S3Action: {
          BucketName: s3BucketName,
          ObjectKeyPrefix: domain
        },
      },
    ],
    Enabled: true,
    Recipients: [
      mailAddress,
    ],
    ScanEnabled: true,
    TlsPolicy: 'Optional'
  },
  RuleSetName: 'default-rule-set'
};

// Promise
ses.createReceiptRule(params).promise()
  .then(
      (data) => {
            var domainParams = {
                Domain: domain
            };
            return ses.verifyDomainIdentity(domainParams).promise();
        }
  ).then(
    (data) => {
        console.log(data);
        if ( ! data.VerificationToken) {
            throw 'undefined Verification Token.';
        }
        domainVerificationToken = '"' + data.VerificationToken + '"';
        var params = {
          DNSName: domain,
          MaxItems: '1'
        };
        return route53.listHostedZonesByName(params).promise();
    }
  ).then(
    (data) => {
        var HostedZoneId = data.HostedZones[0].Id;
        HostedZoneId = HostedZoneId.split('/')[2];
        var params = {
          ChangeBatch: {
            Changes: [
              {
                Action: 'UPSERT',
                ResourceRecordSet: {
                  Name: '_amazonses.' + domain,
                  Type: 'TXT',
                  TTL: '1800',
                  ResourceRecords: [
                      {
                          Value: domainVerificationToken
                      }
                  ]
                }
              },{
                Action: 'UPSERT',
                ResourceRecordSet: {
                    Name: domain,
                    Type: 'MX',
                    TTL: '1800',
                    ResourceRecords: [
                        {
                            Value: "10 inbound-smtp.us-east-1.amazonaws.com"
                        }
                    ]
                }
              }
            ],
          },
          HostedZoneId: HostedZoneId
        };
        return route53.changeResourceRecordSets(params).promise();
    }
  ).then(
      (data) => {
          console.log(data);
      }
  ).catch(
      (err) => {
          console.log(err);
      }
  );

このコードを走らせると、「var mailAddress」で設定したアドレス宛に送信されたメールが、SES経由でS3バケットに保存されます。

使い道(ACMの承認URLをインターセプトするスライド)

他のリージョンで使いたい場合、SESが使えるリージョンが限定されていることや、MXレコードのパラメーターがus-east-1決め打ちになってるところらへん要注意です。

おまけ:SESのルールセット登録をJSでやる

var params = {
  RuleSetName: 'STRING_VALUE' /* required */
};
ses.createReceiptRuleSet(params, function(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);           // successful response
});

「'default-rule-set'」からこれのRuleSetNameに設定した値に書き換えれば上のスクリプトでも動くはずです。(未検証)

3
2
0

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
3
2