+2

Gửi Gmail, email từ ứng dụng Rails

Sau khi tốn cả buổi chiều để fix lỗi thì ngay sau đó mình đã quyết định phải viết ngay bài này để note lại, về sau có gì còn xem lại 😂😂 .
Bài viết sẽ gồm 2 phần, phần 1 nói về chức năng gửi email có tên miền ngẫu nhiên và kiểm tra danh sách thư đã gửi bằng gem mailcatcher.
Phần 2 viết về cách gửi thư Gmail (tên miền là @gmail.com ấy).

Chúng ta sẽ tạo 1 app Rails có chức năng create Post, sau mỗi lần Post được create thành công thì email được gửi đi.

Let's Start

Ruby version: 2.7.2
Rails version : 6.1.5
Database : default SQLite3

Part 1: Gửi email với tên miền ngẫu nhiên

1. Tạo model post

Tạo app Rails mới có tên testapp

rails new testapp

Đợi chạy xong thì direct đến địa chỉ app vừa tạo

cd testapp

Tạo model post bằng scaffold

rails g scaffold post email:string content:text

Sau đó, chạy lệnh migrate để tạo database

rails db:migrate

2. Tạo Mailer

Trong Rails, ActionMailer được sử dụng để nhận và gửi mail. ActionMailer khá giống với Controller. Controller dùng Template để hiển thi ra màn hình, ActionMailer cũng dùng Template để tạo và gửi mail.

Tạo ActionMailer có tên PostMailer :

rails g PostMailer creation_email

image.png

Bằng câu lệnh trên, cùng với ActionMailer PostMailer, 2 file creation_email.html.erbcreation_email.text.erb cũng được tạo. 2 file này sẽ tạo Template để hiển thị nội dung mail được gửi.

Bên trong file testapp/mailers/post_mailer.rb sửa hàm creation_email như sau:

class PostMailer < ApplicationMailer
  def creation_email(post)
    @post = post

    mail to: post.email, subject: "Hello World", from: "test@example.com"
  end
end

Hàm creaton_email sẽ nhận @post từ form như 1 parameter.
Mail có subject là "Hello World", sau khi được tạo sẽ gửi đến địa chỉ chúng ta viết trong :email, và tên người gửi là "test@example.com".
Ngoài ra, nếu các bạn muốn thống nhất địa chỉ người gửi, bất kể mail nào đều có chung 1 địa chỉ người gửi thì chúng ta có thể chỉ định giá trị default trong file testapp/mailers/post_mailer.rb như sau:

class PostMailer < ApplicationMailer
    default from: 'test@example.com

  def creation_email(post)
    @post = post
....

3. Tạo Template

Ở đây chúng ta sẽ sửa file creation_email.html.erbcreation_email.text.erb để tạo Template hiển thị nội dung mail. Mọi người có thể sửa theo ý thích còn mình sẽ sửa như dưới đây 😂😂:
creation_email.html.erb

<h1>Post#creation_email</h1>
<p>find me in app/views/post_mailer/creation_email.html.erb</p>

<p><%= @post.content %></p>


creation_email.text.erb

Post#creation_email
find me in app/views/post_mailer/creation_email.text.erb

<%= @post.content %>

4. Chức năng gửi mail

Như ở đầu mình nói, app này sẽ có chức năng gửi mail đến người nhận mỗi khi post mới được create. Do đó, chúng ta sẽ gọi ActionMailer từ hàm create trong Controller và gửi mail sau khi save thành công @post. Thêm PostMailer.creation_email(@post).deliver_now vào hàm create:

testapp/app/controllers/posts_controller.rb

def create
    @post = Post.new(post_params)

    respond_to do |format|
      if @post.save
        PostMailer.creation_email(@post).deliver_now    #thêm vào dòng này
        format.html { redirect_to post_url(@post), notice: "Post was successfully created." }
        format.json { render :show, status: :created, location: @post }
      else
        format.html { render :new, status: :unprocessable_entity }
        format.json { render json: @post.errors, status: :unprocessable_entity }
      end
    end
  end

