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}`)
})
โค้ดข้างต้นเป็นสิ่งที่จำเป็นสำหรับเริ่มเซิร์ฟเวอร์ง่ายๆ ด้วย Express คุณสามารถทดสอบได้โดยรัน:
node index.js
วิธีติดตั้ง Nodemailer
ติดตั้ง nodemailer ด้วยคำสั่ง:
npm install nodemailer
API ของ Nodemailer ค่อนข้างเรียบง่าย ต้องทำ 3 ขั้นตอน:
- สร้างออบเจ็กต์ Transporter
- สร้างออบเจ็กต์ MailOptions
- ใช้เมธอด 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 ไปที่นี่
ขั้นตอนต่อไปต้องทำการตั้งค่ามากกว่าเขียนโค้ด ดังนั้นขอให้เตรียมพร้อม
การตั้งค่า Google Cloud Platform
หากยังไม่มีบัญชี Google Cloud Platform ให้สร้างก่อน จากนั้นสร้างโปรเจกต์ใหม่โดยคลิกเมนูดรอปดาวน์มุมซ้ายบน
เลือกตัวเลือก New Project:
ในหน้าต่างถัดไป ต้องตั้งชื่อโปรเจกต์ ใช้ชื่ออะไรก็ได้ แต่เราจะใช้ NodemailerProject สำหรับ location ให้เว้นไว้เป็น No organization
อาจใช้เวลาสักครู่ในการตั้งค่าโปรเจกต์ หลังจากนั้นจะเห็นหน้าจอนี้:
เปิดเมนูนำทางโดยคลิกเส้น 3 เส้นมุมซ้ายบน และเลือก APIs and Services:
เพื่อใช้ Nodemailer และ Gmail เราต้องใช้ OAuth2 หากไม่คุ้นเคย OAuth เป็นโปรโตคอลสำหรับการรับรองตัวตน ไม่ได้ลึกลงรายละเอียดที่นี่ เพราะไม่จำเป็น แต่หากต้องการเข้าใจเพิ่มเติม ไปที่นี่
ขั้นแรก ต้องกำหนดค่า OAuth Consent Screen:
หากไม่ใช่สมาชิก G-Suite ตัวเลือกเดียวสำหรับ User Type คือ External
หลังคลิก Create หน้าจอถัดไปต้องกรอกข้อมูลแอปพลิเคชัน (เซิร์ฟเวอร์ของเรา):
กรอกอีเมลในช่อง User support email และ Developer contact information คลิก Save and Continue จะไปถึงขั้น Scopes ข้ามขั้นนี้ไป เพราะไม่เกี่ยวข้อง และไปที่ Test Users
ที่นี่ เพิ่มตัวเองเป็นผู้ใช้ และคลิก Save and continue
วิธีกำหนดค่า OAuth Settings
ในขั้นนี้จะสร้าง OAuth credentials สำหรับใช้กับ Nodemailer ไปที่แท็บ Credentials เหนือ OAuth Consent Screen คลิกเครื่องหมายบวก (➕) ที่มีข้อความ Create Credentials และเลือก OAuth Client ID
ในเมนูดรอปดาวน์ Application type ให้เลือก Web Application:
ในส่วน Authorized Redirect URIs ต้องเพิ่ม OAuth2 Playground (https://developers.google.com/oauthplayground) เนื่องจากจะใช้เพื่อดึงคีย์หนึ่งที่กล่าวไว้ตอนต้น
หลังคลิก Create จะได้ client id และ client secret เก็บไว้ลับ อย่าเปิดเผยในทางใดทางหนึ่ง
ดึง OAuth Refresh Token
เพื่อ取得 refresh token สำหรับ transporter object ใน Nodemailer ต้องไปที่ OAuth2 Playground ซึ่งเราอนุมัติ URI นี้ไว้ก่อนหน้านี้
- คลิกไอ콘เฟืองขวา (OAuth2 Configuration) และติ๊กเพื่อใช้ OAuth2 Credentials ของตัวเอง:
- ดูด้านซ้ายของเว็บไซต์ จะเห็นรายการบริการ เลื่อนลงจนเจอ Gmail API v1
- คลิก Authorize APIs
จะมีหน้าจอให้ล็อกอินเข้า Gmail ใดๆ เลือกบัญชีที่ใส่เป็น Test user
- หน้าจอถัดไปจะบอกว่า Google ยังไม่ได้ตรวจสอบแอปนี้ แต่อย่างไรก็ตามก็โอเค เพราะเรายังไม่ส่งตรวจสอบ คลิก Continue
- หน้าจอถัดไปขออนุญาตให้โปรเจกต์เข้าถึง Gmail ให้อนุญาต
- เสร็จแล้วจะ 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 หากต้องการดู ไปที่นี่