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?