12/08/2018, 14:42

Send mailer qua sendgrid và sử dụng Sidekiq

I. Create ActionMailer rails generate mailer UserNotifier app/mailers/user_notice_mailer.rb class UserNoticeMailer < ApplicationMailer def send_email_after_account user, password @user = user @password = password mail to: user.email, subject: t("mailer.subject", name: ...

I. Create ActionMailer

rails generate mailer UserNotifier

app/mailers/user_notice_mailer.rb

class UserNoticeMailer < ApplicationMailer
  def send_email_after_account user, password
    @user = user
    @password = password
    mail to: user.email, subject: t("mailer.subject", name: @user.name)
  end
end

app/views/user_notice_mailer/send_email_after_account.html.erb

<h3><%= t "mailer.title" %></h3>
<div>
    <table>
      <tr>
        <td><strong><%= t "mailer.email" %></strong></td>
        <td><%= @user.email %></td>
      </tr>
      <tr>
        <td><strong><%= t "mailer.password" %></strong></td>
        <td><%= @password %></td>
      </tr>
    </table>
</div>

Nếu bạn muốn thêm css cho view mailer thì add file css bằng lệnh này: app/assets/stylesheets/mailer_custom.scss <%= Rails.application.assets.find_asset("mailer_custom.scss").to_s %> app/views/layouts/mailer.html.erb

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <style>
      <%= Rails.application.assets.find_asset("mailer_custom.scss").to_s %>
    </style>
  </head>

  <body>
    <%= yield %>
  </body>
</html>

app/controllers/users_controller.rb

 def create
    @user = User.new create_user_params
    if @user.save
    #sau khi lưu sử dụng lệnh này để  send mail
      UserNoticeMailer.send_email_after_account(@user, @user.password).deliver_later
      flash[:success] = t "devise.registrations.signed_up"
      redirect_to dashboard_users_path
    else
      render :new
    end
  end

II.Configure ActionMailer config/environments/development.rb

config.action_mailer.default_url_options = {host: ENV["HOST"]}
config.action_mailer.smtp_settings = {
    address: ENV["ADDRESS"],
    port: ENV["PORT_MAILER"],
    authentication: ENV["AUTHENTICAION"],
    user_name: ENV["EMAIL_USERNAME"],
    password: ENV["EMAIL_PASSWORD"],
    domain: ENV["DOMAIN"],
    enable_starttls_auto: true
  }

config/environments/production.rb

config.action_mailer.default_url_options = {host: "localhost", port: 3000}
config.action_mailer.smtp_settings = {
  address: ENV["ADDRESS"],
  port: ENV["PORT_MAILER"],
  authentication: ENV["AUTHENTICAION"],
  user_name: ENV["EMAIL_USERNAME"],
  password: ENV["EMAIL_PASSWORD"],
  domain: ENV["DOMAIN"],
  enable_starttls_auto: true
}

Install gem "figaro" +bundle exec figaro install +config/application.yml Bạn cần tạo 1 tài khoản trên trang http://sendgrid.com/, sau đó nhập EMAIL_USERNAME, EMAIL_PASSWORD vào dưới

ADDRESS: "smtp.sendgrid.net"
DOMAIN: "gmail.com"
EMAIL_USERNAME: "xxxxxx"
EMAIL_PASSWORD: "xxxxxx"
AUTHENTICAION: "plain"
PORT_MAILER: 587
HOST: "localhost:3000"

III.Sidekiq (Bạn có thể cài đặt gem này để hổ trợ việc chạy ngầm trong khi send mail) +Sidekiq là một gem hỗ trỡ xử lý ngầm dưới background mạnh mẽ cho Ruby. Nó nhằm mục đích là đơn giản để tích hợp với bất kỳ ứng dụng Rails hiện đại và hiệu suất cao hơn nhiều so với các giải pháp hiện có khác. +gem "sidekiq" +bundle insltall + config/application.rb Thêm lệnh này: config.active_job.queue_adapter = :sidekiq +Bạn cần phải cài đặt redis-server ở terminal: tin@tin-PC:~$ sudo apt-get install redis-server
- Sau đó chạy server
tin@tin-PC:~$ redis-server - Sau đó vào project của bạn để chạy Sidekiq tin@tin-PC:~/project_demo$ bundle exec sidekiq -q default -q mailers Bây giờ các bạn thử send mailer.... Chúc các bạn thành công Link tham khảo: https://sendgrid.com/docs/Integrate/Frameworks/rubyonrails.html

0