이전 nodemailer로 메일 보내는 서버를 개발하여 운용하고 있었다.
그런데 몇몇 메일 플랫폼에서 메일 수신이 되지 않는 현상을 발견했다. (대표적으로 Gmail)
확인해본 결과 Gmail 측에서 Oauth2.0 방식이 적용되지 않은 메일은 차단한다고한다.
간헐적으로 메일을 수신하긴 하지만 대부분 메일을 차단하여 수신 자체를 못하였다.
그렇기에 Oauth2.0과 nodemailer 를 연동하는 방법에 대해 정리하고자한다.
1. Gmail API 활성화
1. https://console.cloud.google.com/ 에서 로그인 후 Gmail API를 검색한다.
Google 클라우드 플랫폼
로그인 Google 클라우드 플랫폼으로 이동
accounts.google.com
2. Gmail API를 활성화 한다.
2. 앱 비밀번호 생성
1. https://myaccount.google.com/ 으로 접속해 로그인 후 '보안' ➝ '앱 비밀번호' 이동
Google 계정
Google은 사용자마다 원하는 개인정보 보호 설정이 다르다는 사실을 인지하고 있습니다. 그래서 Google 계정에서는 사용이 간편한 컨트롤과 개인정보 보호 진단 같은 도구를 제공합니다. 이런 도구
www.google.com
2. 앱 정보 입력
- 앱 선택 : 메일
- 기기 선택 : 기타(맞춤이름)
- 이름 : nodemailer (하고싶은 명칭)
3. 앱 비밀번호 생성
- 생성된 앱 비밀번호를 잊어버리지 않게 보관한다.
(생성 후 나타나는 창 이외에 비밀번호를 확인할 방법이 없으니 비밀번호 관리를 잘하자!)
3. OAuth client ID 생성
1. https://console.cloud.google.com/apis 으로 접속하여 OAuth 클라이언트 ID 생성 메뉴로 진입
Google 클라우드 플랫폼
로그인 Google 클라우드 플랫폼으로 이동
accounts.google.com
2. 정보 입력
- 애플리케이션 유형 : 웹 애플리케이션
- 승인된 리디렉션 URI ➝ 'URI' 추가 버튼 클릭 (중요!)
- 구글 oauthplayground URL 입력 (URI 맨 뒤에 공백 있으면 안됨)
- '만들기' 버튼 클릭
https://developers.google.com/oauthplayground
3. OAuth 클라이언트 ID 생성
- 생성된 클라이언트 ID를 보관한다.
(OAuth 클라이언트 ID 및 보안 비밀번호는 언제든 다시 확인할 수 있다.)
4. Token 발급
- OAuth 2.0 access token과 refresh token을 발급받는다.
1. https://developers.google.com/oauthplayground 로 이동한다.
OAuth 2.0 Playground
Request Body Manual entry Enter the data that will be added to the body of the request: File You may choose to send a file as part of the request. When both a file and manual content are provided both will be sent using a multipart request. You may send fi
developers.google.com
2. OAuth 2.0 configuration 설정
- 우측 상단 톱니바퀴 모양의 버튼 클릭
- 'Use your own OAuth credentials' 를 체크한다.
- OAuth Client ID : 생성한 OAuth 클라이언트 ID 입력
- OAuth Client Secret : 생성한 OAuth 클라이언트 보안 비밀번호 입력
3. Token 값 요청
- 좌측 Step 1. Select & authorize APIs 입력란에 아래 URI를 입력 후 'Authorize APIs' 버튼을 클릭한다.
https://mail.google.com/
- OAuth 클라이언트 ID를 발급받은 구글 계정 로그인
- 나는 등록된 계정이 여러개라 계정 선택 란이 여러개 뜬다. 이 중 발급한 계정을 선택한다.
(등록된 계정이 하나일 경우 선택 란이 하나만 나타난다.)
- 로그인 후 'Google에서 확인하지 않은 앱' 경고 창이 나타날 경우 '고급' 을 클릭한다.
- '[프로젝트](으)로 이동(안전하지 않음)'을 클릭한다.
- Gmail 엑세스 접근 허용을 위해 '계속' 버튼 클릭
- 엑세스 허용 후 리디렉션 된 사이트에서 처음에 302 Found Error가 나타난다.
- 'Exchange authorization code for tokens' 버튼 클릭
- 발급 받은 access_token과 refresh_token를 보관한다.
5. nodemailer 적용
- 생성한 OAuth 클라이언트 ID, APP 비밀번호, refresh token 을 입력한다.
- env를 활용해 생성한 값들을 활용하는 게 보안적으로 좋다.
const transporter = nodemailer.createTransport({
service: 'gmail',
host: 'smtp.google.com',
port: 587,
secure: true,
auth: {
type: 'OAuth2',
user: [Gmail 아이디],
pass: [생성한 APP 비밀번호],
clientId: [생성한 OAuth 클라이언트 ID],
clientSecret: [생성한 OAuth 클라이언트 비밀번호],
refreshToken: [생성한 refresh token],
},
});
const message = {
from: [Gmail 아이디(보내는 사람)],
to: [받는 사람 E-mail],
subject: [메일 제목],
text: [메일 내용],
};
transporter.sendMail(message);