Mailadressen validieren mit ruby
Wednesday, December 9, 2009 at 11:27PM In meinem Twitterstream ist heute eine Frage nach automatisierter Email-Validation aufgetaucht. Ich hab vor längerem ein kleines, sehr einfaches ruby-Script geschrieben, dass eine Liste von Mailadressen überprüft, indem es den MX-Record des hostteils (der Teil hinter dem @) auflöst und dann versucht, sich an den ersten rausgefundenen Mailserver auf dem SMTP Port zu verbinden. Eine Adresse gilt als valid, wenn beides funktioniert. Nun ist das natürlich ein sehr oberflächlicher Test, weil ja nur der hostteil der Adresse überprüft wird, und das Script spricht auch kein smtp mit dem Server, sondern schaut nur, ob man sich an Port 25 verbinden kann. Trotzdem kann man damit einen Grossteil von Adressen, die zwar der Form entsprechen, aber invalid sind, rausfiltern. Ich bin auch nicht sicher, ob kommerzielle Email-Validation-Software da gross etwas anderes macht(?).
Jedenfalls, falls wieder einmal jemand so etwas braucht: Hier ist das Script (Bis ich das File rausgesucht hatte war der Fragesteller schon manuell durch... :/). Man kann das natürlich sehr leicht so erweitern, dass die Mailadressen aus einem File gelesen werden.
require 'rubygems'
require 'net/dns/resolver'
require 'socket'
include Socket::Constants
def is_valid?(address)
return false if address.count("@") != 1
packet = Net::DNS::Resolver.start(address.split("@").last, Net::DNS::MX)
mx = packet.answer.first
return false if mx.nil?
sock = TCPSocket.new(mx.exchange[0..-2], 25)
if (sock) then
sock.close
return true
end
return false
end
#only the first is valid
addresses = ["spam@mgroh.net", "foo@bla.blub", "nomail@example.com"]
valid_addresses = addresses.map{|a| a if is_valid?(a)}.compact
puts valid_addresses
mgroh |
2 Comments | 
