
기록을 하다보면 기록하는 사람이 계속 보고 있는 것이 아니기 때문에
정확히 누가 어시, 골을 기록했는지 몰라서 잘못 기록하거나 누락되는 경우가 있다.
경기 시간 내에는 삭제/수정이 가능하도록 했지만 경기 시간이 지나면 기록하는 창을 닫아버리기 때문에
기록에 오류가 있을 시 운영진에게 요청하도록 하는 폼을 만들었다.
그 요청을 보고 나를 비롯한 운영진이 관리자 페이지에서 기록을 수정하거나 추가하게 된다.

이렇다 보니 기록 요청란을 수시로 들어가서 확인해야 하는 불편함이 있다.
기록 요청이 발생하면 트리거를 발동시켜 이메일을 보내보도록 했다.
서버리스 프로젝트기에 nodemailer 를 사용하려면 노드 서버를 구축해야 했다.
그러던 중, firebase에서 email trigger를 지원하는 사실을 발견했다. (야호)

바로 요놈인데, 리액트 메소드로 firestore의 정해놓은 컬렉션에 데이터를 넣으면 trigger를 발생시켜 이메일을 보내주는 놈이다.
우선 이놈은 extension 기능이라 firebase 프로젝트에 추가 설치를 해야하는데,
설치하려 하면 firebase의 요금제를 blaze등급으로 올려주어야 한다.

월 0.01 달러의 요금이 청구된다고 한다. 겁나 싸잖아! 노드서버 직접 만들어서 배포하는 것보다 싸고 편한데 왜 안해?
물론 firestore와 마찬가지로 무료 사용량이 정해져 있고 추가 사용량에 대해서는 요금이 청구되지만 내 프로젝트 케이스에서는 절대 초과할 일이 없기에 설치해주었다.
설치를 쭉쭉 하다보면 확장 프로그램 구성이라는 매개변수 설정 하는 부분이 있는데, 이 부분에서 애를 좀 먹었다.

Cloud Functions location 은 서울. 오케이..
SMTP connection URI 이게 모야?
알아보니 메일 송수신 해주는 서비스 URI라고 한다. 대표적으로 우리회사의 경쟁업체 트윌리오의 SendGrid가 있고, 구글의 Gmail 이 있다.
굳이 트윌리오 계정 만들어서 하느니 당연히 Gmail 써야지
URI 형식은
smtps://'지메일계정'@smtp.gmail.com:465
이렇게 써주면 된다.
SMTP password는 선택사항이라길래 패스했는데 이게 나중에 대참사가 되었다.
Email documents collection 은 트리거로 사용될 컬렉션명을 적어주면 되었고,
Default FROM address, 말 그대로 보내는 메일 주소 default 값을 적어주고 앱을 구성했다.
자 이제 트리거를 땡겨보자! 바로 되겠지? 하고
리액트 메소드로 mail 컬렉션에 데이터를 삽입했는데,
const docRef = await addDoc(collection(db, 'mail'), {
        to: ['vivala0519@gmail.com'],
        message: {
          subject: '기록 추가/수정 요청이 있습니다~!',
          html: `<h2>요청 내용 : ${requestText}</h2>,
        }
      });
데이터를 요런식으로 넣어주면,

firestore에 이렇게 데이터가 들어가고,
곧바로 delivery라는 필드가 생긴다.
메일의 전송 상태를 나타내주는 필드다!
크 저게 떴으면 당연히 메일도 보내졌겠지 하고 봤는데 메일은 커녕 state가 'FAILED'로 떠있었다. error 메세지를 보니,
Error: Missing credentials for "PLAIN"
이게 떠있었는데 이게 뭐람
찾아보니 Gmail에서 생성한 앱 비밀번호를 아까 선택사항이라던 SMTP password 에 설정했어야 했다.

여기 들어가서 (2차 보안 인증 안되어있으면 저 메뉴가 보이지도 않는다)
앱 이름을 설정하면 확인을 누르면 비밀번호가 생성된다. 
이건 다시 확인할 수 없으므로 바로 SMTP password에 복붙 후 따로 또 저장해놨다.
앱을 다시 구성하고 트리거를 당겨보니,

크으 성공! 메일도 너무 잘 오네!