Xin chào tất cả các bạn đã đến với bài giới thiệu của mình, như thiêu đề, hôm nay mình sẽ giới thiệu cho các bạn một kỹ thuật send mail thông qua sendgrid và check xem user mình gửi mail đã check mail đó hay chưa. Tại sao mình lại chọn gửi thông qua sendgrid mà không phải là gửi mail thông thường hay dùng sidekiq? Có 2 lý do khiến mình muốn sử dụng mail sendgrid thay vì sidekiq hoặc send mail thông thường vì: - Sendgrid giúp mình gửi một loạt mail cho người khác mà không bị lưu lại trong hộp thư đi của mình. - Sendgrid giúp mình check user read mail hay chưa hoặc đã click vào link mình gửi trong đó hay chưa, thậm chí mail bị xóa hay đưa vào spam cũng có thể check được mà không cần phải gắn cờ ẩn vào mail (sendgrid thực ra cũng làm theo cách đó nhưng họ giúp mình làm hết mà không cần phải setup). 1. **Đầu tiên, mình xin được phép giới thiệu về kỹ thuật send mail thông qua sendgrid. Cũng có 2 cách để thực hiện:** - **Cách 1: Dùng gem "sendgrid-ruby" (send mail bằng console)** - B1: Thêm vào ```Gemfile``` dòng sau: gem "sendgrid-ruby" - B2: Run command: bundle install - B3: Thực hiện: Với gem này, bạn có thể gửi mail bằng console (rails c) như sau: require 'sendgrid-ruby' include SendGrid data = JSON.parse('{ "personalizations": [ { "to": [ { "email": "mail_to@example.com" } ], "subject": "Hello World from the SendGrid Ruby Library!" } ], "from": { "email": "mail_from@example.com" }, "content": [ { "type": "text/plain", "value": "Hello, Email!" } ] }') sg = SendGrid::API.new(api_key: ENV['SENDGRID_API_KEY']) # ENV['SENDGRID_API_KEY'] là biến môi trường, đó là api key của tài khoản sendgrid của bạn response = sg.client.mail._("send").post(request_body: data) puts response.status_code puts response.body puts response.headers - Bước trên thường các bạn sẽ nhận được status_code là 202, tức là mail đã gửi đi và đang chờ phản hồi. - Body và header sẽ không có gì cả nên nếu check nó sẽ không có gì nên nếu thấy vậy thì k nên lo lắng ^^. - Giờ thì check mail xem đã nhận được chưa nhé - **Cách 2: Dùng gem sendgrid** - B1: Cài đặt môi trường, thêm vào ```Gemfile``` dòng sau: gem "sendgrid" Sau đó thêm hoặc sửa nội dung sau trong ```config/environments/***.rb(development, production...)``` ActionMailer::Base.smtp_settings = { :address => "smtp.sendgrid.net", :port => 25, :domain => "mysite.com", # -> tên miền của bạn (Ví dụ localhos:3000) :authentication => :plain, :user_name => "sendgrid_username", # -> user_name tài khoản sendgrid của bạn :password => "sendgrid_password" # -> password } - B2: Sử dụng: Trong này mình sẽ ví dụ với file ```app/mailers/my_mailer.rb``` gửi một email đến một người: class MyMailer < ActionMailer::Base include SendGrid default from: "mail_from@example.com" #-> from def welcome_message(user) sendgrid_unique_args key2: "newvalue2" #->gắn cờ để check mail (mình sẽ giới thiệu ở phần sau) mail to: user.email, subject: "Welcome #{user.name} :-)" end def goodbye_message(user) sendgrid_disable :ganalytics #-> hàm này gắn vào để không check đã đọc mail hay chưa hoặc click link trong nội dung mail mail to: user.email, subject: "Fare thee well :-(" end end **Sử dụng: Trong này mình sẽ ví dụ với file ```app/mailers/my_mailer.rb``` gửi một email đến nhiều người (thường < 1000 để đảm bảo việc gửi mail không thất lạc):** class MyMailer < ActionMailer::Base include SendGrid default from: "mail_from@example.com" #-> from def welcome_message(users) ids = users.map &:id sendgrid_recipients users.map(&:email) sendgrid_substitute "#id#", ids #-> Sẽ thay thế lần lượt từng mail với từng id khi xuát hiện khóa "#id#" trong nội dung mail sendgrid_unique_args id: "#id#" #->gắn cờ để check mail (mình sẽ giới thiệu ở phần sau) mail to: "this.will@be.ignored.com", subject: "Welcome #{user.name} :-)" end end 2. **Check xem user đã đọc mail(open, click...) hay chưa** - **Có rất nhiều action có thể check đối với user, cụ thể như sau:** - ```Processed:``` Thư đã được soạn và đã sẵn sàng để được gửi. - ```Dropped:``` Bạn có thể thấy các lý do sau: Tiêu đề SMTPAPI không hợp lệ, Nội dung spam (nếu bạn bật ứng dụng kiểm tra spam), Địa chỉ Chưa đăng ký, Địa chỉ bị Trả lại, Địa chỉ Báo cáo Spam, Danh sách Người nhận Không hợp lệ. - ```Delivered: ```Thư đã được gửi thành công đến người nhận. - ```Deferred:``` Người nhận tạm thời từ chối tin nhắn. - ```Bounce: ```Máy chủ nhận không thể hoặc không chấp nhận tin nhắn. - ```Open:``` Người nhận đã mở thư HTML. Bạn cần bật Open Tracking để nhận được loại sự kiện này. -``` Click:``` Người nhận đã nhấp vào liên kết trong thư. Bạn cần bật Theo dõi Nhấp chuột để nhận loại sự kiện này. - ```Spam Report:``` Người nhận đã đánh dấu thư là spam. - ```Unsubscribe: ```Người nhận đã nhấp vào liên kết 'Không tham gia tất cả các email' (có sẵn sau khi nhấp vào liên kết quản lý đăng ký của tin nhắn). Bạn cần bật Theo dõi đăng ký để nhận loại sự kiện này. - ```Group Unsubscribe:``` Người nhận đã hủy đăng ký khỏi nhóm cụ thể bằng liên kết trực tiếp hoặc tùy chọn cập nhật. Bạn cần bật Theo dõi đăng ký để nhận loại sự kiện này. -``` Group Resubscribe: ```Người nhận đăng ký lại nhóm cụ thể bằng cách cập nhật tùy chọn. Bạn cần bật Theo dõi đăng ký để nhận loại sự kiện này. - **Cách cài đặt trong app.sendgrid.com** - Kết nối tới địa chỉ https://app.sendgrid.com/settings/mail_settings - Chọn "Event Notification" - Nếu "Event Notification" đang "off" thì click -> "on" - Click "edit" - Trong dòng "HTTP POST URL" insert "YOUR_DOMAIN+/api/v1/candidate_read_mails" #-> Ví dụ "http://hello_word.com/api/v1/candidate_read_mails" #-> Ở bước này, các bạn có thể kèm mã xác thực cho server để chống lại những request từ ngoài vào, khi đó link của bạn sẽ như sau: http://hello_word.com/api/v1/candidate_read_mails?key=this_is_authentication_key, this_is_authentication_key đóng cái trò như 1 mã authentication. - Sau đó click "test yourself", bên sendgird sẽ gửi lại cho server các bạn một method POST chứa các event và thông tin các bạn gửi đi, sau đó kiểm tra params để check các action của user đối với mail bạn đã gửi. - Lưu ý, nếu bạn test trên local có thể test thông qua ngrok ^^ Mình xin được kết thúc bài giới thiệu về sendgrid ở đây, nếu có bất kì thắc mắc hoặc câu hỏi nào liên quan đến vấn đề cài đặt hoặc track mail xin vui lòng liên hệ email: "tuannd255@gmail.com", mình sẽ giúp các bạn giải đáp hoặc nếu vấn đề mình chưa từng gặp mình có thể hỏi người khác để có câu trả lời tốt nhất cho bạn. Mình xin chân thành cảm ơn các bạn đã xem. **Nguồn:** https://sendgrid.com/docs/API_Reference/index.html, https://github.com/stephenb/sendgrid, https://github.com/sendgrid/sendgrid-ruby