2014-03-06 7 views
5

Ich habe versucht, eine E-Mail-Adresse zu überprüfen, die vom Benutzer in meinem Programm eingegeben wurde. Der Code, den ich zur Zeit habe, ist:Überprüfen einer E-Mail-Adresse in Python mit smtplib

server = smtplib.SMTP() 
server.connect() 
server.set_debuglevel(True) 
try: 
    server.verify(email) 
except Exception: 
    return False 
finally: 
    server.quit() 

aber wenn ich es benutze ich:

ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it 

Also, was ich frage ist, wie kann ich über das SMTP-Modul eine E-Mail-Adresse überprüfen? Ich möchte überprüfen, ob die E-Mail-Adresse tatsächlich existiert.

+3

Sie müssen näher erläutern, was "verify" bedeutet. Möchten Sie prüfen, ob die Adresse wohlgeformt ist oder existiert? – goncalopp

+0

https://gist.github.com/blinks/47987 –

Antwort

5

Hier ist eine einfache Möglichkeit, E-Mails zu überprüfen. Dies ist ein minimal modifizierter Code von this link. Der erste Teil wird prüfen, ob die E-Mail-Adresse wohlgeformt ist, der zweite Teil wird den SMTP-Server mit dieser Adresse pingen und sehen, ob er einen Erfolgscode (250) zurückbekommt oder nicht. Davon abgesehen ist dies nicht fehlersicher - abhängig davon, wie dies eingerichtet ist, wird manchmal jede E-Mail als gültig zurückgegeben. Sie sollten also immer noch eine Bestätigungs-E-Mail senden.

email_address = '[email protected]' 

#Step 1: Check email 
#Check using Regex that an email meets minimum requirements, throw an error if not 
addressToVerify = email_address 
match = re.match('^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$', addressToVerify) 

if match == None: 
    print('Bad Syntax in ' + addressToVerify) 
    raise ValueError('Bad Syntax') 

#Step 2: Getting MX record 
#Pull domain name from email address 
domain_name = email_address.split('@')[1] 

#get the MX record for the domain 
records = dns.resolver.query(domain_name, 'MX') 
mxRecord = records[0].exchange 
mxRecord = str(mxRecord) 

#Step 3: ping email server 
#check if the email address exists 

# Get local server hostname 
host = socket.gethostname() 

# SMTP lib setup (use debug level for full output) 
server = smtplib.SMTP() 
server.set_debuglevel(0) 

# SMTP Conversation 
server.connect(mxRecord) 
server.helo(host) 
server.mail('[email protected]') 
code, message = server.rcpt(str(addressToVerify)) 
server.quit() 

# Assume 250 as Success 
if code == 250: 
    print('Y') 
else: 
    print('N') 
+0

Super! Danke @verybadatthis. Könnte auch die Import-Anweisungen hinzufügen und den Resolver anpassen (war nicht in der Lage, ** dns.resolver ** zu verwenden)? 'importieren re; von dns Import-Resolver; Importbuchse; import smtplib; ' – propjk007

+0

Dies funktioniert nicht für andere E-Mails als Gmail-ID .. Wie überprüfen Sie andere E-Mail-Domänen wie Hotmail Yahoo etc –

0

Der Servername ist zusammen mit dem Port nicht richtig definiert. Abhängig davon, wie Sie Ihren SMTP-Server haben, müssen Sie möglicherweise die Login-Funktion verwenden.

server = smtplib.SMTP(str(SERVER), int(SMTP_PORT)) 
server.connect() 
server.set_debuglevel(True) 
try: 
    server.verify(email) 
except Exception: 
    return False 
finally: 
    server.quit() 
Verwandte Themen