Probleme bei E-Mail mit Python

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
PyTimmi

Hallo zusammen,

ich habe ein kleines Problem. Aktuell lese ich das Buch "Routinearbeiten mit Python automatisieren" und bin beim Versenden von E-Mails.

Das hier ist mein Code:

Code: Alles auswählen

import smtplib

server = smtplib.SMTP('mail.gmx.net', 587)
server.ehlo()
server.starttls()
benutzer = input('Benutzer: ')
passwort = input('Passwort: ')
server.login(benutzer,passwort)

sender = input('Sender: ')
empfaenger = input('Empfaenger: ')

server.sendmail(sender,
                empfaenger,
                'Subject: Testmail\n Dies ist ein Test!')

server.quit()
Leider bekomme ich immer wieder den Fehler "unauthorized sender"...
Und das verstehe ich nicht. Ich gebe die E-Mail-Adresse ein, die mit dem Konto verknüpft ist, das ich zum Login eingebe.
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

Wie lautet denn die genaue Fehlermeldung? Du kannst für die Session auch das loglevel auf debug setzen. Warum fragst du Benutzer und Sender ab? Der Absender sollte doch gleichzeitig der Benutzer sein?
When we say computer, we mean the electronic computer.
PyTimmi

sls hat geschrieben: Sonntag 16. Juni 2019, 07:33 Der Absender sollte doch gleichzeitig der Benutzer sein?
Ja und nein. Bei GMX kann man einem Konto mehrere Mail-Adressen zuordnen. Anfangs habe ich nur die ursprüngliche Mail-Adresse versucht. Also die, die dem Benutzer entspricht. Nachdem das nicht geklappt hat, habe ich mir zu dem Konto mal eine weitere Adresse angelegt. Das hat aber ebenso wenig funktioniert.
sls hat geschrieben: Sonntag 16. Juni 2019, 07:33 Wie lautet denn die genaue Fehlermeldung?
Die Fehlermeldung ist die hier:
smtplib.SMTPDataError: (554, b'Transaction failed\nUnauthorized sender address.')
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

Seitens Python ist bei deinem gezeigten Code alles korrekt (außer dass du dir für die SMTP-Session künftig noch das with-statement anschauen solltest).

Zum eigentlichen Problem würde ich mal versuchen via telnet oder sowas wie swaks versuchen, die Mail zu versenden. sendmail ändert grundsätzlich nichts an den Headern, ich kann mir aber gut vorstellen dass GMX Restriktionen implementiert hat wie so ein From-Header auszusehen hat.

Zeige doch bitte nochmal den Output deiner SMTP-Session wenn du das debug-level setzt.
When we say computer, we mean the electronic computer.
PyTimmi

Da steht leider nicht viel drin außer:

INFO:root:info
DEBUG:root:debug
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

Wenn du die Zeile "server.set_debuglevel(1)" einfügst sollte da deutlich mehr geloggt werden.
When we say computer, we mean the electronic computer.
PyTimmi


send: 'mail FROM:<xxx@gmx.de> size=38\r\n'
reply: b'250 Requested mail action okay, completed\r\n'
reply: retcode (250); Msg: b'Requested mail action okay, completed'
send: 'rcpt TO:<xxx@gmail.com>\r\n'
reply: b'250 OK\r\n'
reply: retcode (250); Msg: b'OK'
send: 'data\r\n'
reply: b'354 Start mail input; end with <CRLF>.<CRLF>\r\n'
reply: retcode (354); Msg: b'Start mail input; end with <CRLF>.<CRLF>'
data: (354, b'Start mail input; end with <CRLF>.<CRLF>')
send: b'Subject: Testmail\r\n Dies ist ein Test!\r\n.\r\n'
reply: b'554-Transaction failed\r\n'
reply: b'554 Unauthorized sender address.\r\n'
reply: retcode (554); Msg: b'Transaction failed\nUnauthorized sender address.'
data: (554, b'Transaction failed\nUnauthorized sender address.')
send: 'rset\r\n'
reply: b'250 OK\r\n'
reply: retcode (250); Msg: b'OK'
Traceback (most recent call last):
File "xxx\MailTest.py", line 20, in <module>
'Subject: Testmail\n Dies ist ein Test!')
File "xxx\Python\lib\smtplib.py", line 888, in sendmail
raise SMTPDataError(code, resp)
smtplib.SMTPDataError: (554, b'Transaction failed\nUnauthorized sender address.')



Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

