-
메일 전송시 Promise.allSettled 사용하기Nest.js 2024. 6. 8. 18:27728x90
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: 실패 했을때 메세지
728x90'Nest.js' 카테고리의 다른 글
prisma 스키마 관련 라이브러리 (0) 2024.06.28 Nestjs ConfigModule 사용시 환경변수 boolean값을 가져올때 string으로 가져오는 문제 (0) 2024.06.24 NestJS에서 repository의 insert메서드로 유동적으로 데이터 생성하기 (2) 2024.06.04 NestJS Response Dto에 generic을 swagger ApiProperty 데코레이터에 사용하기 (1) 2024.06.04 cookie-option secure: true 옵션 사용시 Safari localhost에서 쿠키 저장이 안되는 문제 (0) 2024.05.23