[Node.js/cloud functions] nodemailerでyahooメールアカウントからメール送信
- M.R
- 2022年1月13日
- 読了時間: 2分
概要
スマホアプリで、ある特定の種類のデータが投稿されたら自分にメールで通知が来るような機能をfirebaseのcloud functionsを用いて実装しました。途中いくつか躓いた点がありましたので書き残しておこうと思います。
詳細
全体像
cloud functionsでメール送信をする関数を作成します。関数の実行されるトリガはfirestoreの"\data"コレクションにドキュメントが作成された時。メールの送信元はyahoo Japanのメールアカウント、メール送信先はgmailアカウントです。

実装
以下のように実装しました。
const functions=require("firebase-functions");
const admin=require("firebase-admin");
admin.initializeApp(functions.config().firebase);
const nodemailer=require('nodemailer');
const smtpTransport=require("nodemailer-smtp-transport");
const email=functions.config().mailfrom.address;
const password=functions.config().mailfrom.password;
let transporter=nodemailer.createTransport(smtpTransport({
host: 'smtp.mail.yahoo.co.jp',
port: 465,
secure: true,
auth: {
user: email,
pass: password
}
}));
exports.sendOpinion=functions.firestore.document('data/{id}')
.onCreate((snapshot,context)=>{
const to=functions.config().mailto.address;
const data=snapshot.data();
const title=data.title;
const detail=data.detail;
const msg="タイトル: "+title+"\n詳細: "+detail;
const mailOptions={
from: email,
to: to,
subject: 'データが投稿されました',
text: msg
};
return transporter.sendMail(mailOptions, (erro,info)=>{
if(erro){
return res.send(erro.toString());
}
return res.send('Sended');
});
});
firestoreの\data以下は
data
|- title
|- detail
となっています。
また、送信元、送信先のメールアドレス、パスワードはfirebaseの環境変数に設定しています。(コードに直書きしないように)
エラーと対応
Too many bad auth attempts.
→ nodemailer-smtp-transportを使っていなかった
554 Cannot send message due to possible spam
→ 本文(text)がなかった
Greeting never received
→ secure: trueにする
最後に
無事データが投稿されたらメール通知できるようになりました。
僕の場合は、アプリに対する意見が投稿された場合に上記を使用していますが、他にもユーザが追加されたら、などの使い方もあると思います。
最新記事
すべて表示現象 http-serverでローカルにサーバを立てて静的なhtmlファイルの内容を確認したい。 http-server -c-1 でサーバを立ち上げ、URLをブラウザに入力するとタイトルのエラーが表示されてhtmlの内容が表示されない 解決策...
概要 Firebase Messagingでメッセージを送信し、通知がタップされたら何らかの動作を実行する(例:特定のページに移動する)という場合は多いかと思います。 通知タップ時にアプリがforeground状態(つまりアプリを開いている)ならば簡単なのですが、アプリがb...
Comments