参考にさせていただいた記事
「Ruby で メールアドレスの有効性チェックしてみた」
https://qiita.com/yutackall/items/ce9285ecdf2f03db0404
前回書いた https://qiita.com/motty93/items/43de4df4e3c5f6bb43fc
と、上の記事のハイブリッドです。
実行環境
- OSX 10.11.6
- Rails 5.0.4
- Ruby 2.3.1
コード
app/controllers/concerns/mail_check.rb
require 'resolv'
require 'net/smtp'
module MailCheck
extend ActiveSupport::Concern
MY_DOMAIN = 'gmail.com'.freeze
PORT = 25
def mail_check(addr)
domain = addr.split('@').last
return { email: addr, domain: false, message: 'domain does not found.' } unless get_exchange(domain)
addrs_exist?(get_exchange(domain), addr)
rescue # 送信先メールアドレスが存在しない場合、例外処理へ
{ email: addr, domain: false, result: "#{addr} does not exist." }
end
private
def get_exchange(domain)
mx = Resolv::DNS.new.getresource(domain, Resolv::DNS::Resource::IN::MX)
mx.exchange.to_s
rescue
nil
end
def addrs_exist?(domain, addr)
Net::SMTP.start(domain, PORT, MY_DOMAIN) do |smtp|
smtp.mailfrom("送信元メールアドレス")
res = smtp.rcptto(addr).string.chomp
{ email: addr, domain: true, result: res }
end
end
end
telnetよりはよさそう。ただ問題が何点かあるっぽいけども。。。
使い方は前の記事を参考にしてみてください、わからんことなどあれば気軽に質問欄に。
おわり
gem化されればいいのに!