Probleme mit smtplib

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
beginnerM99
User
Beiträge: 1
Registriert: Donnerstag 1. Februar 2024, 11:14

Hallo Ihr Lieben,

ich möchte mit Python eine E-Mail versenden . Das ist mein Code:

#send email
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
server = smtplib.SMTP('smtp.ionos.de', 465)
try:
name="Mein Name" #You need to fill the name here
server.connect('smtp.ionos.de', 465)
server.starttls()
server.ehlo()
server.login("info@test.de","Passwort")
TOADDR = "test@web.de"
FromADDR = "info@test.de"
msg = MIMEMultipart('alternative')
msg['Subject'] = "Testbetreff"
msg['From'] = FromADDR
msg['To'] = TOADDR
#The below is email body
html = """\
<html>
<body>
<p><span style="color: rgb(0,0,0);">Dear {0},</span></p>
<p>
your email body
</p>
<p>Kind Regards,<br />
Your name ....
</p>
</body>
</html>
""".format(name.split()[0])
msg.attach(MIMEText(html, 'html'))
server.sendmail(FromADDR, TOADDR, msg.as_string())
except Exception as e:
# Print any error messages to stdout
print(e)
finally:
server.quit()



Ich erhalte folgenden Fehler wenn ich es ausführe:
Traceback (most recent call last):
File "C:\Users\MeinName\Downloads\emailsendenTest3.py", line 5, in <module>
server = smtplib.SMTP('smtp.ionos.de', 465)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Program Files\Python312\Lib\smtplib.py", line 255, in __init__
(code, msg) = self.connect(host, port)
^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Program Files\Python312\Lib\smtplib.py", line 343, in connect
(code, msg) = self.getreply()
^^^^^^^^^^^^^^^
File "C:\Program Files\Python312\Lib\smtplib.py", line 405, in getreply
raise SMTPServerDisconnected("Connection unexpectedly closed")
smtplib.SMTPServerDisconnected: Connection unexpectedly closed



Ich verwende Python 3.12
Benutzeravatar
grubenfox
User
Beiträge: 433
Registriert: Freitag 2. Dezember 2022, 15:49

Laut Python-Doku (https://docs.python.org/3/library/smtplib.html#index-0) gibt es auch noch eine Klasse SMTP_SSL.

Probiere doch mal

Code: Alles auswählen

server = smtplib.SMTP_SSL('smtp.ionos.de', 465)
anstelle von

Code: Alles auswählen

server = smtplib.SMTP('smtp.ionos.de', 465)
Benutzeravatar
DeaD_EyE
User
Beiträge: 1022
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

https://www.ionos.de/hilfe/e-mail/allge ... -und-smtp/

Es wird SSL/TLS benötigt.


Port 465: explizites TLS.
Port 587: TLS nach ehlo() und starttls()

Beim Port 465 ist die Verbindung von Anfang an verschlüsselt.
Beim Port 587 wird erst unverschlüsselt verbunden und dann eine verschlüsselte Verbindung durch starttls() initiiert.

Bei diesem Server wird explizites TLS benötigt, d.h. von Anfang an ist die Verbindung verschlüsselt.
Dafür die Klasse SMTP_SSL verwenden.

Code: Alles auswählen

import smtplib


server = smtplib.SMTP_SSL("smtp.ionos.de", 465)

Für das Versenden von E-Mails nutze ich lieber emails.
Aber es ist auch nicht verkehrt zu lernen, wie eine E-Mail zusammengesetzt ist.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
__blackjack__
User
Beiträge: 13123
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@beginnerM99: Anmerkungen zum Quelltext:

Die Ausnahmebehandlung ist nicht sinnvoll. Da wird Information weggeworfen die zur Fehlersuche nützlich ist. Wenn man Ausnahmen nicht sinnvoll behandeln kann, lässt man es einfach sein, und lässt sich Python darum kümmern.

Die `SMTP`-Objekte sind Kontextmanager, also ``with`` statt ``try``/``finally`` zum Aufräumen.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).

Namen sollten keine kryptischen Abkürzungen enthalten oder gar nur daraus bestehen. Der Name soll dem Leser vermitteln was der Wert dahinter im Programm bedeutet, nicht zum rätseln zwingen.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

TEMPLATE = """\
<html>
  <body>
    <p><span style="color: black;">Dear {0},</span></p>
    <p>
      your email body
    </p>
    <p>
      Kind Regards,<br />
      Your name ....
    </p>
  </body>
</html>
"""


def main():
    name = "Mein Name"
    recipient_email_address = "test@web.de"
    sender_email_address = "info@test.de"
    #
    # TODO Multipart/Alternativ mit nur einem Part ist weder Multipart noch
    #   gibt's Alternativen.
    #
    message = MIMEMultipart("alternative")
    message["Subject"] = "Testbetreff"
    message["From"] = sender_email_address
    message["To"] = recipient_email_address
    message.attach(
        MIMEText(TEMPLATE.format(name.split(maxsplit=1)[0]), "html")
    )
    with smtplib.SMTP_SSL("smtp.ionos.de") as server:
        server.connect("smtp.ionos.de", 465)
        server.login("info@test.de", "Passwort")
        server.sendmail(
            sender_email_address, recipient_email_address, message.as_string()
        )


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten