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

Check EMail Active Kiểm tra mail có tồn tại hay không?

0 0 15

Người đăng: NGUYEN DINH DUC

Theo Viblo Asia

Phương châm viết bài để lưu lại kiến thức cho bản thân cũng như cho những ai cần hôm nay mình xin chia sẻ cách kiểm tra mail còn hoạt động hay không trên RoR (Ruby On Rails).

Nội dung:

  1. Check Mail Format (REGEX)
  2. Check DNS
  3. Check SMTP

1.Check Mail Format (REGEX) Đầu tiên thì chắc là cũng rất quen thuộc với quý anh em đấy là check format bằng chuỗi regex. Regex để check mail thì các quý anh em cứ lên google search thì nó ra một đống. Dưới đây là regex của bản thân hay dùng. nếu anh em thấy hợp lý thì cứ copy paste vào ?

 EMAIL_REGEX = /\A[a-zA-Z0-9.!\#$%&'*+\/=?^_`{|}~-]_@.com[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*\z/

để dùng đoạn regex ở trên thì cứ cho i xì đúc vào file model của quý anh em nhé. của mình sẽ là app/models/user.rb

validates :email, presence: true, format: { with: EMAIL_REGEX } #Nếu quý anh em chỉ dùng regex thì cái này
validate :check_mail #Còn muốn mở rộng thì dùng cái này nhé! def check_mail if email.present? && email.match?(EMAIL_REGEX) # chỗ này sẽ thêm phần check DNS vs SMTP ở dưới nha anh em else erors.add(:email, "Email is invalid") end
end

vậy là xong phần check regex tiếp theo tới check dns.

  1. Check DNS Thì để resolv dns thì quý anh em thêm require 'resolv' vào nhé, còn thêm như thế nào thì đơn giản cứ copy paste vào file model user.rb là xong thôi ?
 require 'resolv' EMAIL_REGEX = /\A[a-zA-Z0-9.!\#$%&'*+\/=?^_`{|}~-]_@.com[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*\z/ validate :check_mail def check_mail if email.present? && email.match?(EMAIL_REGEX) domain = email.split("@").last records = Resolv::DNS.open do |dns| dns.getresources(domain, Resolv::DNS::Resource::IN::MX) end unless records.empty? # Chỗ này chừa lại để bản thân thêm phần check SMTP nha anh em else errors.add(:email, "domain is invalid") end else erors.add(:email, "is invalid") end
end 

anh em thấy đơn giản không nào. chỉ cần chịu khó google vs một search key hợp lý là ra thôi. =)) vậy là xong phần check DNS rồi.

  1. Check SMTP Phần cuối cùng sẽ là check SMTP. Để sử dụng smtp trong rails anh em thêm thư viện net/smtp vào nhé, nó sẽ là require 'net/smtp' vào trên hoặc dưới cái require 'resolv' lúc nẫy cho dễ nhìn nhé. vào code của chúng ta sẽ là:
 require 'resolv' require 'net/smtp' EMAIL_REGEX = /\A[a-zA-Z0-9.!\#$%&'*+\/=?^_`{|}~-]_@.com[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*\z/ validate :check_mail def check_mail if email.present? && email.match?(EMAIL_REGEX) url = "fts.co.jp" #Host của anh em nhé domain = email.split("@").last records = Resolv::DNS.open do |dns| dns.getresources(domain, Resolv::DNS::Resource::IN::MX) end unless records.empty? records.each do |r| begin Net::SMTP.start(r.exchange.to_s, 25, url) do |smtp| smtp.mailfrom(ApplicationMailer.default[:from]) # Gửi từ send mail của app nhé res = smtp.rcptto(email) result = res.string.chomp.gsub(/\s+/m, ' ').gsub(/^\s+|\s+$/m, '').split(" ") Rails.logger.debug("SMTP_RCPT_TO_RESULT: #{result}") if result[0] != "550" return true end end rescue Exception => e Rails.logger.debug("SMTP_ERROR: #{e}") next # skip if has error end end # Nếu chạy hết resolved dns mà vẫn chưa return true thì thôi nghỉ errors.add(:email, "invalid") else errors.add(:email, "domain is invalid") end else erors.add(:email, "is invalid") end
end 

đến đây thì hoàn thành nhé anh em. thông thường thì chỉ cần kiểm tra cái dns đầu tiên là ok (đối vs gmail...) nhưng đối vs mail công ty thì sẽ có những công ty có trên 1 MX server nên mình check tất cho chắc ăn. nếu một trong số đó trả về khác 550 thì coi như mail đó active. giải thích cho anh em xíu là mình dùng phương thức rcpt để check nhé. thường thì nếu mail không tồn tại hoặc lỗi thì MX serve sẽ trả về lỗi 550.

Cảm ơn anh em đã tốn thời gian cho bài viết này. Nếu anh em thấy video hay, ý nghĩa thì cho mình một like share và sụp-rai kênh Quang Linh Vlog để ủng hộ anh em chúng ...... nhầm ?) rất mong nhận được comment của quý anh em

Anh em có thể tham khảo thêm: SMTP, RCPT Mail Cái này là Python chứ mà mình tham khảo phần logic nhé anh em Check Active Mail online

Bình luận

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

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

MOSH: Kẻ hủy diệt SSH

Lời nói đầu. Lời đầu tiên xin được xin chào cả nhà, đã lâu lắm rồi mình không viết blog nay May Fest mà người iu mình thích cái áo viblo quá nên xin phép nổ phát súng trên Viblo về Mosh - thứ khá hay

0 0 138

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

Vòng đời và trạng thái của Thread

A. Giới thiệu.

0 0 139

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

Giải quyết vấn đề N+1 trong quan hệ cha - con vô tận bằng Eager Loading

Vấn đề. Trong khi phát triển ứng dụng, chắc hẳn các bạn đã gặp phải trường hợp đệ quy cha-con trong khi phát triển các dự án, ví dụ như cây thư mục như sau:.

0 0 182

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

Bạn tổ chức thư mục views cho các dự án Laravel như thế nào?

Hầu hết các ứng dụng Laravel có rất nhiều views. Một ứng dụng nhỏ sẽ không xảy ra vấn đề gì cả, tuy nhiều nếu dự án lớn dần theo thời gian, chúng ta sẽ gặp bế tắc trong việc tổ chức và sắp xếp các vie

0 0 202

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

Sự khác nhau giữa những điều tưởng giống nhau - Phần 3

Hôm nay, để tiếp tục cho series so sánh, hãy cùng mình khám phá thêm 2 địa danh mới khá nổi tiếng của Việt Nam mình đó là Cù Lao Chàm và đảo Lý Sơn. .

0 0 112

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

Một số thuật toán sắp xếp

Chắc hẳn ngồi trên ghế giảng đường đại học thì ai cũng sẽ được làm quen với thuật toán. Nghe thì thật là trừu tượng và mơ hồ, nhưng để tối ưu hóa những bài toán đặt ra thì bắt buộc các bạn phải học đế

0 0 178