[Node.js/cloud functions] nodemailerでyahooメールアカウントからメール送信


概要


スマホアプリで、ある特定の種類のデータが投稿されたら自分にメールで通知が来るような機能を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にする



最後に


無事データが投稿されたらメール通知できるようになりました。

僕の場合は、アプリに対する意見が投稿された場合に上記を使用していますが、他にもユーザが追加されたら、などの使い方もあると思います。


最新記事

すべて表示

概要 Firebase Messagingでメッセージを送信し、通知がタップされたら何らかの動作を実行する(例:特定のページに移動する)という場合は多いかと思います。 通知タップ時にアプリがforeground状態(つまりアプリを開いている)ならば簡単なのですが、アプリがbackground状態にある場合は少し工夫が必要です。 方法 FirebaseMessaging.onBackgroundMe

現象 FirebaseMessaging.onBackgroundMessage()でタイトルのエラーが発生。 原因と解決策 上記メソッドの引数に渡すデリゲートはトップレベル関数でなければならない。自分の場合はインスタンスメソッドを渡していたのでエラーとなった。 渡すメソッドをトップレベル関数にするとエラーは解消した。 @main.dart void main() async{ //略 F

靴を大切にしよう!靴管理アプリ SHOES_KEEP

納品:iPhone6.5①.png

靴の履いた回数、お手入れ回数を管理するアプリです。

google-play-badge.png
Download_on_the_App_Store_Badge_JP_RGB_blk_100317.png

テーマ日記:テーマを決めてジャンルごとに記録

訂正①2040×1152.jpg

ジャンルごとにテーマ、サブテーマをつけて投稿、記録できる日記アプリです。

google-play-badge.png