- vừa được xem lúc

[RubyonRails] Gửi mail trong ứng dụng Rails 6 với SMTP

0 0 25

Người đăng: 𝕋𝕣ườ𝕟𝕘

Theo Viblo Asia

Bài viết này là hướng dẫn cơ bản để xây dựng chức năng gửi mail đơn giản trong ứng dụng rails 6

Google security

Sau ngày 30 tháng 5 năm 2022, bạn không thể đăng nhập chỉ bằng tên người dùng và mật khẩu vào Gmail. Quyền truy cập ứng dụng kém an toàn hơn sẽ không khả dụng nữa trừ khi bạn có Google Workspace hoặc Google Cloud Identity. Tham khảo

Hiểu một cách đơn giản google đã tăng tính bảo mật hơn cho tài khoản người dùng. Chúng ta sẽ không thể đăng nhập ứng dụng khác chỉ bằng emailpassword

Trước kia chỉ cần config như thế này là chúng ta đã có thể sử dụng dịch vụ mail dễ dàng =))

config/environments/development.rb

 host = 'http://localhost:3000/' config.action_mailer.default_url_options = { host: host } # SMTP settings for gmail config.action_mailer.smtp_settings = { :address => "smtp.gmail.com", :port => 587, :user_name => ENV['GMAIL_USERNAME'], :password => ENV['GMAIL_PASSWORD'], :authentication => "plain", :enable_starttls_auto => true }

Thay vào đó bây giờ chúng ta sẽ cần xác thực 2FA và tạo mật khẩu riêng cho ứng dụng. Để hiểu rõ hơn hãy cùng mình xây dựng 1 ứng dụng rails đơn giản để mô tả lại chức năng gửi mail sử dụng ActionMailer.

Cách hoạt động của ActionMailer và cách tương tác gửi mail chắc hẳn mọi người đều nắm rõ rồi, trên google cũng rất nhiều bài hướng dẫn gửi mail trong ứng dụng rails. Nên mình đi vào vấn đề chính luôn.

Khởi tạo

Trước tiên ta cần setup 1 ứng dụng rails đơn giản, ở đây mình sử dụng scaffold cho tiện nhé 😃

rails new mailer -d postgresql
rails g scaffold user name:string email:string
rake db:migrate

sau đó chúng ta tạo một ActionMailer

rails g mailer example_mailer sample_email

trong thư mục app/mailers/application_mailer.rb hãy thay đổi default from: "_@.com" thành địa chỉ email của bạn

Tiếp theo bạn sửa lại nội dung mail 1 chút trong app/views/example_mailer/sample_email.html.erb cho dễ nhìn 😃

<!DOCTYPE html>
<html> <head> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /> </head> <body> <h1>Hi <%= @user.name %></h1> <p> Xin chao minh la truong </p> </body>
</html>

Vậy là xong bước chuẩn bị, tiếp theo chúng ta đi vào xây dựng chức năng gửi mail.

vào app/controllers/users_controller.rb sửa lại action create user . Sau khi tạo thành công user thì gửi mail về địa chỉ email của user đó ExampleMailer.sample_email(@user).deliver

def create @user = User.new(user_params) respond_to do |format| if @user.save ExampleMailer.sample_email(@user).deliver format.html { redirect_to user_url(@user), notice: "User was successfully created." } format.json { render :show, status: :created, location: @user } else format.html { render :new, status: :unprocessable_entity } format.json { render json: @user.errors, status: :unprocessable_entity } end end end

Gửi mail

Đầu tiên chúng ta cần config lại môi trường development để có thể gửi mail thành công với SMTP

/config/environments/development.rb

 config.action_mailer.raise_delivery_errors = true config.action_mailer.delivery_method = :smtp host = 'http://localhost:3000/' config.action_mailer.default_url_options = { host: host } # SMTP settings for gmail config.action_mailer.smtp_settings = { :address => "smtp.gmail.com", :port => 587, :user_name => ENV['GMAIL_USERNAME'], :password => ENV['GMAIL_PASSWORD'], :authentication => "plain", :enable_starttls_auto => true }

Biến môi trường: mình sử dụng gem gem "figaro" để setup các biến môi trường. Đại khái sau khi install gem này thì sẽ cho chúng ta 1 file application.yml chúng ta chỉ cần thêm các biến môi trường tương ứng

