Node.js - Send an Email

Gửi email là một trong những tính năng mong muốn trong bất kỳ ứng dụng Node.js nào, đặc biệt là ứng dụng Express. Có nhiều mô-đun bên thứ ba hỗ trợ điều này trong kho NPM. Một ứng dụng Node.js có thể được tích hợp với chức năng gửi email thông qua các API email như Mailgun, MailTrap, Mailjet, v.v.

Trong chương này, chúng ta sẽ học cách gửi email với ứng dụng Node.js bằng cách sử dụng mô-đun nodemailer và API MilTrap.

Nodemailer

Nodemailer là một mô-đun cho phép gửi email cho các ứng dụng Node.js. Bạn có thể gửi email với nội dung văn bản thuần túy cũng như nội dung HTML. Nó cũng hỗ trợ thêm tệp đính kèm, truyền tải bảo mật TLS, hỗ trợ SMTP tích hợp, xác thực OAUTH2 cùng nhiều tính năng khác.

Để bắt đầu, hãy cài đặt mô-đun nodemailer.

npm install nodemailer

Để kiểm tra ứng dụng Node.js có hỗ trợ email của chúng ta, chúng ta sẽ sử dụng dịch vụ Mailtrap, cung cấp một máy chủ SMTP giả. Bạn có thể sử dụng URL máy chủ SMTP thực khi ứng dụng chuyển sang giai đoạn sản xuất. Hãy tạo một tài khoản Mailtrap và lấy thông tin xác thực API từ menu thả xuống Integrations trên bảng điều khiển, chọn Nodemailer.

SMTP Server

Lưu đoạn mã trên cùng với các đoạn mã còn lại được cung cấp dưới đây −

const nodemailer = require('nodemailer');
var transport = nodemailer.createTransport({
   host: "sandbox.smtp.mailtrap.io",
   port: 2525,
   auth: {
      user: "f924c******a56",
      pass: "******1b5516a0"
   }
});

message = {
   from: "from-example@email.com",
   to: "to-example@email.com",
   subject: "Subject",
   text: "Hello SMTP Email"
}
transport.sendMail(message, function(err, info) {
   if (err) {
      console.log(err);
   } else {
   console.log(info);
   }
});

Hàm createTransport của Nodemailer chỉ định phương thức bạn muốn sử dụng để gửi email. Nó nhận dữ liệu kết nối và thông tin đăng nhập làm đối số. Trong trường hợp này, vì SMTP là phương thức vận chuyển được ưu tiên, bạn sẽ cần định nghĩa một máy chủ SMTP, cổng và mật khẩu thông tin đăng nhập để truy cập vào máy chủ SMTP.

Hàm createTransport() trả về một đối tượng vận chuyển. Phương thức sendMail() của nó sử dụng thông tin xác thực và chi tiết tin nhắn để gửi tin nhắn đến người nhận mong muốn. Chạy đoạn mã trên như sau −

PS D:\nodejs\emailapp> node main.js
{
   accepted: [ 'to-example@email.com' ],
   rejected: [],
   ehlo: [
      'SIZE 5242880',
      'PIPELINING',
      'ENHANCEDSTATUSCODES',
      '8BITMIME',
      'DSN',
      'AUTH PLAIN LOGIN CRAM-MD5'
   ],
   envelopeTime: 749,
   messageTime: 529,
   messageSize: 291,
   response: '250 2.0.0 Ok: queued',
   envelope: { from: 'from-example@email.com', to: [ 'to-example@email.com' ] },
   messageId: '<1d29decd-7903-f5e4-3578-15b1e88f239a@email.com>'
}

Máy chủ SMTP giả được cung cấp bởi MailTrap cho bạn một hộp thư, nơi bạn có thể xác minh giao dịch email.

Mail Trap

Bạn cũng có thể sử dụng dịch vụ Gmail phổ biến để gửi email qua mã Node.js của bạn. Lưu ý rằng bạn có thể cần phải bật cài đặt ứng dụng kém an toàn của tài khoản Gmail hoặc sử dụng mã thông báo xác thực nếu tài khoản đang sử dụng xác thực OAuth2.

var transport = nodemailer.createTransport({
   service: 'gmail',
   auth: {
      user: 'youremail@gmail.com',
      pass: 'yourpassword'
   }
});

Mailgun

Bạn cũng có thể tích hợp chức năng gửi email vào ứng dụng Node.js của mình bằng cách sử dụng các khóa API của Mailgun. Để thêm chức năng này, hãy cài đặt các mô-đun sau −

npm i mailgun.js form-data

Đăng ký tài khoản Mailgun miễn phí bằng cách truy cập URL signup.mailgun.com và lấy khóa API công khai và riêng tư.

Sau đó, chúng tôi khởi tạo phiên bản khách hàng Mailgun và truyền vào MAILGUN_API_KEY. Sau đó, chúng tôi định nghĩa một hàm sendMail để xử lý việc gửi email sử dụng thư viện mailgun-js.

const formData = require("form-data");
const Mailgun = require("mailgun.js");

const mailgun = new Mailgun(formData);

const mg = mailgun.client({
   username: "api",
   key: process.env.MAILGUN_API_KEY,
});
exports.sendMail = (req, res) => {
   const { toEmail, fromEmail, subject, message } = req.body;

      mg.messages.create(process.env.MAILGUN_DOMAIN, {
      from: fromEmail,
      to: [toEmail],
      subject: subject,
      text: message,
   });
};