내가 만든 서비스 중에, 유저가 사진을 업데이트 하는 기능을 가진 앱이 있었다.
사진을 업로드하면 GCS에 업로드 되고, URL은 로컬 DB에 업로드가 되는 방식이다.
이때 사진 업로드가 실패하는 경우가 생긴다면 적절한 조치를 취해야 하는데,, 그래서 업로드 결과를 모두 로그에 쌓았다.
하지만 이것으로는 성에 차지 않아… 실제 유저가 업로드 실패했을때 마다 확인할 수 있도록 모니터링 메일을 만들기로 했다.
React / Node.js
npm i nodemailer
로 nodemailer 라이브러리를 설치한다.
메일을 발송할때 쓸 본인의 계정을 환경변수로 사용하지 않고 하드코딩해서 넣을거면 이 과정은 생략 가능!
npm i dotenv
로 dotenv 라이브러리 설치NODEMAILER_USER=test@test.com
NODEMAILER_PASS=test123456
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번을 생략했다면 여기 직접 비밀번호 넣어주기
},
});
to
에 받는 사람이 여러명이라면 ,
로 메일주소 여러개 연결html
에 메일 내용을 html형태로 작성해서 넣을 수 있음.// 이미지 스토리지 업로드 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>
`,
});
}
});