config/application.yml

# Add configuration values here, as shown below. GMAIL_USERNAME: "_@.com"
GMAIL_PASSWORD: "xxx-xxx-xxx"

hoặc lười thì cũng có thể viết inline luôn như này 😃) (`)

config.action_mailer.raise_delivery_errors = true config.action_mailer.delivery_method = :smtp host = 'http://localhost:3000/' config.action_mailer.default_url_options = { host: host } # SMTP settings for gmail config.action_mailer.smtp_settings = { :address => "smtp.gmail.com", :port => 587, :user_name => '_@.com', :password => 'xxx-xxx-xxx', :authentication => "plain", :enable_starttls_auto => true }

xxx-xxx-xxx password ?

Như mình đã nêu vấn đề ở đầu bài viết về việc google nâng cấp bảo mật. Vì vậy để gửi được mail với SMTP chúng ta cần phải xác thực 2FA cho tài khoản và tạo mới một mật khẩu ứng dụng.

Bật 2FA

vào link: https://myaccount.google.com/signinoptions/two-step-verification/enroll-welcome để tiến hành bật 2FA

Kết quả sau khi hoàn thành:

Tạo mật khẩu ứng dụng

vào link: https://myaccount.google.com/apppasswords để tạo mật khẩu ứng dụng chính là xxx-xxx-xxx sử dụng để config phía trên

Kết quả sau khi hoàn thành

xxx-xxx-xxx chúng ta cần chính là đoạn được tô màu vàng.

Test

tạo mới user với email: _@.com

kết quả:

Vậy là đã nhận được mail.

Kết luận

Trên đây là toàn bộ hiểu biết của mình về việc gửi mail trong ứng dụng rails. Các bạn có thể tham khảo và vận dụng vào dự án của mình. Mong nhận được nhận xét và ý kiến đóng góp từ phía bạn đọc.

Tài liệu tham khảo

https://stackoverflow.com/questions/23137012/535-5-7-8-username-and-password-not-accepted

https://guides.rubyonrails.org/command_line.html

Bình luận

Bài viết tương tự

- vừa được xem lúc

Bài toán tìm đường đi ngắn nhất với giải thuật Dijkstra

Với các bạn sinh viên chuyên ngành công nghệ thông tin, chắc không lạ gì với bài toán tìm đường đi ngắn nhất (Shortest Path Problems) trong đồ thị trọng số nữa. Ở bài viết lần này, mình sẽ làm 3 việc:.

0 0 122

- vừa được xem lúc

Tôi cá là bạn không biết những điều này - Ruby on rails ( Phần 2)

Các bạn có thể theo dõi phần 1 ở đây :. https://viblo.asia/p/toi-ca-la-ban-khong-biet-nhung-dieu-nay-ruby-on-rails-phan-1-WAyK8DDeKxX. 5.

0 0 211

- vừa được xem lúc

Những thay đổi trong ruby 3.0

. 2020 là một năm lớn đối với cộng đồng Ruby. Những người sáng lập Ruby có một món quà thực sự tuyệt vời cho chúng ta vào giáng sinh với việc phát hành Ruby 3.

0 0 31

- vừa được xem lúc

Có gì đặc biệt trong phiên bản Ruby 3x3 ?

Hello guys, chắc hẳn thời gian vừa rồi chúng ta cũng đã nghe qua thông tin Ruby sắp cho ra mắt Ruby version 3, hay còn được gọi là ruby 3x3, vậy liệu Ruby version 3 này có gì mới, và có những update nào đáng phải kể đến, và tại sao mọi người lại gọi nó là ruby version 3x3, thì trong bài ngày hôm nay

0 0 30

- vừa được xem lúc

Cách sử dụng class Time & Date trong Ruby (Phần 1)

Time là một class trong Ruby, nó sẽ giúp chỉnh sửa format, trích xuất thông tin một cách hiệu quả theo ý của bạn. . Topic hôm nay chúng ta có gì nào. .

0 0 83

- vừa được xem lúc

Ruby 3.0 có gì mới

Ruby 3.0.0 đã được ra mới được ra mắt vào tháng 12/2020, mục tiêu của bản 3.0.

0 0 26