Mails mit smtplib über smtp Server verschicken (tls)

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
psyalex
User
Beiträge: 26
Registriert: Samstag 17. November 2007, 22:10
Wohnort: München

Hallo,

ich versuche über einen smtp Server der tls verlangt Emails zu verschicken. Beim login erhalte ich die folgende Fehlermeldung.

Code: Alles auswählen

  
...
File "testmailer.py", line 42, in sendMail
    smtp.login(user,pw)
  File "/usr/local/lib/python2.4/smtplib.py", line 554, in login
    raise SMTPException("SMTP AUTH extension not supported by server.")
smtplib.SMTPException: SMTP AUTH extension not supported by server.
das Skript sieht etwa so aus

Code: Alles auswählen

smtp=smtplib.SMTP(server)	
smtp.starttls()
smtp.helo()
smtp.login(user,pw)
Weiß jemand woran das Problem liegen könnte? (Python 2.4.4 auf Suse 9.3; 2.5.1 unter Windows produziert aber den selben Fehler)

Viele Grüße, Alex.
Zuletzt geändert von psyalex am Montag 19. November 2007, 13:21, insgesamt 1-mal geändert.
BlackJack

Nur geraten: Schon mal die Zeilen 3 und 4 vertauscht.
psyalex
User
Beiträge: 26
Registriert: Samstag 17. November 2007, 22:10
Wohnort: München

Schon mal die Zeilen 3 und 4 vertauscht.
das habe ich eben mal ausprobiert, macht aber leider keinen Unterschied.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Bist du dich sicher, dass dein Server sowohl STARTTLS als auch SMTP AUTH unterstützt?

Kannst du mit `netcat` ganz einfach herausfinden:

Code: Alles auswählen

leonidas@halmanfloyd ~ $ netcat a.mx.projectdream.org 25
220 a.mx.projectdream.org ESMTP Postfix NO UCE/UBE
EHLO comerr.xivilization.net
250-a.mx.projectdream.org
250-PIPELINING
250-SIZE
250-ETRN
250-STARTTLS
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250 8BITMIME
QUIT
221 Bye
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
psyalex
User
Beiträge: 26
Registriert: Samstag 17. November 2007, 22:10
Wohnort: München

Bist du dich sicher, dass dein Server sowohl STARTTLS als auch SMTP AUTH unterstützt?

Kannst du mit `netcat` ganz einfach herausfinden:

Code: Alles auswählen

220 [hier steht der Servername] Microsoft ESMTP MAIL Service, Version: 6.0.3790.3959 ready at  Mon, 19 Nov 2007 17:44:07 +0100
Das ist die erste Ausgabezeile von netcat, danach hängt sich netcat auf und es kommt keine Antwort mehr.
Zuletzt geändert von psyalex am Freitag 23. November 2007, 13:43, insgesamt 1-mal geändert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

SMTP AUTH + STARTTLS ist nicht gleich "sichere Authentifizierung". Das Bezieht sich lediglich auf STMP AUTH, denn da gibt es LOGIN und PLAIN, welche "unsicher" sind und "CRAM-MD5", welches als sicher gilt.

Achja, ich habe vergessen zu erwähnen, dass du in `netcat` das `EHLO` und `QUIT` selbst eintippen musst, daher hängt der Server nicht, sondern wartet auf deine Eingabe.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
psyalex
User
Beiträge: 26
Registriert: Samstag 17. November 2007, 22:10
Wohnort: München

Hallo Leonidas,
Achja, ich habe vergessen zu erwähnen, dass du in `netcat` das `EHLO` und `QUIT` selbst eintippen musst, daher hängt der Server nicht, sondern wartet auf deine Eingabe.
Auch wenn ich EHLO eingebe kommt keine Antwort mehr vom Server. Warum weiß ich nicht. Das EHLO über das Python Skript liefert die folgende Rückmeldung

Code: Alles auswählen

reply: '250-TURN\r\n'
reply: '250-SIZE\r\n'
reply: '250-ETRN\r\n'
reply: '250-PIPELINING\r\n'
reply: '250-DSN\r\n'
reply: '250-ENHANCEDSTATUSCODES\r\n'
reply: '250-8bitmime\r\n'
reply: '250-BINARYMIME\r\n'
reply: '250-CHUNKING\r\n'
reply: '250-VRFY\r\n'
reply: '250-TLS\r\n'
reply: '250-STARTTLS\r\n'
reply: '250-X-LINK2STATE\r\n'
reply: '250-XEXCH50\r\n'
reply: '250 OK\r\n'
Ich vermute, dass der SMPT Server STARTTLS unterstütz, die sichere Authentifizierung aber nicht (zumindest ist das beim dazugehörigen IMAP Server der Fall). Mir scheint, dass der Sever einen Login braucht aber keine Authentifizierung. Kann das sein? Wie kann ich das denn über die smtplib einstellen? In der Dokumentation der smtplib habe ich keine Funktion gefunden, die das macht. Der Fehler wird in der smtplib geworfen noch befor die Entscheidung für cram_md5 oder plain fällt.

