Navigation
Tags
Categories
Powered by Squarespace

Entries in validation (1)

Wednesday
09Dec2009

Mailadressen validieren mit ruby

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