Ich würde jetzt wirklich versuchen, dass mit einer simplen Telnet-Session manuell zu probieren. Da wird's unter Windows sicherlich auch ein Tool geben, so kannst du zumindest feststellen ob es wirklich am "mail FROM" liegt, oder ob der GMX-Server ein einfaches "From: " erwartet. Natürlich kann man auch den Support von GMX fragen.
When we say computer, we mean the electronic computer.
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Das ich roh SMTP gesprochen habe ist eine Weile her, aber was mir gerade so ins Auge sticht:

Was ist denn das für eine Größenangabe hinter "mail FROM"? Dieses size=38? Das kenne ich so nicht.
Und wo ist eigentlich der Header der Mail? Die Authentifizierung des Benutzers scheint ja zu klappen, erst das Übermitteln der Daten für die Mail schlägt fehl. Und für mich gehört in einen Mail-Header From, To, Date und Subject. Hier gibt es nur Subject.
Hinter der Subject-Zeile müssen auf jeden Fall 2 Newlines stehen. Nicht nur 1. Der Header wird durch eine Leerzeile vom Text der Mail getrennt.

@PyTimmi: Das Abfragen der Eingaben solltest du übrigens nicht erst tun, wenn der Server kontaktiert ist. Nicht dass es hier zu einem Timeout kommt.
Erst alle Daten sammeln, dann den Server kontaktieren und sie senden.

Ungetestet:

Code: Alles auswählen

import smtplib

user = input('Benutzer: ')
password = input('Passwort: ')
receiver = input('Empfaenger: ')
subject = input('Betreff: ')

message_text = f"""From: <{user}>
                   To: <{receiver}>
                   Subject: {subject}

                   Dies ist der Text"""

with smtplib.SMTP('mail.gmx.net', 587) as server:
    server.set_debuglevel(1)
    server.ehlo()
    server.starttls()
    server.login(user, password)

    server.sendmail(user, receiver, message_text)
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

sparrow hat geschrieben: Sonntag 16. Juni 2019, 21:36 Das ich roh SMTP gesprochen habe ist eine Weile her, aber was mir gerade so ins Auge sticht:

Was ist denn das für eine Größenangabe hinter "mail FROM"? Dieses size=38? Das kenne ich so nicht.
Und wo ist eigentlich der Header der Mail? Die Authentifizierung des Benutzers scheint ja zu klappen, erst das Übermitteln der Daten für die Mail schlägt fehl. Und für mich gehört in einen Mail-Header From, To, Date und Subject. Hier gibt es nur Subject.
Hinter der Subject-Zeile müssen auf jeden Fall 2 Newlines stehen. Nicht nur 1. Der Header wird durch eine Leerzeile vom Text der Mail getrennt.
Bei einigen MTAs gibt es die blöde Eigenschaft (Konfigurationsbedingt), dass sie zwar den "MAIL FROM" und "RCPT TO" Aufruf mit einem 200er zurückgeben, aber erst nach dem "DATA" gesetzt wurde die beiden ersteren Header auswerten und dann einen Fehler schmeißen. Das liegt u.a. daran dass Exchange-Server mit Outlook kein sofortiges "Nein" akzeptieren. Das könnte auch auf diesen Fall zutreffen.

Was du in ´message_text´ schreibst und an Headern setzt ist egal, dass ist ja nichts was auf der SMTP-Session läuft. Da könnte also auch "Bla tüt määh" stehen, und der MTA würde es zustellen, es sei denn der Smarthost hat hier irgendwelche Restriktionen wie er mit Mime-Headern umgeht bzw. generell was im Datenblock der SMTP-Session läuft.
When we say computer, we mean the electronic computer.
Antworten