Domanda

Ho uno script python che invia alcuni gruppi di messaggi di posta elettronica (a indirizzi diversi con differenti contenuti) utilizzando smtplib periodicamente per tutta la giornata. Un po 'di frequente (dire circa 1 a 5 volte in cui l'invio di batch di più di una e-mail allo stesso tempo), ho un IOError (errno: tubo rotto). Provo reseting e smettere il server SMTP e quindi connettersi al server di nuovo e tento di inviare nuovamente, ma che fallisce sempre se non è riuscito per la prima volta (con la stessa eccezione). Il server SMTP è mantenuto dal collegio e deve essere affidabile (e permette di messaggi di posta elettronica loginless finchè siete sulla intranet).

Ignorando la bruttezza del codice qui sotto (mancanza di DRY), qualcuno può suggerire un modo più affidabile per la connessione?

creo una classe chiamata EmailSet che invierà un lotto di alcune email che ha una funzione membro 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

Ogni pensiero su come procedere debug questo? Il server SMTP non è gestito da me, anche se dovrebbe essere ben curato (utilizzato per ~ 10k organizzazione persona). Originariamente ho collegato e scollegato dalla SmtpServer dopo l'invio di ogni e-mail, ma che ha prodotto più errori di questo metodo.

Inoltre sarebbe più sicuro usare / usr / sbin / sendmail piuttosto che smtplib?

È stato utile?

Soluzione

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

Dal punto di vista della gestione di una coda di messaggi e una coda-runner per tentativi. Sì, sendmail o un altro MTA locale in grado di gestire questo per voi.

Any thoughts on how to proceed debugging this?

cattura

Packet. Usare Wireshark per catturare il traffico SMTP, vedere cosa sta succedendo. Hai un sacco di un'ampia gestione delle eccezioni che non è necessariamente che vi mostra l'errore esatto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top