Seite 1 von 1

Probleme mit smtplib

Verfasst: Donnerstag 1. Februar 2024, 11:26
von beginnerM99
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

Re: Probleme mit smtplib

Verfasst: Donnerstag 1. Februar 2024, 12:53
von grubenfox
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)

Re: Probleme mit smtplib

Verfasst: Samstag 3. Februar 2024, 15:10
von DeaD_EyE
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.

Re: Probleme mit smtplib

Verfasst: Montag 19. Februar 2024, 12:11
von __blackjack__
@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()