Mit Thunderbird funktioniert der Mailversand Problemlos mit der Einstellung "Benutzername und Passwort verwenden" sowie "TLS, wenn möglich"

Gruß, Alex.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

psyalex hat geschrieben:Ich vermute, dass der SMPT Server STARTTLS unterstütz, die sichere Authentifizierung aber nicht (zumindest ist das beim dazugehörigen IMAP Server der Fall). Mir scheint, dass der Sever einen Login braucht aber keine Authentifizierung. Kann das sein?
Ja, das ist durchaus möglich. STARTTLS sollte er auf jeden Fall können, wenn man sich die Ausgabe anguckt.
psyalex hat geschrieben:Wie kann ich das denn über die smtplib einstellen? In der Dokumentation der smtplib habe ich keine Funktion gefunden, die das macht. Der Fehler wird in der smtplib geworfen noch befor die Entscheidung für cram_md5 oder plain fällt.
Doku? Du lässt einfach das Login weg.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
psyalex
User
Beiträge: 26
Registriert: Samstag 17. November 2007, 22:10
Wohnort: München

Ohne Login kommt die folgende Fehlermeldung:

Code: Alles auswählen

Client does not have permission to send mail to this Server
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Was du machen kannst, ist dir von Thunderbird das Wire-Log (also was über die Leitung geschickt wird zu holen) und nachgucken, was der in welcher Reihenfolge wie macht.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
psyalex
User
Beiträge: 26
Registriert: Samstag 17. November 2007, 22:10
Wohnort: München

Hallo Leonidas,

mit Hilfe des Thunderbird Logfiles (http://www.mozilla.org/quality/mailnews ... .html#imap) konnte ich das Problem nun lösen. Thunderbird verschickt vor und nach dem Starttls ein EHLO. In der ersten EHLO Antwort steht nichts von Authentifizierung. In der zweiten dann schon.

Code: Alles auswählen

...
0[274a88]: SMTP Response: 250-AUTH LOGIN
0[274a88]: SMTP Response: 250-AUTH=LOGIN
...
Mit meinem Skript schick ich jetzt auch zwei EHLOs und das bringt die smtplib scheinbar dazu das zweite zu berücksichtigen. Ich dachte das auch vorher schon mal ausprobiert zu haben, da muss aber gleichzeitig noch ein anderes Problem vorgelegen haben.

Vielen Dank für die Unterstützung!

Gruß, Alex.
Carsten22
User
Beiträge: 8
Registriert: Mittwoch 21. Februar 2007, 00:38

Hallo,
ich habe mich auch daran versucht, ein Programm zu schreiben, dass Mails verschicht.

Der Server läuft über TLS. Mein Programm sieht wie folgt aus:

Code: Alles auswählen

#!/usr/bin/python

# Eine Mail verschicken mit Python

import time, smtplib
from email.MIMEText import MIMEText

msg = MIMEText(
            _text = 'Hallo',
            _subtype = "plain",
            _charset = "UTF-8"
        )
msg['From'] = "auto_mailer@blablabla"
msg['To'] = "@web.de"
msg['Subject'] = 'Test'
# Datum nach RFC 2822 Internet email standard.
msg['Date'] = time.strftime("%a, %d %b %Y %H:%M:%S +0000",time.gmtime())
msg['User-Agent'] = "PyLucid (Python v2.5)" 

s = smtplib.SMTP('server.eu:587')
s.starttls()
s.helo()
s.login('usr', 'psw')
s.sendmail(msg['From'], msg['To'],msg.as_string())
s.close()
Ich bekomme folgende Fehlermeldung:

Code: Alles auswählen

  File "/usr/lib/python2.5/smtplib.py", line 554, in login
    raise SMTPException("SMTP AUTH extension not supported by server.")
smtplib.SMTPException: SMTP AUTH extension not supported by server.
Gerade das mit dem helo habe ich noch nicht so ganz verstanden. Kann mir da vielleicht jemand weiterhelfen?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Naja, SMTP AUTH und STARTTLS gibts erst ab ESMTP, also musst du statt HELO ein EHLO schicken.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Carsten22
User
Beiträge: 8
Registriert: Mittwoch 21. Februar 2007, 00:38

Vielen Dank. Läuft super. Ich mußte aber ehlo() auch zweimal aufrufen. Warum das so ist, kann man hier nachlesen:
http://docs.python.org/lib/SMTP-objects.html

Code: Alles auswählen

s = smtplib.SMTP('server.eu:587')
s.ehlo()
s.starttls()
s.ehlo()
s.login('user', 'psw')
s.sendmail(msg['From'], msg['To'],msg.as_string())
s.close()
Antworten