2017-01-18 1 views
0

J'essaie d'utiliser un script que j'ai trouvé pour envoyer un ping aux emails pour s'assurer qu'ils existent.Email Ping se bloque sur l'email

with open(input_list, 'r') as f: 
    reader = csv.reader(f) 
    for row in reader: 
     address = row[0] 
     person_name = row[1]+' '+row[2] 
     company = row[4] 
     match = re.match('^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$', address) 
     print("Email for ", person_name) 
     print(address) 
     if match == None: 
      synt = 'Bad Syntax' 
      warnings.warn(address + " has bad syntax.") 
     else: 
      synt = 'Good syntax' 
     dom = re.search("@(.*)$", address).group(1) 
     print(dom) 
     try: 
      records = dns.resolver.query(dom, 'MX') 
      mxRecord = records[0].exchange 
      mxRecord = str(mxRecord) 
     except: 
      warnings.warn("Issue contacting domain") 
      pass 
     # Get local server hostname 
     host = socket.gethostname() 
     # SMTP lib setup (use debug level for full output) 
     server = smtplib.SMTP('smtp-mail.outlook.com',587)#will need this for mail sending 
     while True: 
      try: 
       server.set_debuglevel(0) 
       # SMTP Conversation 
       server.connect(mxRecord) 
       server.helo(host) 
       server.mail('[email protected]') 
       code, message = server.rcpt(str(address)) 
       server.quit() 
       if code == 250: 
        print('Success') 
        new_row = [address, person_name, company, synt, 'Ping Successful'] 
        email_data.append(new_row) 
        with open('cseresult2.csv', 'a+', newline='') as mess: 
         writ = csv.writer(mess, dialect='excel') 
         writ.writerow(email_data[-1]) 
       else: 
        print('Bad') 
        new_row = [address, person_name, company, synt, 'Ping Bounced'] 
        email_data.append(new_row) 
        with open('cseresult2.csv', 'a+', newline='') as mess: 
         writ = csv.writer(mess, dialect='excel') 
         writ.writerow(email_data[-1]) 
      except: 
       continue 
      break 
     print() 
     print('================') 
     print() 
     time.sleep(3) 

Le code fonctionne principalement bien. Cependant, avec la boucle while, je reçois beaucoup d'erreurs de délai d'attente:

TimeoutError: [WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond 

La boucle while a pris en charge, mais maintenant ça va accrocher un e-mail à ne pas itérer le reste de la liste. C'est pour un projet, donc toute aide pour le déplacer serait appréciée.

Répondre

0

Votre boucle while est configurée pour continuer indéfiniment si elle rencontre un type d'erreur persistante. Vous avez beaucoup de code dans le bloc try, il y a donc beaucoup de cas où cela peut arriver (par exemple, échec de connexion à votre serveur de messagerie, échec de l'ouverture de votre fichier csv, etc.). Sans plus d'informations, je ne peux pas dire avec certitude que cela se passe, mais cela ne me ferait certainement pas de mal d'y remédier.

Puisque la seule erreur qui vous intéresse est TimeoutError, vous devriez attraper cette erreur explicitement et continue seulement dans ce cas. Pour toutes les autres erreurs, imprimez l'erreur et cassez la boucle ou laissez l'erreur augmenter. Vous devez également définir le délai d'attente sur une valeur saine lors de la création de votre instance de serveur. Et finalement, vous seriez mieux avec une boucle for qui se termine si le délai d'attente n'est pas résolu après un certain laps de temps; même dans le cas d'une TimeoutError persistante que vous ne voulez pas essayer de toujours:

### Set a sane timeout 
server = smtplib.SMTP('smtp-mail.outlook.com', 587, timeout=1) 

### Try a maximum of 10 times 
for i in range(10): 
    try: 
     ### Connect to the email server and write to your file 

    except TimeoutError, e: 
     print e 

    ### All other errors will bubble up 

Si vous êtes curieux ce que le délai d'attente par défaut est, vous pouvez le faire:

import socket 

print(socket.getdefaulttimeout()) 

La réponse est la délai d'attente par défaut, en secondes. La valeur None indique que vous ne serez jamais interrompu, ce qui ne semble pas être le cas pour vous.