Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> ซอฟต์แวร์ >> อีเมล

เชี่ยวชาญ Nodemailer: ส่งอีเมลจาก Node.js Server ด้วย Gmail อย่างน่าเชื่อถือ

Nodemailer เป็นโมดูล Node.js ที่ช่วยให้คุณส่งอีเมลจากเซิร์ฟเวอร์ได้อย่างง่ายดาย ไม่ว่าคุณจะต้องการสื่อสารกับผู้ใช้หรือแจ้งเตือนตัวเองเมื่อมีปัญหาเกิดขึ้น การส่งทางอีเมลเป็นหนึ่งในตัวเลือกที่นิยม

มีบทความมากมายที่อธิบายการใช้ Nodemailer แบบพื้นฐาน แต่นี่ไม่ใช่บทความแบบนั้น ในที่นี้จะแสดงวิธีการที่พบบ่อยที่สุดในการส่งอีเมลจากแบ็กเอนด์ Node.js โดยใช้ Nodemailer ร่วมกับ Gmail

เริ่มต้นใช้งาน Nodemailer อย่างไร

ขั้นแรก ต้องตั้งค่าโครงสร้าง Node.js ด้วย Express ตรวจสอบว่าติดตั้ง Node และ npm แล้วโดยรันคำสั่ง:

node -v npm -v

ถ้าทั้งคู่แสดงเวอร์ชัน แสดงว่าพร้อมแล้ว มิฉะนั้นให้ติดตั้งสิ่งที่ขาดหายไป

สร้างโฟลเดอร์โปรเจกต์ เราจะใช้ nodemailerProject

mkdir nodemailerProject

เข้าไปในโฟลเดอร์ที่สร้างใหม่และรัน

npm init

จะสร้างไฟล์ package.json ให้โปรเจกต์

ต่อมา ติดตั้ง Express ด้วย:

npm install express

ขึ้นอยู่กับไฟล์ที่กำหนดเป็นจุดเริ่มต้น (ค่าเริ่มต้นคือ index.js) ให้เปิดไฟล์นั้นและวางโค้ดต่อไปนี้:

const express = require('express')
const app = express()
const port = 3000
app.listen(port, () => {
  console.log(`nodemailerProject is listening at https://localhost:${port}`)
})
index.js

โค้ดข้างต้นเป็นสิ่งที่จำเป็นสำหรับเริ่มเซิร์ฟเวอร์ง่ายๆ ด้วย Express คุณสามารถทดสอบได้โดยรัน:

node index.js

วิธีติดตั้ง Nodemailer

ติดตั้ง nodemailer ด้วยคำสั่ง:

npm install nodemailer

API ของ Nodemailer ค่อนข้างเรียบง่าย ต้องทำ 3 ขั้นตอน:

  1. สร้างออบเจ็กต์ Transporter
  2. สร้างออบเจ็กต์ MailOptions
  3. ใช้เมธอด Transporter.sendMail

ในการสร้าง transporter object:

let transporter = nodemailer.createTransport({
  service: 'gmail',
  auth: {
    type: 'OAuth2',
    user: process.env.MAIL_USERNAME,
    pass: process.env.MAIL_PASSWORD,
    clientId: process.env.OAUTH_CLIENTID,
    clientSecret: process.env.OAUTH_CLIENT_SECRET,
    refreshToken: process.env.OAUTH_REFRESH_TOKEN
  }
});
✋ โปรดทราบ นอกจาก user และ pass ที่เป็นข้อมูลเข้าสู่ระบบ Gmail ของคุณแล้ว อีก 3 คีย์ต้องดึงมาหลังจากตั้งค่า OAuth แล้ว

ตามที่กล่าวไว้ เราจะใช้ Gmail สำหรับการส่งอีเมล Gmail มีระดับความสูงมากสำหรับอีเมลที่ส่งโดย/ไปยังบัญชีผู้ใช้

มีหลายวิธีแก้ปัญหานี้ (บางวิธีดีกว่ากัน) เราจะเลือกวิธีที่ต้องตั้งค่าโปรเจกต์ใน Google Cloud Platform เพื่อให้ได้ข้อมูลประจำตัวสำหรับ OAuth ที่ Gmail เปิดใช้

หากต้องการอ่านเพิ่มเติมเกี่ยวกับความซับซ้อนของการใช้ Gmail กับ nodemailer ไปที่นี่

ขั้นตอนต่อไปต้องทำการตั้งค่ามากกว่าเขียนโค้ด ดังนั้นขอให้เตรียมพร้อม

