Email aus Python versenden mit Raspbery Pi

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
Reiner_Rosa
User
Beiträge: 2
Registriert: Montag 16. März 2020, 19:39

Hallo zusammen,
ich möchte mit Python eine Email versenden. Leider haben die Beiträge in diesem Forum mich hier nicht weitergebracht.
Ich möchte das Mail über meinen bestehenden Zugang (T-online) versenden.

Leider klappt das nicht.
Der Port und Password verwende ich auch in meinem Emailprogramm.

Hier mein Code:

import smtplib
GMAIL_USER = 'absender@t-line.de'
GMAIL_PASS = 'password'
SMTP_SERVER = 'securesmtp.t-online.de'
SMTP_PORT = 465
def send_email(recipient, subject, text):
smtpserver = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
#smtpserver.ehlo()
#smtpserver.starttls()
#smtpserver.ehlo()
smtpserver.login(GMAIL_USER, GMAIL_PASS)
header = 'To:' + empfaenger@web.de + '\n' + 'From: ' + GMAIL_USER
msg = header + '\n' + testtest + '\n\n'
smtpserver.sendmail(GMAIL_USER, 'empfaenger@web.de', msg)
smtpserver.quit()
send_email('absender@t-online.de', 'sub', 'this is text')

Das ist die Reaktion!

Traceback (most recent call last):
File "/home/pi/e_mail.py", line 16, in <module>
send_email('absender@t-online.de', 'sub', 'this is text')
File "/home/pi/e_mail.py", line 7, in send_email
smtpserver = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
File "/usr/lib/python3.5/smtplib.py", line 251, in __init__
(code, msg) = self.connect(host, port)
File "/usr/lib/python3.5/smtplib.py", line 337, in connect
(code, msg) = self.getreply()
File "/usr/lib/python3.5/smtplib.py", line 393, in getreply
raise SMTPServerDisconnected("Connection unexpectedly closed")
smtplib.SMTPServerDisconnected: Connection unexpectedly closed
>>>

Bin für jede Hilfe dankbar.
Ich habe es auch schon über einen anderen Server versucht. Gleiche Reaktion.
Daher vermute ich bei mir ein Grundsätzliches Kenntnisproblem.

Grüße
Reiner
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bei sowas wuerde ich nie selber direkt mit SMTP arbeiten, weil einen das den Verstand kosten kann. Ich wuerde erstmal marrow mailer ausprobieren, und dabei vor allem auf die SSL/TLS Verbindung achten.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Reiner_Rosa: Anmerkungen zum Quelltext: `GMAIL_*` in Namen die nichts mit GMail zu tun haben sind irreführend.

Abkürzungen in Namen vermeiden. Wenn man `PASSWORD` meint, nicht nur `PASS` schreiben, und `message` ist leichter lesbar und verständlicher als `msg`.

Beim Aufruf der Funktion wird "absender@t-online.de" als `recipient` übergeben, was ein bisschen irreführend ist.

Keines der drei Argumente der Funktion wird tatsächlich verwendet.

Bei ``header = 'To:' + empfaenger@web.de + '\n' + 'From: ' + GMAIL_USER`` sind die Namen `empfaenger` und `web` nicht definiert und führen zu einem `NameError`. Das der Compiler da nicht schon drüber stolpert liegt daran, das ``@`` ein Operator ist.

In der nächsten Zeile ist dann `testtest` undefiniert.

Zeichenketten mit ``+`` zusammenstückeln ist unübersichtlich und eher BASIC als Python. In Python gibt es dafür Zeichenkettenformatierung mit der `format()`-Methode und ab Python 3.6 f-Zeichenkettenliterale.

Auch wenn die Reihenfolge der Header keine Rolle spielt, würde ich "From" vor "To" setzen. Zwischen "To:" und dem Wert sollte ein Leerzeichen gesetzt werden.

Zwischen den Headern und dem Text erwartet SMTP eine Leerzeile. Du setzt die nach dem Text.

Zwischenstand (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python3
import smtplib

SMTP_USER = "absender@t-online.de"
SMTP_PASSWORD = "password"
SMTP_SERVER = "securesmtp.t-online.de"
SMTP_PORT = 465


def send_email(recipient, subject, text):
    with smtplib.SMTP(SMTP_SERVER, SMTP_PORT) as smtp_server:
        # smtp_server.starttls()
        smtp_server.login(SMTP_USER, SMTP_PASSWORD)
        headers = f"From: {SMTP_USER}\nTo: {recipient}\nSubject: {subject}\n"
        smtp_server.sendmail(SMTP_USER, recipient, f"{headers}\n{text}")


if __name__ == "__main__":
    send_email("empfaenger@web.de", "subject", "this is text")
Ich würde aber auch eine Bibliothek empfehlen die einem den ganzen Low-Level-Kram abnimmt um den man sich beim SMTP-Protokoll und erstellen einer Nachricht nach RFC2822 sonst selbst kümmern muss.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Reiner_Rosa
User
Beiträge: 2
Registriert: Montag 16. März 2020, 19:39

Zuerst mal ein Danke für die schnelle Reaktion.
Welche Bibliothek könnte ich denn nehmen?
Gruss
Reiner
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Habe ich doch erwaehnt. Marrow Mailer.
Antworten