티스토리 뷰
nodemailer와 google gmail api로 node js에서 메일 보내기
무니웜테일패드풋프롱스 2020. 7. 15. 14:18
현재 듣고 있는 노드 js 강의에서 진행중인 authentication 수업에서는 node js에서 email 보내는 것을 SendGrid라는 api를 통해 진행했습니다
하지만 자꾸 SendGrid에서 제 계정을 block 하는 탓에.. 제대로 이메일 발송을 할 수 없었고 그래서 저는 구글에서 제공하는 gmail api로 변경하여 구현하였습니다
일단 이를 위해서는 npm과 최신버전 node js가 설치되어있는 환경이 필요 합니다!
0. 먼저 노드 js에 nodemailer를 설치해주세요.
npm install --save nodemailer
1. 구글 계정 설정 -> 보안 -> 덜 안전한 app 접근 허용을 해줍니다.
2. accounts.google.com/DisplayUnlockCaptcha 에 들어가 continue를 눌러줍니다. 이는 Captcha 프로그램을 일시적으로 unlcok해줍니다. 이걸 하지 않으면 이메일을 발송할 때 error: connect ETIMEDOUT가 떠요
3. 구글 개발자 콘솔에 들어가서 console.developers.google.com/apis 프로젝트를 생성해주세요. 이름은 임의로 지으셔도 됩니다.
4. 그 다음 개발자 콘솔 -> 라이브러리로 가서 Gmail API를 검색해 찾아주시고 활성화 시켜주세요!
5. 클라이언트와 클라이언트 시크릿을 받기 위해서 사용자 인증정보 탭 -> 사용자 인증정보 만들기 -> OAuth 클라이언트 ID를 선택해주세요
6. 아래와 같이 어플리케이션 타입을 웹 어플리케이션으로 정해주시고 승인된 리다이렉션 URI 에는 구글 OAuth의 플레이 그라운드의 주소를 입력해주셔야 합니다. 그러지 않으면 나중에 본인의 개발자 콘솔과 연동이 되지 않습니다. https://developers.google.com/oauthplayground
7. 이렇게 생성하면 클라이언트 ID와 클라이언트 시크릿이 생성됩니다. 그러면 이를 복사해줍니다. ( JSON 파일로도 저장해놓을 수 있습니다.)
8. 이제 인증을 위해서 refresh token과 access token을 발급받아야 합니다.
https://developers.google.com/oauthplayground
위의 주소로 가시면 오른쪽 상단에 보이는 톱니바퀴 모양을 누릅니다. 그리고 Use your own OAuth credentials를 체크하고 앞서 발급받은 클라이언트 ID와 클라이언트 시크릿을 입력해주고 close 합니다.
9. 그리고 왼쪽의 Select & Authorize API 항목을 클릭한 후 gmail api를 찾아주고 Authorize API를 클릭해줍니다.
그러면 본인의 계정의 개발자 콘솔과 연동되어서 진행이 될 것이고, 신뢰할 수 없는 앱이라는 경고창이 뜰 것입니다. 이 때 그냥 무시하고 진행해주세요.
여기서 개발자 콘솔과 연동되지 않는다면 개발자 콘솔로 돌아가서 OAuth 클라이언트 정보를 다시 확인해주세요!
특히나 승인된 리다이렉션 URI에 구글 OAuth 플레이 그라운드의 주소를 넣었는지 잘 확인해주세요! ( 대쉬'/' 하나라도 더 들어가면 mismatch 됩니다)
10. 이제 step 2에 들어와서 Exchange authorization code for tokens 를 눌러주시면 refresh token 과 access token 이 생성됩니다.
11. 이제 노드 js 파일에 아래와 같이 구현을 해주세요
const nodemailer = require('nodemailer');
const sendMail = async (to, subject, html) => {
const googleTransporter = await nodemailer.createTransport({
host: 'smtp.gmail.com',
port: 465,
secure: true,
auth:{
type:'OAuth2',
user: '<본인의 구글 계정 >',
clientId:'<발급받은 client ID>',
clientSecret:'<발급받은 client secret> ',
refreshToken: '<발급받은 refreshtoken>',
accessToken: '<발급받은 accessToken>',
expirse: 3600
}
}),
mailOptions = {
from: '<보내는 사람 이름, <test@test.gmail.com>>',
to,
subject,
html
}
try{
await googleTransporter.sendMail(mailOptions);
googleTransporter.close();
console.log(`mail have sent to ${ to }`);
} catch(err){
console.log(err);
}
}
sendMail('randomuser@gmail.com', 'Welcome to our shop!', '<p>hi!</p>');
그리고 이렇게 보내면 됩니다
메일보낼때 ETIMEDOUT 에러가 계속 뜬다면 아래 포스팅을 참조해보세요! firewall의 문제일 수도 있어서 포트 번호를 바꾸거나 PC를 재부팅하면 해결된다기도 합니다. 저도 이 에러가 계속 떴는데, 저는 captcha 를 제대로 unblock 하지 않은 문제였습니다
'web : back-end > node js' 카테고리의 다른 글
[node js express] Multer를 이용하여 웹에 이미지 업로드 기능 추가 (0) | 2020.07.20 |
---|---|
[ node js express ] 강의 노트 깃 리포지토리에 저장 중입니다 (0) | 2020.07.15 |
[node js] Express: MongoDB 데이터베이스 연동 (0) | 2020.07.05 |
[node js] Express: 데이터베이스 연동 - Sequelize (0) | 2020.06.26 |
[node js] Express: 저장된 파일 내용 삭제하기 (0) | 2020.06.24 |