เชี่ยวชาญ Nodemailer: ส่งอีเมลจาก Node.js Server ด้วย Gmail อย่างน่าเชื่อถือ
Photo by Daniel McCullough / Unsplash

การตั้งค่า Google Cloud Platform

หากยังไม่มีบัญชี Google Cloud Platform ให้สร้างก่อน จากนั้นสร้างโปรเจกต์ใหม่โดยคลิกเมนูดรอปดาวน์มุมซ้ายบน

เชี่ยวชาญ Nodemailer: ส่งอีเมลจาก Node.js Server ด้วย Gmail อย่างน่าเชื่อถือ

เลือกตัวเลือก New Project:

เชี่ยวชาญ Nodemailer: ส่งอีเมลจาก Node.js Server ด้วย Gmail อย่างน่าเชื่อถือ

ในหน้าต่างถัดไป ต้องตั้งชื่อโปรเจกต์ ใช้ชื่ออะไรก็ได้ แต่เราจะใช้ NodemailerProject สำหรับ location ให้เว้นไว้เป็น No organization

เชี่ยวชาญ Nodemailer: ส่งอีเมลจาก Node.js Server ด้วย Gmail อย่างน่าเชื่อถือ

อาจใช้เวลาสักครู่ในการตั้งค่าโปรเจกต์ หลังจากนั้นจะเห็นหน้าจอนี้:

เชี่ยวชาญ Nodemailer: ส่งอีเมลจาก Node.js Server ด้วย Gmail อย่างน่าเชื่อถือ

เปิดเมนูนำทางโดยคลิกเส้น 3 เส้นมุมซ้ายบน และเลือก APIs and Services:

เชี่ยวชาญ Nodemailer: ส่งอีเมลจาก Node.js Server ด้วย Gmail อย่างน่าเชื่อถือ

เพื่อใช้ Nodemailer และ Gmail เราต้องใช้ OAuth2 หากไม่คุ้นเคย OAuth เป็นโปรโตคอลสำหรับการรับรองตัวตน ไม่ได้ลึกลงรายละเอียดที่นี่ เพราะไม่จำเป็น แต่หากต้องการเข้าใจเพิ่มเติม ไปที่นี่

ขั้นแรก ต้องกำหนดค่า OAuth Consent Screen:

เชี่ยวชาญ Nodemailer: ส่งอีเมลจาก Node.js Server ด้วย Gmail อย่างน่าเชื่อถือ

หากไม่ใช่สมาชิก G-Suite ตัวเลือกเดียวสำหรับ User Type คือ External

เชี่ยวชาญ Nodemailer: ส่งอีเมลจาก Node.js Server ด้วย Gmail อย่างน่าเชื่อถือ

หลังคลิก Create หน้าจอถัดไปต้องกรอกข้อมูลแอปพลิเคชัน (เซิร์ฟเวอร์ของเรา):

เชี่ยวชาญ Nodemailer: ส่งอีเมลจาก Node.js Server ด้วย Gmail อย่างน่าเชื่อถือ

กรอกอีเมลในช่อง User support email และ Developer contact information คลิก Save and Continue จะไปถึงขั้น Scopes ข้ามขั้นนี้ไป เพราะไม่เกี่ยวข้อง และไปที่ Test Users

เชี่ยวชาญ Nodemailer: ส่งอีเมลจาก Node.js Server ด้วย Gmail อย่างน่าเชื่อถือ

ที่นี่ เพิ่มตัวเองเป็นผู้ใช้ และคลิก Save and continue

วิธีกำหนดค่า OAuth Settings

ในขั้นนี้จะสร้าง OAuth credentials สำหรับใช้กับ Nodemailer ไปที่แท็บ Credentials เหนือ OAuth Consent Screen คลิกเครื่องหมายบวก (➕) ที่มีข้อความ Create Credentials และเลือก OAuth Client ID

เชี่ยวชาญ Nodemailer: ส่งอีเมลจาก Node.js Server ด้วย Gmail อย่างน่าเชื่อถือ

ในเมนูดรอปดาวน์ Application type ให้เลือก Web Application:

เชี่ยวชาญ Nodemailer: ส่งอีเมลจาก Node.js Server ด้วย Gmail อย่างน่าเชื่อถือ

