Firebase 앱에서 SendGrid를 사용한 메일 전송 기능 실현

서비스 개발을 하고 있다고 유저의 액션에 의해 메일을 송신하는 것은 자주 있다고 생각합니다.
이번에는 백엔드에 Firebase를 사용할 때 등록 회원에게 메일을 보내는 방법을 정리했습니다.

※ 이번에는 SendGrid를 이용합니다.
※ Amazon SES나 Mailgun을 이용하는 경우는 메일 송신 부분을 다시 작성해 주십시오.

목차


  • 전체 흐름
  • Firestore에 데이터를 등록할 때 Cloud Functions 실행
  • Cloud Functions에서 메일 서버에 요청 보내기
  • Firestore의 데이터를 기반으로 메일 내용을 작성합니다
  • Firebase Authentication에서 회원 정보 얻기

  • 전체 흐름





    Firestore 등록 이벤트 시 Cloud Functions 실행



    Firestore에 데이터를 등록할 때 Cloud Functions를 시작하려면 다음과 같이 index.js를 배포하여 구현할 수 있습니다.
    import * as functions from 'firebase-functions';
    
    export const sendInquiryMail = functions.firestore
      .document('examples/{id}')
      .onCreate(async (snap, context) => {
        // 処理を記述
      }
    

    firebase의 초기 설정은 생략합니다.
    firebase deploy
    

    Cloud Functions에서 메일 서버에 요청 보내기



    SendGrid를 사용하는 경우 API Key를 사용해야 합니다.
    API Key는 SendGrid의 관리자 화면에서 만들 수 있습니다.

    API Key는 환경별로 전환하고 싶거나 카드 관리하고 싶지 않기 때문에 Firebase의 환경 데이터에 저장합시다.
    firebase functions:config:set sendgrid.apikey="xxxx"
    

    설정한 환경 데이터를 바탕으로 SendGrid의 API를 호출합니다.
    const sgMail = require('@sendgrid/mail');
    sgMail.setApiKey(functions.config().sendgrid.apikey); // 設定した環境データを取得
    
    // メール送信
    const msg = {
      to: '[email protected]',
      from: '[email protected]',
      subject: 'example subject',
      text: 'example body',
    };
    await sgMail.send(msg);
    

    이것으로 메일 송신 처리를 실현할 수 있었습니다.

    Firestore 데이터를 기반으로 메일 내용을 구축



    메일을 보낼 때 관련 데이터를 기반으로 메일 내용을 만들 수 있습니다.

    Firebase의 AdminSDK를 사용하여 등록 데이터 이외의 데이터를 검색할 수 있습니다.
    const admin = require('firebase-admin');
    admin.initializeApp();
    const db = admin.firestore();
    const colRef = db.collection('other');
    const snapshots = await colRef
      .where('id', '==', 'xxxx')
      .limit(1)
      .get();
    const other = snapshots.docs[0].data();
    

    Firebase Authentication에서 회원 정보 얻기


    await admin
      .auth()
      .getUser('xxxx')
    

    결국 다음과 같은 코드로 메일 전송을 실현할 수 있었습니다.
    
    import * as functions from 'firebase-functions';
    
    export const sendInquiryMail = functions.firestore
      .document('examples/{id}')
      .onCreate(async (snap, context) => {
        const admin = require('firebase-admin');
        admin.initializeApp();
        const db = admin.firestore();
    
        const data = snap.data();
    
        const user await admin
          .auth()
          .getUser(data.user_id)
    
        const colRef = db.collection('other');
        const snapshots = await colRef
          .where('id', '==', data.other_id)
          .limit(1)
          .get();
        const other = snapshots.docs[0].data();
        const sgMail = require('@sendgrid/mail');
        sgMail.setApiKey(functions.config().sendgrid.apikey);
        const msg = {
          to: user.email,
          from: '[email protected]',
          subject: 'example subject',
          text: `example body. ${other.body}`,
        };
        await sgMail.send(msg);
      });
    

    좋은 웹페이지 즐겨찾기