박주니 개발 정리

nodemailer 적용 방법 본문

node

nodemailer 적용 방법

박주니 2023. 8. 15. 19:42
728x90
반응형

1. nodemailer 공식문서에 코드를 기본 form으로 진행합니다. 

https://nodemailer.com/about/

 

Nodemailer :: Nodemailer

Nodemailer Nodemailer is a module for Node.js applications to allow easy as cake email sending. The project got started back in 2010 when there was no sane option to send email messages, today it is the solution most Node.js users turn to by default. npm i

nodemailer.com

"use strict";
const nodemailer = require("nodemailer");

const transporter = nodemailer.createTransport({
  host: "smtp.forwardemail.net",
  port: 465,
  secure: true,
  auth: {
    // TODO: replace `user` and `pass` values from <https://forwardemail.net>
    user: 'REPLACE-WITH-YOUR-ALIAS@YOURDOMAIN.COM',
    pass: 'REPLACE-WITH-YOUR-GENERATED-PASSWORD'
  }
});

// async..await is not allowed in global scope, must use a wrapper
async function main() {
  // send mail with defined transport object
  const info = await transporter.sendMail({
    from: '"Fred Foo 👻" <foo@example.com>', // sender address
    to: "bar@example.com, baz@example.com", // list of receivers
    subject: "Hello ✔", // Subject line
    text: "Hello world?", // plain text body
    html: "<b>Hello world?</b>", // html body
  });

  console.log("Message sent: %s", info.messageId);
  // Message sent: <b658f8ca-6296-ccf4-8306-87d57a0b4321@example.com>

  //
  // NOTE: You can go to https://forwardemail.net/my-account/emails to see your email delivery status and preview
  //       Or you can use the "preview-email" npm package to preview emails locally in browsers and iOS Simulator
  //       <https://github.com/forwardemail/preview-email>
  //
}

main().catch(console.error);

2. form을 사용하기 전에 port 3000번 실행시 실행될 수 있게 node 환경을 만듭니다.

추가설명) 

  1. npm i http dotenv 를 설치하고 기본적으로 서버 실행시 돌아갈 수 있게 셋팅합니다. 실행할때는 node server.js(사용자가 설정한 페이지 js)로 진행하시면 됩니다. 
const http = require('http');
const dotenv = require('dotenv');
const nodemailer = require('nodemailer');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Hello, Node.js Web Server!\n');
});

server.listen(port, hostname, () => {
    console.log(`Server running at http://${hostname}:${port}/`);
});

3. .env 파일을 추가한 후 user에는 사용할 gmail주소 pass는 연결한 주소에 비밀번호를 넣으시면 됩니다.

// .env 설정
user = '본인 gmail 주소'
pass =  '비밀번호'

추가 설명) 

연결할 때 gmail은 2차 인증이 되어 있지 않고 보안 수준이 낮은 앱이 활성화 되어있어야합니다. 

https://support.bespinglobal.com/ko/support/solutions/articles/73000558131--admin-%EB%B3%B4%EC%95%88-%EC%88%98%EC%A4%80%EC%9D%B4-%EB%82%AE%EC%9D%80-%EC%95%B1%EC%9D%98-%EC%95%A1%EC%84%B8%EC%8A%A4-%ED%97%88%EC%9A%A9%ED%95%98%EA%B8%B0#:~:text=1.%20%EA%B4%80%EB%A6%AC%EC%9E%90%20%EA%B3%84%EC%A0%95%EC%9C%BC%EB%A1%9C%20%EA%B4%80%EB%A6%AC,%EC%9C%BC%EB%A1%9C%20%EB%B3%80%EA%B2%BD%20%ED%9B%84%20%EC%A0%80%EC%9E%A5%20%ED%95%A9%EB%8B%88%EB%8B%A4.

 

[Admin] 보안 수준이 낮은 앱의 액세스 허용하기

사용자가 최신 보안 표준(OAuth)을 지원하지 않는 '보안 수준이 낮은 앱'을 이용할 시, 관리자는 아래와 같이 '보안 수준이 낮은 앱'에 대해 액세스를 허용해줘야 됩니다.    최신 보안 표준을 지

support.bespinglobal.com

만약에 2차 인증을 비활성화 되어있는데도 보안 수준이 낮은 앱이 보이지 않은 이유는 구글 내부적으로 업데이트되어서 안보이는 것이 아니라 어떤 부분이 연결되어있어서 보안 수준이 낮은 앱이 보이지 않은 것입니다. 

저도 제 계정으로는 2차 인증을 여러번 비활성화하고 보안 수준이 낮은 앱이 보이기 위해 다른 방법을 시도해봤지만 안되서 구글이 업데이트 된 줄 알았는데 회사에 연결된 gmail로 확인해보니 보안 수준이 낮은 앱이 보였습니다. 

계속 보안 수준이 낮은 앱이 보이지 않는다면 gmail 계정 하나를 다시 만드는 것을 추천합니다. 

  • 코드 적용)
const dotenv = require('dotenv');
dotenv.config();

const { user, pass } = process.env;

추가 설명) 

dotenv.config()를 한다음 지금처럼 process.env로 가지고 오면 해당 .env에 설정한 user 및 pass 정보를 가지고 올 수 있습니다.

4. 기본 form에서 필요한 부분만 수정 후 서버를 실행합니다. 

const http = require('http');
const dotenv = require('dotenv');
const nodemailer = require('nodemailer');
dotenv.config();

const { user, pass } = process.env;
const hostname = '127.0.0.1';
const port = 3000;
const transporter = nodemailer.createTransport({
    service: 'gmail',
    auth: {
      // TODO: replace `user` and `pass` values from <https://forwardemail.net>
      user: user,
      pass: pass
    }
  });
  
  // async..await is not allowed in global scope, must use a wrapper
  async function main() {
    // send mail with defined transport object
    const info = await transporter.sendMail({
      from: user, // sender address
      to: "보낼 이메일 주소", // list of receivers
      subject: "Hello ✔", // Subject line
      text: "Hello world?", // plain text body
      html: "<b>Hello world?</b>", // html body
    });
  
    console.log("Message sent: %s", info.messageId);

  }
  
  main().catch(console.error);

const server = http.createServer((req, res) => {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Hello, Node.js Web Server!\n');
});

server.listen(port, hostname, () => {
    console.log(`Server running at http://${hostname}:${port}/`);
});

변경된 부분)

host, port, secure을 제거하고 service만 추가해서 gmail로 진행할 것이기 때문에 'gmail'로 설정합니다. 

 

결과

추가 설명)

subject : 메일 제목

html: 메일 내용 

확인하실 수 있습니다. 응용을 하실 때 이부분을 수정하시면 의도에 맞게 보내실 수 있습니다. 

728x90
반응형
Comments