ในส่วน Authorized Redirect URIs ต้องเพิ่ม OAuth2 Playground (https://developers.google.com/oauthplayground) เนื่องจากจะใช้เพื่อดึงคีย์หนึ่งที่กล่าวไว้ตอนต้น

เชี่ยวชาญ Nodemailer: ส่งอีเมลจาก Node.js Server ด้วย Gmail อย่างน่าเชื่อถือ

หลังคลิก Create จะได้ client id และ client secret เก็บไว้ลับ อย่าเปิดเผยในทางใดทางหนึ่ง

เชี่ยวชาญ Nodemailer: ส่งอีเมลจาก Node.js Server ด้วย Gmail อย่างน่าเชื่อถือ
Photo by Power Lai / Unsplash

ดึง OAuth Refresh Token

เพื่อ取得 refresh token สำหรับ transporter object ใน Nodemailer ต้องไปที่ OAuth2 Playground ซึ่งเราอนุมัติ URI นี้ไว้ก่อนหน้านี้

  1. คลิกไอ콘เฟืองขวา (OAuth2 Configuration) และติ๊กเพื่อใช้ OAuth2 Credentials ของตัวเอง:
เชี่ยวชาญ Nodemailer: ส่งอีเมลจาก Node.js Server ด้วย Gmail อย่างน่าเชื่อถือ
  1. ดูด้านซ้ายของเว็บไซต์ จะเห็นรายการบริการ เลื่อนลงจนเจอ Gmail API v1
เชี่ยวชาญ Nodemailer: ส่งอีเมลจาก Node.js Server ด้วย Gmail อย่างน่าเชื่อถือ
  1. คลิก Authorize APIs

จะมีหน้าจอให้ล็อกอินเข้า Gmail ใดๆ เลือกบัญชีที่ใส่เป็น Test user

  1. หน้าจอถัดไปจะบอกว่า Google ยังไม่ได้ตรวจสอบแอปนี้ แต่อย่างไรก็ตามก็โอเค เพราะเรายังไม่ส่งตรวจสอบ คลิก Continue
เชี่ยวชาญ Nodemailer: ส่งอีเมลจาก Node.js Server ด้วย Gmail อย่างน่าเชื่อถือ
  1. หน้าจอถัดไปขออนุญาตให้โปรเจกต์เข้าถึง Gmail ให้อนุญาต
เชี่ยวชาญ Nodemailer: ส่งอีเมลจาก Node.js Server ด้วย Gmail อย่างน่าเชื่อถือ
  1. เสร็จแล้วจะ redirect กลับ OAuth Playground จะเห็น authorization code ในเมนูซ้าย คลิกปุ่มสีน้ำเงิน Exchange authorization code for tokens

ฟิลด์ refresh token และ access token จะถูกกรอกข้อมูลแล้ว

กลับไปที่เซิร์ฟเวอร์

หลังตั้งค่าทั้งหมดแล้ว เราสามารถนำข้อมูลไปใส่ใน transporter creation เพื่อเก็บข้อมูลลับ ให้ใช้แพ็กเกจ dotenv อย่าลืมเพิ่มไฟล์ .env ที่จะสร้างเข้า .gitignore ด้วย

ตอนนี้เรามีโค้ดดังนี้:

let transporter = nodemailer.createTransport({
  service: 'gmail',
  auth: {
    type: 'OAuth2',
    user: process.env.MAIL_USERNAME,
    pass: process.env.MAIL_PASSWORD,
    clientId: process.env.OAUTH_CLIENTID,
    clientSecret: process.env.OAUTH_CLIENT_SECRET,
    refreshToken: process.env.OAUTH_REFRESH_TOKEN
  }
});

ต่อไป สร้างออบเจ็กต์ mailOptions ที่เก็บรายละเอียดว่าส่งไปที่ไหนและข้อมูลอะไร

let mailOptions = {
  from: tomerpacific@gmail.com,
  to: tomerpacific@gmail.com,
  subject: 'Nodemailer Project',
  text: 'Hi from your nodemailer project'
};

ออบเจ็กต์นี้สามารถมีฟิลด์เพิ่มเติมและผู้รับหลายคนได้ แต่ไม่ได้กล่าวถึงที่นี่

สุดท้าย ใช้เมธอด sendMail:

transporter.sendMail(mailOptions, function(err, data) {
  if (err) {
    console.log("Error " + err);
  } else {
    console.log("Email sent successfully");
  }
});

รันแอปพลิเคชัน และคุณจะเห็นอีเมลใหม่ในกล่องจดหมาย

บทความนี้ได้แรงบันดาลใจจากโปรเจกต์ที่ผมสร้างซึ่งใช้ Nodemailer หากต้องการดู ไปที่นี่