top of page

[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にする



最後に


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

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


最新記事

すべて表示

Server Crashing with "Cannot set headers after they are sent to the client"

現象 http-serverでローカルにサーバを立てて静的なhtmlファイルの内容を確認したい。 http-server -c-1 でサーバを立ち上げ、URLをブラウザに入力するとタイトルのエラーが表示されてhtmlの内容が表示されない 解決策 原因は良く分からないが、node.jsのバージョンが古いのが原因らしい。 バージョン10で上記現象が発生したが、バージョン16に上げるとエラーは出なくなっ

[Flutter/dart] アプリがbackground状態の時にFirebase Messagingの通知がタップされた場合の対応

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

Comments


あなたの買い物をサポートする
アプリ Shop Plan

iphone6.5p2.png

​いつ何を買うかの計画を立てられるアプリです。

google-play-badge.png
Download_on_the_App_Store_Badge_JP_RGB_blk_100317.png

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

納品:iPhone6.5①.png

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

google-play-badge.png
Download_on_the_App_Store_Badge_JP_RGB_blk_100317.png

「後で読む」を忘れないアプリ ArticleReminder

気になった​Webサイトを登録し、指定時刻にリマインダを送れるアプリです

google-play-badge.png
Download_on_the_App_Store_Badge_JP_RGB_blk_100317.png
bottom of page