Back/Node.js

[NodeJs, Typescript] nodemailer 이메일 보내기

한동안 블로그 글을 못썼다..

원랜 진짜 작업했던 내용들만 올렸었는데,

최근엔 작업이 아니라

 

새로온 프론트, 백엔드 분들의 과제를 만들어주고, 온보딩을 도와주고

문서화를하는 일들이 전부였기 때문이다.

 

새로온 후임자들이랑은 친해져서, 아직까지 친하게 지내고 있다.

 

여튼 얼마전에 만든 메일 보내기를 기록한다.

 

nodemailer.ts

import nodemailer from 'nodemailer';
import MailCodeInterface from '../interface/mailCode.interface';
import 'dotenv/config';

const send = async (data: MailCodeInterface) => {
  const transporter = nodemailer.createTransport({
    service: 'gmail',
    auth: {
      user: process.env.MAIL_ID,
      pass: process.env.MAIL_PW,
    },
  });

  transporter.sendMail({
    from: process.env.MAIL_ID,
    to: data.userEmail,
    subject: 'Message good',
    text: `여기 >> ${data.certificateCode} << 코드가 있어요`,
  });
  return true;
};

const nodemail = {
  send,
};

export = nodemail;

 

아마존 SES를 사용할 수 있지만, 인증받는데 시간이 꽤 걸렸다ㅠㅠ
그래서 gmail을 이용해서 했다.
지금 다시보니
createTransport는 transport를 만드는 것이고, send는 보내는 것이니까 역할을 분리하는게 좋아보인다.

gmail은 인증이 이제 변경되어서 새로운 비밀번호를 받아야만 보낼 수 있는데,
구글 계정설정,
앱보안,
비밀번호 누르고 생성
여기서 생성된 비밀번호를 CreateTransport의 비밀번호로 쓰면 되겠다.

 

user.email.controller.ts

const sendEmailCertificationCode: RequestHandler = async (req, res) => {
  try {
    const data: MailCodeInterface = res.locals.diaryRequest;
    const result: boolean = await service.sendEmailCertificationCode(data);
    return res.status(200).json(response.success({ result }));
  } catch (err) {
    return res.status(400).json(response.error.catchError());
  }
};



user.email.service.ts

const sendEmailCertificationCode = async (data: MailCodeInterface) => {
  const certificateCodeFromMySqlForDuplicatePrevention = await database.mailCode.select<MailCodeInterface>({
    userEmail: data.userEmail,
  });

  if (certificateCodeFromMySqlForDuplicatePrevention.length) {
    await database.mailCode.delete<MailCodeInterface>({
      userEmail: data.userEmail,
    });
  }

  const certificateCode = await libCryptos.makeCertificateCode();
  await database.mailCode.insertOne<MailCodeInterface>({ userEmail: data.userEmail, certificateCode });
  await libNodemail.send({
    userEmail: data.userEmail,
    certificateCode,
  });
  return true;
};

 

먼저 인증코드가 중복된지 검사를 하고, 중복됐으면, 삭제를해주고,
다시 인증코드를 뽑아온다.
인증코드는 crypto를 이용해 뽑았다.
그리고 db에 넣어준 후, 아까 만든 libNodemail을 가져와 메일을 보낸다.

다보냈으면 true

 

아아 ㅇㅁ낭ㅁ낭민ㅇ
빨리 플러터하고싶다. 플러터는 언제 시작하지ㅠㅠ