Cách gửi mail trong NodeJS có file đính kèm
NodeJS là một trong những backend framework phổ biến nhất hiện nay. Với ưu điểm tốc độ nhanh, kho thư viện đồ sộ và đặc biệt là cộng đồng hỗ trợ rất đông đảo.
Trong hầu hết các dự án, tính năng thông báo tới người dùng, cụ thể là gửi email là một trong những tính năng quan trọng, và hầu như bắt buộc phải có. Bài viết hôm nay, mình sẽ hướng dẫn cách gửi email (có hỗ trợ đính kèm file) trong dự án NodeJS.
Khi đọc đến bài viết này, mình tin chắc rằng bạn đã biết NodeJS là gì và nguyên lý hoạt động cũng như ưu điểm nổi bật của nó. Thế nên mình sẽ không đi vào định nghĩa nhiều nữa nhé.
Giới thiệu NodeMailer
Trong rất nhiều thư viện về mail, mình đã lựa chọn Nodemailer, là một thư viện gửi mail phổ biến nhất cho NodeJS.
Bài viết này được đăng tại [free tuts .net]
Một số ưu điểm chính của nodemailer:
- Viết hoàn toàn pure Javascript, không sử dụng thêm bất kỳ dependencies nào khác
- Hỗ trợ SSL/TLS để bảo mật khi gửi email.
- Hỗ trợ email transport thông qua các dịch vụ nổi tiếng như Amazon SES, Sendgrid,v.v...
- Dễ dàng thêm file đính kèm trong mail. Đây là điểm khác biết so với các thư viện khác.
Phần tiếp theo, chúng ta sẽ cùng nhau thực hành gửi email có file đính kèm bằng nodemailer nhé.
Cài đặt Nodemailer
Cũng giống như các thư viện khác, chúng ta tiến hành cài đặt bằng câu lệnh đơn giản sau:
npm i nodemailer
Sau khi cài thành công, package,json sẽ tự động lưu thông tin của thư viện, kiểu như sau:
{ "name": "express_website", "version": "1.0.0", "private": true, "scripts": { "start": "node ./bin/www" }, "dependencies": { "body-parser": "~1.15.1", "cookie-parser": "~1.4.3", "debug": "~2.2.0", "express": "~4.13.4", "nodemailer":"*" } }
Khởi tạo transport
Như mình đã đề cập ở trên, nodemailer có hỗ trợ transport để sử dụng các dịch vụ bên thứ 3 để gửi mail như: Amazon SES, Sendgrid, Mailgun, SMTP,v.v.... Điều này rất là tiện, bởi vì bạn sẽ không cần phải dựng lại một mail server vô cùng phức tạp.
Trong ví dụ này, chúng ta sẽ sử dụng SMTP transport:
import nodemailer from "nodemailer"; const smtpTransport = nodemailer.createTransport({ host: "smtp.example.com", port: 587, secure: false, auth: { user: "username", pass: "password", }, });
Cấu hình và khởi tạo email
Chúng ta có thể tạo một body của email gồm các thông tin như: địa chỉ email nhận, địa chỉ email gửi, tiêu đề, nội dung email.v.v...
const mailBody = { from: "username@gmail.com", to: "receiver@gmail.com", subject: "Sample email sent using nodemailer", html: "<h1>Hello World!</h1>" };
Để thêm file đính kèm, cũng rất đơn giản! Nodemailer hỗ trợ rất nhiều kiểu đính kèm file như: base64, file path, stream,v.v... Bạn có thể tham khảo tài liệu chính thức của thư viện để có danh sách đầy đủ các loại đính kèm được hỗ trợ.
Trong bài viết này, mình sẽ sử dụng file path. Vì vậy, mình sẽ sửa lại body của mail một chút.
const mailBody = { from: "username@gmail.com", to: "receiver@gmail.com", subject: "Sample email sent using nodemailer", html: "<h1>Hello World!</h1>" attachments: [ { filename: 'sample_attachment.png', path: __dirname + '/sample_attachment.png', } ] };
Gửi email
Sau khi đã chuẩn bị xong hết cấu hình, nội dung email thì gọi hàm sendMail() để gửi email thôi.
smtpTransport.sendMail(mailBody, function (error, info) { if (error) { console.log(error); } console.log("Email with attachment delivered successfully") });
Dưới đây là toàn bộ nội dung code:
import nodemailer from "nodemailer"; const smtpTransport = nodemailer.createTransport({ host: "smtp.example.com", port: 587, secure: false, auth: { user: "username", pass: "password", }, }); const mailBody = { from: "username@gmail.com", to: "receiver@gmail.com", subject: "Sample email sent using nodemailer", html: "<h1>Hello World!</h1>" attachments: [ { filename: 'sample_attachment.png', path: __dirname + '/sample_attachment.png', } ] }; smtpTransport.sendMail(mailBody, function (error, info) { if (error) { console.log(error); } console.log("Email with attachment delivered successfully") });
Đã xong! Rất đơn giản phải không?
Qua bài viết này, mình hi vọng bạn tự học lập trình sẽ hiểu và có thể thực hành cách gửi mail có file đính kèm trong các dự án NodeJS.