2010-11-05 9 views
1

J'ai un script python qui envoie quelques paquets d'emails (à différentes adresses avec des contenus différents) en utilisant smtplib périodiquement tout au long de la journée. Assez fréquemment (disons environ 1 fois sur 5 en envoyant des lots de plus d'un email en même temps), j'obtiens un IOError (errno: broken pipe). J'essaie de réinitialiser et de quitter le serveur SMTP, puis de me connecter à nouveau au serveur et de tenter de le renvoyer, mais cela échoue toujours s'il échoue la première fois (avec la même exception). Le serveur SMTP est géré par le collège et doit être fiable (et permet des emails sans connexion tant que vous êtes sur l'intranet).tuyau brisé intermittent smtp (errno 32)

Ignorer la laideur du code ci-dessous (manque de DRY), quelqu'un peut-il suggérer un moyen plus fiable de se connecter?

Je crée une classe appelée EmailSet qui enverra un lot de quelques e-mails qui a une fonction membre send_emails:

class EmailSet(object): 
    ... 
    def send_emails(self): 
     try: # Connect to server 
      server = smtplib.SMTP(smtp_server_name_str, 25) 
      server.set_debuglevel(self.verbose) 
      server.ehlo() 
      for email in self.email_set: 
       try: # send 1st mail 
        logging.debug("Sending email to %r" % email.recipients)   
        response_dict = server.sendmail(email.fromaddr, email.recipients, email.msg_str()) 
        logging.info("Sent email to %r" % email.recipients)   
       except Exception as inst: 
        logging.error('RD: %r' % response_dict) 
        logging.error("Email Sending Failed") 
        logging.error("%r %s" % (type(inst), inst)) 
        try: # send second mail 
         logging.info("Second Attempt to send to %r" % email.recipients) 
         try: 
          server.rset() 
          server.quit() 
         except: 
          pass 
         time.sleep(60) # wait 60s 
         server = smtplib.SMTP(smtp_server_name_str, 25) 
         server.set_debuglevel(self.verbose) 
         server.ehlo() 
         response_dict = server.sendmail(email.fromaddr, email.recipients, email.msg_str()) 
         logging.info("Sent email to %r (2nd Attempt)" % email.recipients)   
        except Exception as inst: 
         try: 
          logging.error('RD: %r' % response_dict) 
         except: 
          pass 
         logging.error("Second Attempt Email Sending Failed") 
     except: 
      logging.debug("Can't connect to server") 
     finally: 
      logging.debug("Reseting and Quitting Server") 
      server.rset() 
      server.quit() 
      logging.debug("Successfully Quit Server") 
     return True 

Toute réflexion sur la façon de procéder de débogage cela? Le serveur stmp n'est pas maintenu par moi, mais devrait être bien entretenu (utilisé pour l'organisation d'une personne de ~ 10k). J'ai d'abord connecté et déconnecté du smtpserver après avoir envoyé chaque email, mais cela a produit plus d'erreurs que cette méthode.

Serait-il plus sûr d'utiliser/usr/sbin/sendmail plutôt que smtplib?

Répondre

1

Also would it be safer to use /usr/sbin/sendmail rather than smtplib?

Du point de vue de gérer une file d'attente de messages et une file d'attente-coureur pour relances. Oui, sendmail ou un autre MTA local peut gérer cela pour vous.

Any thoughts on how to proceed debugging this?

capture de paquets. Utilisez wireshark pour capturer le trafic SMTP, voir ce qui se passe. Vous avez beaucoup de gestion des exceptions qui ne vous montre pas nécessairement l'erreur exacte.