에러 모니터링 메일 만들기(node.js, nodemailer, gmail)

뭐하시는 분이세요?·2022년 9월 5일
0

내가 만든 서비스 중에, 유저가 사진을 업데이트 하는 기능을 가진 앱이 있었다.

사진을 업로드하면 GCS에 업로드 되고, URL은 로컬 DB에 업로드가 되는 방식이다.

이때 사진 업로드가 실패하는 경우가 생긴다면 적절한 조치를 취해야 하는데,, 그래서 업로드 결과를 모두 로그에 쌓았다.

하지만 이것으로는 성에 차지 않아… 실제 유저가 업로드 실패했을때 마다 확인할 수 있도록 모니터링 메일을 만들기로 했다.

0. 개발 환경

React / Node.js

1. nodemailer 설치

npm i nodemailer 로 nodemailer 라이브러리를 설치한다.


2. (생략가능)환경변수에 메일 발송시 쓰일 계정 추가

메일을 발송할때 쓸 본인의 계정을 환경변수로 사용하지 않고 하드코딩해서 넣을거면 이 과정은 생략 가능!

  • npm i dotenv 로 dotenv 라이브러리 설치
  • 프로젝트 폴더에 .env 파일 생성하고 계정 정보 넣기
NODEMAILER_USER=test@test.com
NODEMAILER_PASS=test123456

3. transporter 만들기

const moment = require("moment"); 
const nodemailer = require("nodemailer");
const dotenv = require("dotenv");
dotenv.config();

let transporter = nodemailer.createTransport({
  service: "gmail",
  host: "smtp.gmail.com", // gmail server 사용
  port: 587,
  secure: false,
  auth: {
    user: process.env.NODEMAILER_USER, // 2번을 생략했다면 여기 직접 아이디 넣어주기
    pass: process.env.NODEMAILER_PASS, // 2번을 생략했다면 여기 직접 비밀번호 넣어주기
  },
});

4. 에러가 발생하는 경우 메일을 발송해주기

  • to 에 받는 사람이 여러명이라면 , 로 메일주소 여러개 연결
  • 모니터링 메일에 시간을 넣어주면 좋을것 같아 moment 라이브러리를 추가로 설치해서 사용함!
  • html 에 메일 내용을 html형태로 작성해서 넣을 수 있음.
    • request로 넘어온 내용을 활용해서 작성하면 에러 파악하는데 더 도움이 되겠다,,!
// 이미지 스토리지 업로드 API
app.post("/api/uploadImages", async (req, res) => {
  try {
		// 이미지 업로드가 성공하는 경우
  } catch (error) {
		// 이미지 업로드가 실패하는 경우
		// 에러 로깅해주는 부분 생략...
    transporter.sendMail({
      from: process.env.NODEMAILER_USER, // 보내는 사람 주소
      to: "admin1@test.com, admin2@test.com", // 받는 사람 목록
      subject: `ERROR - ${moment().format("YYYY-MM-DD HH:mm:ss")}`,
      html: `
      <h1>❗❗❗❗ 에러 발생 ❗❗❗❗</h1>
      <div style="font-size : 16px">
      <p><span>USER</span> : <strong>${req.body.name}</strong></p>
      <p><span>ID</span> : <strong>${req.body.id}</strong></p>
      <p><span>NAME(TARGET)</span> : <strong>${req.body.target}</strong></p>
      <p><span>에러 내용 : </span><strong>${error.msg}</strong></p>
      </div>
      `,

    });
  }
});
profile
이것저것 개발하지만 프론트엔드 개발이 제일 좋아요 👩🏻‍💻

0개의 댓글