Dùng hàm deliver_now thì mail sẽ được gửi ngay lập tức. Ngoài ra còn có hàm deliver_later. Ví dụ nếu viết như dưới đây, 5p sau khi post mới được save, mail sẽ được gửi đi.

PostMailer.creation_email(@post).deliver_later(wait: 5.minutes)

5. Xem mail đã gửi

Chúng ta dùng gem mailcatcher để xác nhận các mail đã được gửi. Đầu tiên, ta sẽ install gem mailcatcher bằng terminal:

gem install mailcatcher

mailcatcher sử dụng server SMTP nên cần phải thay đổi cài đặt trong môi trường development. Thêm vào file config/environments/development.rb như dưới đây.

... # giản lược
# Don't care if the mailer can't send.
  config.action_mailer.raise_delivery_errors = false
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
     address: '127.0.0.1',
     port: 1025
}
... # giản lược

Nếu server rails đang chạy thì các bạn hãy khởi động lại server nhé.

Trước khi tạo post mới, nhập vào terminal dòng dưới đây để khởi động mailcatcher:

mailcatcher

image.png


6. Hoàn thành

Sau khi khởi động mailcatcher, cùng thử tạo post mới và xem kết quả nào !

image.png

Trong terminal sẽ hiển thị thông báo gửi mail thành công

image.png

Truy cập vào cổng 1080: localhost:1080/ để xem kết quả nha ^^.
File HTML

image.png

Yes, It's works! 😊😊
Vậy là chúng ta đã gửi mail thành công. Giờ có thể thoát mailcatcher bằng nút Quit ở góc phải màn hình.


Part 2: Gửi thư Gmail

1. Thay đổi cài đặt trong môi trường development

Ở Part 1 chúng ta đã xây dựng được chức năng gửi mail. Để có thể gửi thư qua Gmail thì chỉ cần thay đổi một chút ở file config/environments/development.rb.
Xóa đoạn code đã thêm ở development.rb rồi thêm đoạn code dưới đây

  config.action_mailer.default_url_options = {host: "localhost:3000"}
  config.action_mailer.perform_deliveries = true
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
      enable_starttls_auto: true,
      address: "smtp.gmail.com",
      port: 587,
      :domain => 'smtp.gmail.com',
      user_name: 'huykhoa11@gmail.com',  # Tên tài khoản gmail mà các bạn tạo mật khẩu ứng dụng.
      password: 'bivnraxz********',      # Mật khẩu ứng dụng của các bạn. (ở đây mình cố tình thay bằng dấu * đấy)
      authentication: :plain
  }
  • user_name: Tên tài khoản gmail mà các bạn tạo mật khẩu ứng dụng.
  • password: mật khẩu ứng dụng của bạn.

Mật khẩu ứng dụng là mật mã gồm 16 chữ số cho phép một ứng dụng hoặc thiết bị kém an toàn truy cập vào Tài khoản Google của bạn. Chỉ những tài khoản đã bật tính năng Xác minh 2 bước mới có thể sử dụng Mật khẩu ứng dụng.

Chú ý cần bật Xác minh 2 bước cho tài khoản Gmail.

Nếu các bạn chưa biết mật khẩu ứng dụng là gì và cách tạo mật khẩu ứng dụng ra sao thì có thể đọc thêm ở đây .
https://support.google.com/accounts/answer/185833?hl=vi

Hoàn thành

cùng thử tạo post mới nhé!

image.png

Sau khi tạo, vào hộp thư đến của Gmail và kiểm tra kết quả nào!

image.png

Yes, It's works! 😊😊

Tổng kết

Vây là chúng ta đã gửi mail thành công từ Rails App. Mọi người cùng đọc và góp ý nha ^^.

Nguồn tham khảo

1. Sách 現場で使える Ruby on Rails 5 速度実践ガイド 5.2 対応, tái bản lần thứ 6 ngày 27/12/2019, trang 299-305.
2. https://qiita.com/miriwo/items/06d7d69aff47fd02fbc1

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí