2016-05-16 18 views
0

Wir führen ein Skript über Nacht, um E-Mails an eine Reihe von Menschen in unserem Unternehmen zu senden. Vor ein paar Tagen wurde die Verbindung für eine lange Zeit offen gehalten und endete schließlich mit einem Zeitlimit. Seitdem konnten wir nicht denselben Code auf demselben Computer verwenden, um eine Verbindung zum Exchange-SMTP-Server herzustellen. Django ist so konfiguriert, dass es genau die gleichen Einstellungen verwendet, auf demselben Server läuft und weiterhin Fehler-E-Mails versendet. Darüber hinaus können wir den gleichen Code auf einem anderen Server ausführen und trotzdem eine Verbindung herstellen und E-Mails senden. Ich bin völlig verwirrt hinsichtlich der Ursachen und möglichen Lösungen.Python SMTPLib kann sich nicht mehr authentifizieren, aber django kann immer noch E-Mails auf demselben Rechner senden

Tl; dr:

  • Python smtplib verwendete vor auf diesem Server vor einem Timeout ein paar Tage gut zu funktionieren
  • Django können E-Mails aus dem gleichen Server mit der gleichen Authentifizierungs Info
  • Der schicken gleicher Code mit dem gleichen Anmeldedatum authentifiziert noch, wenn auf einem anderen Server läuft

E-Mail-Anschluss:

class Email_Connect(object): 
    def __init__(self): 
     self.user = "mydomain\myuser" 
     self.pwd = "mypassword" 
     self.send_from = '[email protected]' 
     self.local_hostname = socket.getfqdn() 

    def smtp_conn(self,server='myrelay.mycompany.net'): 
     self.c = smtplib.SMTP(server, local_hostname=self.local_hostname) 
     self.c.set_debuglevel(1) 
     self.c.ehlo() 
     self.c.starttls() 
     self.c.ehlo() 
     self.c.login(self.user, self.pwd) 

Der Code wird wie so genannt:

emailer = common.Email_Connect() 
emailer.smtp_conn() 
emailer.send_email(send_to,msg_subject,msg_body,None,attachment) 
emailer.close() 

Django Mail-Einstellungen (funktioniert prima auf der gleichen Maschine):

DEFAULT_FROM_EMAIL = '[email protected]' 
SERVER_EMAIL = '[email protected]' 
EMAIL_USE_TLS = True 
EMAIL_HOST = "myrelay.mycompany.net" 
EMAIL_HOST_USER = "myuser" 
EMAIL_HOST_PASSWORD = "mypassword" 

Und hier ist die vollständige Debug-Ausgabe den Code ausgeführt wird:

(production) c:\site\production\web\core>python program_replication.py 
(21, 'send spool email reports') 
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
send: 'ehlo mycomputer.mycompany.net\r\n' 
reply: '250-smtp.mycompany.net Hello [10.1.*.*]\r\n' 
reply: '250-SIZE 31457280\r\n' 
reply: '250-PIPELINING\r\n' 
reply: '250-DSN\r\n' 
reply: '250-ENHANCEDSTATUSCODES\r\n' 
reply: '250-STARTTLS\r\n' 
reply: '250-AUTH\r\n' 
reply: '250-8BITMIME\r\n' 
reply: '250-BINARYMIME\r\n' 
reply: '250-CHUNKING\r\n' 
reply: '250-XEXCH50\r\n' 
reply: '250 XSHADOW\r\n' 
reply: retcode (250); Msg: smtp.mycompany.net Hello [10.1.*.*] 
SIZE 31457280 
PIPELINING 
DSN 
ENHANCEDSTATUSCODES 
STARTTLS 
AUTH 
8BITMIME 
BINARYMIME 
CHUNKING 
XEXCH50 
XSHADOW 
send: 'STARTTLS\r\n' 
reply: '220 2.0.0 SMTP server ready\r\n' 
reply: retcode (220); Msg: 2.0.0 SMTP server ready 
send: 'ehlo mycomputer.mycompany.net\r\n' 
reply: '250-smtp.mycompany.net Hello [10.1.*.*]\r\n' 
reply: '250-SIZE 31457280\r\n' 
reply: '250-PIPELINING\r\n' 
reply: '250-DSN\r\n' 
reply: '250-ENHANCEDSTATUSCODES\r\n' 
reply: '250-AUTH\r\n' 
reply: '250-8BITMIME\r\n' 
reply: '250-BINARYMIME\r\n' 
reply: '250-CHUNKING\r\n' 
reply: '250-XEXCH50\r\n' 
reply: '250 XSHADOW\r\n' 
reply: retcode (250); Msg: smtp.mycompany.net Hello [10.1.*.*] 
SIZE 31457280 
PIPELINING 
DSN 
ENHANCEDSTATUSCODES 
AUTH 
8BITMIME 
BINARYMIME 
CHUNKING 
XEXCH50 
XSHADOW 
ERROR: No suitable authentication method found. replication module send spool email reports failed to run 

Antwort

0

So stellt sich heraus, dass das Problem durch Exchange Windows-Authentifizierung erwartet ra verursacht wird als ein LOGIN-Befehl. Ich habe zufällig die login() Zeile kommentiert und kann nun erfolgreich E-Mails senden.

Ich weiß immer noch nicht, warum dieser Code erfolgreich ausgeführt wurde und plötzlich nicht mehr funktioniert, aber die Lösung besteht darin, alles so zu belassen, wie es ist, und einen Anmeldebefehl zu beenden.