Tracking Email Open In Rails
Trong bài viết này sẽ thực hiện theo dõi việc mở mail đã gửi thường để phục vụ cho marketing hay tùy theo yêu cầu của dự án. Coding Bắt đầu bằng tạo model EmailOpen: rails g model EmailOpen email:string ip:string Định nghĩa tracking endpoint trong routes.rb: get "/beacon" , ...
Trong bài viết này sẽ thực hiện theo dõi việc mở mail đã gửi thường để phục vụ cho marketing hay tùy theo yêu cầu của dự án.
Coding
Bắt đầu bằng tạo model EmailOpen:
rails g model EmailOpen email:string ip:string
Định nghĩa tracking endpoint trong routes.rb:
get "/beacon", to: "tracking#beacon"
Mẹo nhỏ ở đây để hook về server minh là chèn 1 ảnh transparent 1x1px vào trong mail, tải về với link hoặc có thể tự tạo bằng các cộng cụ khác cũng được.
Với nội dung mail sẽ định nghĩa như sau:
<!DOCTYPE html> <html> <head> <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" /> </head> <body> Tiktok!! <img src="<%= email_tracker_url(@email) %>" > </body> </html>
Định nghĩa helper cho url để mã hóa với Base64:
module TrackingHelper def email_tracker_url email "http://localhost:3000/beacon?data=#{Base64.encode64(email)}" end end
khi người dùng mở mail sẽ hook về tracking endpoint:
class TrackingController < ApplicationController def beacon email = Base64.decode64 params[:data] EmailOpen.find_or_create_by(email: email) do |e| e.ip = request.ip end send_file "public/beacon.png", type: "image/png" end end
Ở đây sử dụng find_or_create_by để tránh việc tạo ra nhiều bản ghi cùng 1 người dùng, một nữa khi người dùng trả lời mail cũng mở bằng mail cũ đã lưu.
Để test chức năng này có thể chạy trong console hoặc gửi qua form với email muốn gửi. Các bạn có clone source code của minh để tham khảo thêm.
Kết quả
- Đây là form để test
- Mở mail đã gửi(minh dùng letter-opener-web)
- Đây là log của server
- Kiểm tra đã tạo thành công
Kết luận
Cảm ơn các bạn đã đọc bài viết