12/08/2018, 13:57

Gửi mail với NodeMailer trong NodeJS

Nói về NodeJs thì hiện tại mình là một newbie thoai, vì nodejs khá ra rộng nên để tránh bị tẩu hỏa nhập MA mình thường đưa ra những chức năng mà mình hay làm trong PHP để làm bằng NodeJS (hihi). Chính vì thế chủ đề tìm hiểu mà mình và các bạn tìm hiểu hôm nay đó chính là: Làm cách nào để gửi ...

nodemailer.jpg

Nói về NodeJs thì hiện tại mình là một newbie thoai, vì nodejs khá ra rộng nên để tránh bị tẩu hỏa nhập MA mình thường đưa ra những chức năng mà mình hay làm trong PHP để làm bằng NodeJS (hihi). Chính vì thế chủ đề tìm hiểu mà mình và các bạn tìm hiểu hôm nay đó chính là: Làm cách nào để gửi mail trong NodeJS ?

Chắc hẳn khi tìm hiểu về chức năng này thì bạn đã hiểu về NodeJs là gì, nó được cấu thành lên từ những gì đúng không nhỉ. Thế nên mình sẽ không đi vào định nghĩa nhiều nữa nhé.

Demo này, mình sẽ sử dụng một số modules sau:

  • Express: framework NodeJs
  • Express-generator: tự động build một project, nếu các bạn đã biết về Tool-developer trong Phalcon thì module này cũng tương tự như thế đó
  • Nodemailer: dùng để gửi mail
  • Jade: là một engine gần giống với html để định nghĩa giao diện

Bắt đầu (code) thoai, việc đầu tiên là chạy vài lệnh command cho thêm phần nguy hiểm nhé

Cài đặt modules

cd /var/www/html
mkdir pjnodejs
cd pjnodejs
npm install -g express
npm install -g express-generator

Note: nếu bạn dùng ubuntu, khi chạy các lệnh trên mà bị **fail** thì bạn chạy hãy chạy dưới quyền sudo nhé, còn window thì hổng lỗi đâu Ok, các lệnh này là bạn đã cài đặt thành công các modules cần thiết rồi đó. Chạy tiếp lệnh để tạo project.

express express_website

Sau khi chạy xong lệnh, bạn sẽ có một project có cấu trúc thư mục như hình bên dưới: Selection_016.png

Với cấu trúc thư mục này, để dễ nhớ thì:

  • routes: chính là folder chứa các files controller của bạn, app.js là nơi định nghĩa các route và một vài thứ khác bạn có thể mở ra xem nó rất dễ hiểu
  • views: là nơi chứa các view là layout do bạn định nghĩa

Để sử dụng nodemailer trong project, bạn mở file package.json thêm module đó và tiền hành chạy npm install để cài đặt

{
  "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",
    "jade": "~1.11.0",
    "morgan": "~1.7.0",
    "serve-favicon": "~2.3.0",
    "nodemailer":"*"
  }
}

Phần việc còn lại là định nghĩa 1 route, xây dựng 1 controller để xử lý request, xây dựng 1 view để hiển thị.

1. Định nghĩa route

var contact = require('./routes/contact'); // định nghĩa biến contact
app.use('/contact', contact); //khai báo sử dụng cho app

2. Tạo view

Để cho đơn giản, mình xin sử dụng 1 emplate có sẵn của Bootstrap tạo 1 file layout.jade dùng chung, và 1 file contact.jade định nghĩa form. Các bạn chú ý là chúng ta cần chuyển từ syntax của html sang jade nhé, nếu bạn chưa rõ về jade thì bạn có thể dùng các service online để convert nó. Ở đây mình cũng sử dụng http://html2jade.org để cho nhanh nhé

layout.jade file

doctype html
html(lang='en')
  head
    title #{title}: Express website
    meta(charset='utf-8')
    meta(http-equiv='X-UA-Compatible', content='IE=edge')
    meta(name='viewport', content='awidth=device-awidth, initial-scale=1')
    meta(name='description', content=')
    meta(name='author', content=')
    link(rel='icon', href='../../favicon.ico')
    title Starter Template for Bootstrap
    link(href='/stylesheets/bootstrap.min.css', rel='stylesheet')
    link(href='stylesheets/style.css', rel='stylesheet')
  body
    nav.navbar.navbar-inverse.navbar-fixed-top
      .container
        .navbar-header
          button.navbar-toggle.collapsed(type='button', data-toggle='collapse', data-target='#navbar', aria-expanded='false', aria-controls='navbar')
            span.sr-only Toggle navigation
            span.icon-bar
            span.icon-bar
            span.icon-bar
          a.navbar-brand(href='#') NodeJS

# navbar.collapse.navbar-collapse

          ul.nav.navbar-nav
            li(class=(title==='index' ? 'active' : '))
              a(href='#') Home
            li(class=(title==='About' ? 'active' : '))
              a(href='#about') About
            li(class=(title==='Contact' ? 'active' : '))
              a(href='#contact') Contact

    block content // Noi hien thi noi dung file view
    footer
        p ©2015, All Rights Reserved
    script(src='/javascripts/bootstrap.min.js')

contact.jade file

extends layout
block content
    .container
        form(method='post', action='contact/send')
            h1 Contact
            .form-group
                label Name
                input.form-control(type='text', name='name', placeholder='Enter name')
            .form-group
                label Email
                input.form-control(type='email', name='email', placeholder='Enter email')
            .form-group
                label Message
                textarea.form-control(name='message', placeholder='Enter message...')
            .form-group
                input.btn.btn-primary(type='submit', value='Send')

3. Tạo controller.js để xử lý

/routes/contact.js file

var express = require('express');
var router = express.Router();

router.get('/', function(req, res, next) {
    res.render('contact', { title: 'Contact' });
});
module.exports = router;

Tới đây bạn đã xây dựng gần page contact nhưng chưa có sử lý gì. Chúng ta tiến hành chạy npm start và truy cập http://localhost:3000/contact để xem kết qủa. Mình dùng cổng mặc định của express, bạn có thể config thông tin đó ở file bin/www. Kết quả nhận được Selection_017.png

Cuối cùng là phần xử lý gửi mail:

var nodemailer =  require('nodemailer'); // khai báo sử dụng module nodemailer
router.post('/send', function(req, res, next) {
    var transporter =  nodemailer.createTransport({ // config mail server
        service: 'Gmail',
        auth: {
            user: 'mailserver@gmail.com',
            pass: 'password'
        }
    });
    var mainOptions = { // thiết lập đối tượng, nội dung gửi mail
        from: 'Thanh Batmon',
        to: 'tomail@gmail.com',
        subject: 'Test Nodemailer',
        text: 'You recieved message from ' + req.body.email,
        html: '<p>You have got a new message</b><ul><li>Username:' + req.body.name + '</li><li>Email:' + req.body.email + '</li><li>Username:' + req.body.message + '</li></ul>'
    }
    transporter.sendMail(mainOptions, function(err, info){
        if (err) {
            console.log(err);
            res.redirect('/');
        } else {
            console.log('Message sent: ' +  info.response);
            res.redirect('/');
        }
    });
});

Kết quả email nhận được

Selection_018.png

Tổng kết lại mình đã giới thiệu cho các bạn cách xây dựng chức năng gửi mail thông qua nodemailer trong NodeJs. Do vẫn còn là một newbie nên rất mong nhận được sự góp ý và chia sẻ của các bạn.

Thank you             </div>
            
            <div class=

0