brunch

You can make anything
by writing

C.S.Lewis

by 세컨드스페이스 Jul 04. 2019

Firestore + Functions 메일 보내기

Firebase 만세

구글 Firebase의 Firestore의 트리거를 이용해서 특정 값이 변경되었을때 메일을 발송하는 방법에 대해서 알아보겠습니다. 

nodemailer를 이용하여 smtp 메일 발송을 할 수 있습니다. 

지메일의 경우 보안이슈로 인해서 링크(https://myaccount.google.com/lesssecureapps )에서 '보안수준이 낮은 앱의 엑세스'를 허용해주어야 합니다.  

functions를 이용하기 위해 firebase 에 로그인을 하고 초기화를 해줍니다.



firebase login 

firebase init  



functions/package.json 파일의 dependencies 에 nodemailer를 추가합니다. 


"dependencies": {
  "firebase-admin": "~6.0.0",
  "firebase-functions": "^2.1.0",
  "nodemailer": "^6.2.1"
},


이곳에 nodemailer를 추가하여야 firebase functions 에서 해당 모듈을 사용할 수 있습니다. 

functions를 배포할때 해당 모듈이 설치되게 됩니다. 

firestore onCreate 트리거를 통해 메일을 발송합니다.



const nodemailer = require('nodemailer');


exports.sendMail = functions.firestore.document('문서경로').onCreate((snap, context) => {


    const config = {

        mailer: {

            service: 'gmail',

            host: 'localhost',

            port: '465',

            user: '계정',

            password: '비밀번호',

        },

    };


    const transporter = nodemailer.createTransport({

        service: config.mailer.service,

        auth: {

            user: config.mailer.user,

            pass: config.mailer.password,

        },

    });


    const mailOptions = {

        from : '보내는사람',

        to : '받는사람',

        subject : '제목',

        text : '내용', //or html

    };


    try {

        console.log('mail send');


        transporter.sendMail(mailOptions, (err, res) => {

            if (err) {

                console.log('실패 :  => ', err);

            } else {

                console.log('성공 : => ', res);

            }


            transporter.close();

        });


    } catch (error) {

        console.error('메일 발송 에러 :', error);

    }


})



메일의 경우 자주 발송되기 때문에 아래와 같이 오브젝트로 만들어놓고 사용하면 편합니다. 


const nodemailer = require('nodemailer');


const config = {

    mailer: {

        service: 'gmail',

        host: 'localhost',

        port: '465',

        user: '계정',

        password: '패스워드',

    },

};


module.exports = {

    sendMail: (from, to, subject, text) => {


        const transporter = nodemailer.createTransport({

            service: config.mailer.service,

            auth: {

                user: config.mailer.user,

                pass: config.mailer.password,

            },

        });


        const mailOptions = {

            from,

            to,

            subject,

            text,

        };


        try {

            transporter.sendMail(mailOptions, (err, res) => {

                if (err) {

                    console.log('실패  :  => ', err);

                } else {

                    console.log('성공 :  => ', res);

                }

                transporter.close();

            });

            console.log('mail send');


        } catch(error) {

            console.error('메일 발송 실패 :', error);

        }

        return null;


    }

}



트리거에서는 아래와 같이 사용하면 됩니다. 


exports.sendMail = functions.firestore.document('문서경로').onCreate((snap, context) => {

   let mail = require('./lib/mail');

   mail.sendMail('보내는 이','받는 이','제목','본문')    

});









오픈 슬랙 채널에서 소통해요!

잡담 / 개발 문화 / 일하는 방식 / 정보 공유 / 채용 문의 / 프로젝트 문의 등 어떠한 소통도 환영합니다 :) 


오픈 슬랙 채널에 참여하기⬇️

https://join.slack.com/t/secondspace-open/shared_invite/zt-19q85dgid-6TCjbezQs4TTafBwT4BxAQ




written by. 세컨드스페이스

https://secondspace.kr


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari