2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

AWS SESとnodemailerを使い、VPC内からSMTPメールを送信する。

Last updated at Posted at 2021-02-18

やりたかったこと

AWS SDKを使ったメール送信システムはVPCエンドポイントに対応していなかったので、Node.jsのnodemailerを使い、VPC内からSMTPメールを送信したかった。

大まかな手順

1.VPCエンドポイントを作成する
2.Amazon SES SMTP認証情報を取得する
3.nodemailerを使い、メール送信部分を構築する

1.VPCエンドポイントを作成する

こちらに関しては、AWSの公式を読んだ方がわかりやすいと思います。
https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/send-email-set-up-vpc-endpoints.html

作成するエンドポイントのサービス名は「com.amazonaws.us-west-2.email-smtp」スクリーンショット 2021-02-18 18.14.57 2.png
エンドポイント作成時に表示されるこの箇所で検索すると、一発で出てきます。
リージョンの部分は、各々が利用されるリージョンで置き換えてください。

VPCエンドポイントが作成できたら、次は認証情報を取得します。

2.Amazon SES SMTP認証情報を取得する

ここも、AWSの公式を見てもらえばすぐにできます。

後ほどnodemailerの記述の中でUserNameとPasswordを読み込みますが、その際はこの認証情報を取得した際の「アクセスキー」と「パスワード」を使用します。キーはダウンロードしておくのがおすすめです。

3.nodemailerを使い、メール送信部分の構築

上記2つの準備ができたら、nodemailerを使った構築に移ります。

まずは実際に実装したコードを載せさせていただきます。

nodemailer.ts
import { createTransport } from 'nodemailer';

// smtpの設定定義
const smtpEndpoint = process.env.IS_OFFLINE ? "email-smtp.us-west-2.amazonaws.com" : process.env.SMTP_ENDPOINT;
const port = 587;
const smtpUsername = process.env.SES_USER;
const smtpPassword = process.env.SES_PASSWORD;

// メール送信の根幹部分
export async function SendMail() {

  // SMTPサーバの設定
  const smtp = createTransport({
    host: smtpEndpoint,
    port: port,
    secure: false,
    auth: {
      user: smtpUsername,
      pass: smtpPassword
    }
  });

  const message = {
    from: "example@example.co.jp",  // 送信元名
    to: "example@example.co.jp",    // 送信先
    subject: "送信テスト",            // 件名
    text: "送信テストです",            // 通常のメール本文
  };

  let info = await smtp.sendMail(message)
  console.log("Message sent! Messsage ID: ", info.messageId)
} 

メール送信部分はこれだけで実装できます。
nodemailer.ts一部抜粋

// smtpの設定定義
const smtpEndpoint = process.env.IS_OFFLINE ? "email-smtp.us-west-2.amazonaws.com" : process.env.SMTP_ENDPOINT;
const port = 587;
const smtpUsername = process.env.SES_USER;
const smtpPassword = process.env.SES_PASSWORD;

この部分だけ少し説明をすると、

smtpEndpointについては、ローカル環境で実行する場合、エンドポイント「email-smtp.us-west-2.amazonaws.com」でメール送信できたのですが、本番環境で実行するとメール送信が動きませんでした。そのため、本番環境では、環境変数に設定したエンドポイント「vpce-xxxxxxxxxxxx.email-smtp.us-west-2.vpce.amazonaws.com」を指定するとメール送信がうまくできました。

おそらく、前者のエンドポイントだけではVPCを介したエンドポイントに繋がっていなかったと考えられます。
※この部分について謝りがあればご指摘ください🙇‍♂️


次に今回の例では、STARTTLS接続でSMTPエンドポイントに接続しているため、ポート番号は「587」で設定しています。

※SMTPエンドポイント接続についてはコチラ
https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/smtp-connect.html


最後に、「smtpUsername」と「smtpPassword」についてですが、ここは先ほどSMTP認証した際に取得したアクセスキーとパスワードが当てはまりますので、環境変数に設定して読み込んでください。


以上の設定が終われば、AWS SESとnodemailerを使い、VPCを介したメール送信ができるはずです。
※肝心な箇所が抜けていたら、ご指摘いただけると幸いです🙇‍♂️

最後に

僕が実装していた時はエンドポイントの接続で詰まってしまい時間を要しましたが、半日あれば十分実装できると思います。
メール送信部分に関しては、各々で作成されているAPIを走らせるメソッドに組み込んじゃってください。

なお、昨年の夏頃?には東京リージョンにもSESが来たみたいですので、そちらもまた設定していこうと考えています。


追伸 AWSの公式をしっかり読めば、大抵のことは実装できるんだなと実感しました。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?