이메일은 중요한 기능이다. 사용자 등록, 비밀번호 초기화, 이벤트 안내(광고), 사용자 인증 등 여러가지 방면에서 자주 사용된다.
노드/익스프레스에는 이메일 전송 기능이 들어있지 않아, 서드파티 모듈을 사용한다. 여기에서는 노드메일러를 사용한다.
1. SMTP, MSA, MTA
- SMTP(Simple Mail Transfer Protocol) :
이메일 전송의 기본은 SMTP이다. 좋은 방법이 아니다. '신뢰할 수 있는' 송신자가 아니라면 이메일이 스팸함으로 가버릴거다.
- MSA(Mail Submission Agent) :
MSA는 신뢰할 수 있는 채널을 통해 이메일을 전송하는 메일 발송 에이전트이다. 이메일 도착확인 뿐 아니라 일시적인 중단이나 반송같은 문제도 처리할 수 있다.
- MTA(Mail Transfer Agent) :
이메일을 최종 목적지에 실제로 전송하는 서비스.
- 일단은 MSA에 접근할 수 있어야 한다. Gmail이나 아웃룩 같은 무료 이메일 서비스로 시작할 수도 있지만, 자동화 이메일은 지원 안한다. 자동화는 센드그리드나 메일건 같은 서비스도 있다. 센드그리드에서는 API키를 만들어야 한다.
2. 이메일 수신
- 일부 앱에서는 이메일을 받는 기능이 필요할 수도 있다.
- 수신은 굉장히 복잡하다.
- imap-simple같은 IMAP 에이전트로 서비스에 주기적 접근을 통해 구현해야 한다.
- 여기서는 다루지 않는다.
3. 이메일 헤더
- 이메일 메시지는 HTTP 요청처럼 헤더와 바디로 구성된다.
- 헤더에는 누가 누구에게 보냈는지, 언제, 주제가 무엇인지 등의 정보가 있다.
- 전송되면서 거친 서버와 MTA도 헤더에 들어있다.
- 헤더 안의 발신자 정보는 임의로 기재할 수 있다. 이걸 '스푸핑'이라고 한다.
- 이메일에는 발신자정보가 반드시 있어야 한다.
4. 이메일 형식
- 노드메일러가 이메일 형식은 알아서 해준다. 원래 졸라게 복잡하다.
- 이메일을 평문이나 HTML로 작성할 수 있다.
- 노드메이러는 HTML에서 평문 버전 이메일을 자동으로 생성하는 기능을 지원한다.
5. HTML 이메일
- HTML 이메일은 슈퍼 복잡해서 책 한권을 통채로 할애해야 하는 주제이다.
- HTML의 이메일 호환성은 최악이다. 따라서 몇가지 도움을 받아야한다.
- HTML 이메일 보일러플레이트를 사용하는 것은 시간을 절약해주는 도구이다.
- 리트머스같은 이메일 테스트서비스를 사용해서 호환성을 검증할 수 있다.
- 제목, 볼드체/이탤릭체, 수평선, 이미지링크 정도만 사용한다면 웬만해서는 안깨진다.
6. 노드메일러
- 설치 : npm i nodemailer
이전에 사용했던 자격증명을 사용한다.
- SMTP 에서 주로 사용하는 설정 옵션은 포트, 인증 타입, TLS 옵션이다.
- 주요 메일 서비스는 대부분 기본 옵션을 사용한다. 메일서비스의 문서를 찾아보면 설정을 어떻게 해야하는지 알 수 있다.
- 모르면 chatGPT한테 개떡같이 물어봐도 찰떡같이 알려준다.
7. 메일 전송
- 메일 전송 인스턴스를 만들었으면 이제 메일을 보낼 수 있다.
- 수신자 한명에게 텍스트 메일을 보내는 간단한 예제이다.
- 여러 수신자에게 보낼 경우 to 부분에 쉼표로 구분해서 보내면 된다.
- `"Jane Customer" jane@yahoo.com` 처럼 수신자 이름을 함께 쓰는 이메일 주소를 적어도 된다.
- 여러멍에게 이메일을 보내는 겨우 MSA에서 설정한 제한을 넘지 않도록 한다. ex)이메일 하나에 1000명 이런거 있음
8. 대량으로 이메일을 전송할 경우 생각해볼 것
- 수많은 사람에게 이메일을 보낸다면 반드시 수신자가 구독을 해지거나 거부할 수 있는 수단도 마련해야 한다.
- 이는 에마, 메일침프, 캠페인 모니터같은 서비스에 모두 준비되어있다.
9. HTML 이메일 전송
- 노드메일러는 같은 이메일에 HTML과 텍스트 두 가지 버전을 모두 전송하므로 이메일 클라이언트가 골라서 표시한다.(대부분 HTML)
예시
10. HTML 이메일과 이미지
- HTML에 이미지를 직접 넣을 수 있지만, 많이 구리다. 그렇게 하지 말자.
- 대신 이미지를 웹 서버에 저장한 다음 이메일에서 링크해서 사용한다.
- 이메일 이미지에 사용할 정적 자원 폴더를 따로 두는 것이 최선이다.
- img 태그로 보내면 될 듯 하다.
11. 뷰를 통한 HTML 이메일 전송
- 그 Vue 가 아니다. 여기서는 handlebars로 구현했으나, 이런거 IT강국 한국에서는 거의 찾아볼 수도 없을 정도이기 때문에, 만약 필요하다면 chatGPT한테 물어보기로 하고 넘어간다.
12. 이메일 기능의 캡슐화
- 캡슐화, 모듈화, 구조설계에 진심이고 환장이신 우리 서버개발자 형님들께서는 당연히 이메일 보내는 모듈을 따로 숨겨놓고 간단한 함수 한-두 문장으로 기능을 호출해서 사용하길 원한다.
구현 예시
이렇게 하면 다음과 같이 사용할 수 있다.
사실 이메일 관련된 API와 서비스가 굉장히 많다. 잘 알아본다면, 이런 짓은 다 안해도 되고 더 좋은 솔루션을 찾을 수도 있다.
그래도 참고로 알아두면 할줄 안다고 한마디라도 할 수 있겠다.
'더이상 하지 않는 Backend - NodeJS > Node-Express 개론(완)' 카테고리의 다른 글
[O'REILLY] Node & Express - 12장 : 실무 환경 - 2 (0) | 2023.04.08 |
---|---|
[O'REILLY] Node & Express - 12장 : 실무 환경 (0) | 2023.04.05 |
[O'REILLY] Node & Express - 10장 : 미들웨어 (0) | 2023.04.03 |
[O'REILLY] Node & Express - 9장 : 쿠키와 세션 (0) | 2023.04.03 |
Node-Express 서버에서 CSRF 공격을 방어하는 방법 (0) | 2023.03.31 |
댓글