Promise.allSettled를 활용해서 여러개의 메일을 전송할때 Promise.allSettled는 Pormise 객체가 성공 했을때 "fulfilled" 실패 했을때 "rejected" 와 상관없이 전부 다 실행이 되고 성공 한값과 실패한 값을 전부 받을 수 있다.
그래서 "nodemailer"를 사용 했을때 모두 전송이 완료 되었을때 "fulfilled" 상태값일때 "value"값을 받고 "rejected" 상태값일때 "reason"값을 가지고 mail-log를 만들면 좋을것 같았다. 그러나 nodemailer는 rejected가 되는 상황이 생각보다 많이 없었다. 무슨 말이냐면 예를들어 수신자의 메일 주소가 존재하지 않는 메일주소인 경우에도 fulfilled로 결과를 반환 받는다. 즉, 메일이 전송이 일딴 되면 거의 모든 결과는 다 fulfilled 되는것 같다.
reject를 반환 받는 케이스는 메일서버가 문제가 있거나, 메일주소가 아니라 아예 다른형식으로 "메일이 전송 되지 않을때" 이다.
아무튼 그룹 초대 메일 보내기 기능을 구현 할 때 모든 Promise가 성공 해야 되는건 아니기 때문에 Promise.allSetteld를 사용하는것이 좋아 보였다.
// nodeMailer 전송 유저 비밀번호가 틀렸을때
{
status: 'rejected',
reason: Error: Invalid login: 535-5.7.8 Username and Password not accepted.
블라블라
{
code: 'EAUTH',
response: '블라블라',
responseCode: 535,
command: 'AUTH PLAIN'
}
}
// 이메일 주소 형식이 아닐때
{
status: 'rejected',
reason: Error: No recipients defined
블라블라 {
code: 'EENVELOPE',
command: 'API'
}
}
자세히 보면 status가 "rejected" 상태일때 reason이 Error 객체 인것을 알 수 있다.
그래서 실패 했을때 rejected라면 Error의 Instance를 체크 하고 error-message를 로그 테이블에 저장 하면 될것 같다.
메일 로그 테이블 필드
- toEmail: 전송 대상 이메일 주소
- subject, text, html 등 메일 전송 로그 테이블에 필요한 전송시 보냈던 메일 옵션들
- sendStatus: 전송 성공 여부 상태
- reasonMessage: 실패 했을때 메세지