📧

Line Notifyの代替としてAmazon SESでEメール送信(失敗)

に公開

はじめに

「Nature Remo+AWS+LINE Notifyで緩やかな自宅監視」(1)(2)(3)の3つの記事にて、スマホに通知するために使用していたLine Notifyが、2025年3月31日をもってサービス提供終了となった。代替方法としてLINEから提供されているMessaging APIがあるようだが、ちょっと調べた限りはLINE Business ID(LINE公式アカウント)が必要らしく、早々に断念した。

そこで、そもそもAWSで実装している機能なので、AWSの仕組みで何らかの通知ができないかを考えたところ、下記2通りに行き着いた。

先に結論としては、SESはメールの遅延が激しすぎてまったく使い物になかった一方で、SNSは即時性があって通知機能として実用可能であった。本記事では失敗談として、Nature Remoで照度変化した際にLambda関数からSESにてEメールを送信する機能を実装する。

ただし、スマホがEメールを受信時に即時通知するかどうかはメールクライアントや設定に依存するため、例えばiPhoneのGmailアプリで通知設定をしておく必要がある。

SES設定

ここからはAWSコンソールにサインインして作業する。
まず初めに、SESでメール送信可能な宛先アドレスとして自分自身のEメールアドレスを登録するため、「Amazon SES > 設定: ID > IDの作成」にて下記のとおり設定する。

  • IDタイプ: Eメールアドレス
  • Eメールアドレス: 自分自身で所有しているEメールアドレス

しばらくするとEメールアドレスに対して、「Amazon Web Services – Email Address Verification Request in...」というタイトルのメールが来るので、メール内の確認用URLをクリックする。

ポリシーとロールの設定

次に、Lambda関数からSESでメール送信を許可するためのポリシーを作成する。
「IAM > ポリシー > ポリシーの作成」と進んで、下記のようなポリシーを作成する。

  • ポリシー名: SendEmailPolicy
  • アクセス許可: ポリシーエディタ(JSON)で下記のように入力
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ses:SendEmail"
            ],
            "Resource": "*"
        }
    ]
}

引き続き、メール送信をしたいLambda関数に対して、上記のポリシーをアタッチする。NatureRemo_Save関数の「設定 > アクセス権限 > ロール名 NatureRemo_Save-role-...」をクリックすると「IAM > ロール > NatureRemo_Save-role-...」のロール設定画面となるので、「許可ポリシー > 許可を追加」から「SendEmailPolicy」を追加する。

Lambda関数

NatureRemo_Save関数にAWS SDKを利用してSESでメールを送信するための処理を追加する。まず、AWS SDKから必要なモジュールをインポートするため、冒頭に下記を追加する。

index.mjs
import { SESClient, SendEmailCommand } from "@aws-sdk/client-ses";
const  ses = new SESClient({ region: "ap-northeast-1" });

次に、自前のEmailNotify関数を追加する。本記事では簡略化のため、メールの件名と本文は同一のものにする。

index.mjs
async function EmailNotify(aMsg) {
  const cmd = new SendEmailCommand({
    Source: "自分自身のEメールアドレス",
    Destination: { ToAddresses: ["自分自身のEメールアドレス"] },
    Message: {
      Subject: { Data: aMsg },
      Body: { Text: { Data: aMsg } }
    },
  });
  await ses.send(cmd);
}

最後に、過去の記事ではLineNotify関数を呼び出していたところを、下記のように修正する。

index.mjs
+      lineNotify("\n照度変化しました\n" + _il + " → " + il);
-      await EmailNotify("照度変化しました: " + _il + " → " + il);

動作確認

部屋の照度を変化させながら動作確認したところ、いろいろと問題が多いことに気づいた。

  • Eメールは即受信することもあれば30分以上遅れることもあり、かつ順序性も担保されない
  • Gmailを使用している場合「Be careful with this message.」の警告がメール内に表示される

なにはともあれ、即時性がないのは致命的な問題であり、残念ながら通知目的としてSESは使えなそうだ。引き続き、Amazon SNSでメール送信する方針に変えてみる。

Discussion