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通りに行き着いた。
- Amazon SES でEメールを送信する
- Amazon SNS でEメールを送信する
先に結論としては、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から必要なモジュールをインポートするため、冒頭に下記を追加する。
import { SESClient, SendEmailCommand } from "@aws-sdk/client-ses";
const ses = new SESClient({ region: "ap-northeast-1" });
次に、自前のEmailNotify関数を追加する。本記事では簡略化のため、メールの件名と本文は同一のものにする。
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関数を呼び出していたところを、下記のように修正する。
+ lineNotify("\n照度変化しました\n" + _il + " → " + il);
- await EmailNotify("照度変化しました: " + _il + " → " + il);
動作確認
部屋の照度を変化させながら動作確認したところ、いろいろと問題が多いことに気づいた。
- Eメールは即受信することもあれば30分以上遅れることもあり、かつ順序性も担保されない
- Gmailを使用している場合「Be careful with this message.」の警告がメール内に表示される
なにはともあれ、即時性がないのは致命的な問題であり、残念ながら通知目的としてSESは使えなそうだ。引き続き、Amazon SNSでメール送信する方針に変えてみる。
Discussion