본문 바로가기
더이상 하지 않는 Backend - NodeJS/Node-Express 개론(완)

[O'REILLY] Node & Express - 11장 : 이메일 전송

by VictorMeredith 2023. 4. 4.

이메일은 중요한 기능이다. 사용자 등록, 비밀번호 초기화, 이벤트 안내(광고), 사용자 인증 등 여러가지 방면에서 자주 사용된다.

노드/익스프레스에는 이메일 전송 기능이 들어있지 않아, 서드파티 모듈을 사용한다. 여기에서는 노드메일러를 사용한다.

 

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. 메일 전송

- 메일 전송 인스턴스를 만들었으면 이제 메일을 보낼 수 있다.

- 수신자 한명에게 텍스트 메일을 보내는 간단한 예제이다.

당연히 이렇게만 하면 실행 안되고 async 함수로 감싸서 적당히 처리해줘야 되는거 다들 아시죠

- 여러 수신자에게 보낼 경우 to 부분에 쉼표로 구분해서 보내면 된다.

- `"Jane Customer" jane@yahoo.com` 처럼 수신자 이름을 함께 쓰는 이메일 주소를 적어도 된다.

- 여러멍에게 이메일을 보내는 겨우 MSA에서 설정한 제한을 넘지 않도록 한다. ex)이메일 하나에 1000명 이런거 있음

 

8. 대량으로 이메일을 전송할 경우 생각해볼 것

- 수많은 사람에게 이메일을 보낸다면 반드시 수신자가 구독을 해지거나 거부할 수 있는 수단도 마련해야 한다.

- 이는 에마, 메일침프, 캠페인 모니터같은 서비스에 모두 준비되어있다.

 

9. HTML 이메일 전송

- 노드메일러는 같은 이메일에 HTML과 텍스트 두 가지 버전을 모두 전송하므로 이메일 클라이언트가 골라서 표시한다.(대부분 HTML)

 

예시

따옴표 안에 html쓰는거 3년만에 처음인 것 같다.

 

10. HTML 이메일과 이미지

- HTML에 이미지를 직접 넣을 수 있지만, 많이 구리다. 그렇게 하지 말자.

- 대신 이미지를 웹 서버에 저장한 다음 이메일에서 링크해서 사용한다.

- 이메일 이미지에 사용할 정적 자원 폴더를 따로 두는 것이 최선이다.

- img 태그로 보내면 될 듯 하다.

 

11. 뷰를 통한 HTML 이메일 전송

- 그 Vue 가 아니다. 여기서는 handlebars로 구현했으나, 이런거 IT강국 한국에서는 거의 찾아볼 수도 없을 정도이기 때문에, 만약 필요하다면 chatGPT한테 물어보기로 하고 넘어간다.

 

12. 이메일 기능의 캡슐화

- 캡슐화, 모듈화, 구조설계에 진심이고 환장이신 우리 서버개발자 형님들께서는 당연히 이메일 보내는 모듈을 따로 숨겨놓고 간단한 함수 한-두 문장으로 기능을 호출해서 사용하길 원한다.

 

구현 예시

모듈화

이렇게 하면 다음과 같이 사용할 수 있다.

 

사실 이메일 관련된 API와 서비스가 굉장히 많다. 잘 알아본다면, 이런 짓은 다 안해도 되고 더 좋은 솔루션을 찾을 수도 있다.

그래도 참고로 알아두면 할줄 안다고 한마디라도 할 수 있겠다.

댓글