Senden Sie HTML-E-Mails mit Python

Lesezeit: 5 Minuten

Wie sende ich HTML-Inhalte per E-Mail mit Python? Ich kann einfache Texte verschicken.

  • Nur eine fette Warnung. Wenn Sie nicht-ASCII E-Mail mit Python < 3.0, erwägen Sie die Verwendung von E-Mail in Django. Es wickelt UTF-8 Zeichenfolgen richtig und ist auch viel einfacher zu bedienen. Du wurdest gewarnt 🙂

    – Anders Rune Jensen

    14. Dezember 2009 um 14:42 Uhr


  • Wenn Sie ein HTML mit Unicode senden möchten, siehe hier: stackoverflow.com/questions/36397827/…

    – Güttli

    11. April 2016 um 10:53 Uhr

Hier ist ein Gmail Umsetzung der akzeptierten Antwort:

import smtplib

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

# me == my email address
# you == recipient's email address
me = "[email protected]"
you = "[email protected]"

# Create message container - the correct MIME type is multipart/alternative.
msg = MIMEMultipart('alternative')
msg['Subject'] = "Link"
msg['From'] = me
msg['To'] = you

# Create the body of the message (a plain-text and an HTML version).
text = "Hi!\nHow are you?\nHere is the link you wanted:\nhttp://www.python.org"
html = """\
<html>
  <head></head>
  <body>
    <p>Hi!<br>
       How are you?<br>
       Here is the <a href="http://www.python.org">link</a> you wanted.
    </p>
  </body>
</html>
"""

# Record the MIME types of both parts - text/plain and text/html.
part1 = MIMEText(text, 'plain')
part2 = MIMEText(html, 'html')

# Attach parts into message container.
# According to RFC 2046, the last part of a multipart message, in this case
# the HTML message, is best and preferred.
msg.attach(part1)
msg.attach(part2)
# Send the message via local SMTP server.
mail = smtplib.SMTP('smtp.gmail.com', 587)

mail.ehlo()

mail.starttls()

mail.login('userName', 'password')
mail.sendmail(me, you, msg.as_string())
mail.quit()

  • Toller Code, es funktioniert bei mir, wenn ich eingeschaltet habe geringe sicherheit bei google

    – Towask

    25. Juni 2015 um 12:49 Uhr


  • Ich benutze ein Google anwendungsspezifisches Passwort mit python smtplib hat es funktioniert, ohne auf niedrige Sicherheit gehen zu müssen.

    – Jojo

    30. Juni 2015 um 22:48 Uhr

  • Für alle, die die obigen Kommentare lesen: Sie benötigen nur dann ein “App-Passwort”, wenn Sie zuvor die Bestätigung in zwei Schritten in Ihrem Gmail-Konto aktiviert haben.

    – Mugen

    11. Oktober 2018 um 16:21 Uhr

  • Gibt es eine Möglichkeit, etwas dynamisch in den HTML-Teil der Nachricht einzufügen?

    – Magma

    9. Mai 2020 um 13:59 Uhr

  • Irgendwie scheint nur der letzte angehängte Teil zu funktionieren.

    – Zobayer Hasan

    28. Juni 2021 um 20:28 Uhr

  • Verwenden Sie als Verbesserung dazu, wenn Sie zusätzlich einen Anhang senden möchten email.add_alternative() (genau wie bei dir email.set_content() um HTML hinzuzufügen, und fügen Sie dann mithilfe von einen Anhang hinzu email.add_attachment() (Das hat mich Ewigkeiten gekostet, um es herauszufinden)

    – Zilbert97

    30. Oktober 2020 um 20:26 Uhr

  • Das EmailMessage API war erst ab Python 3.6 offiziell verfügbar, wurde aber bereits in 3.3 als Alternative ausgeliefert. Neuer Code sollte dies unbedingt anstelle des alten verwenden email.message.Message Legacy-API, die die meisten Antworten hier leider immer noch vorschlagen. Alles mit MIMEText oder MIMEMultipart ist die alte API und sollte vermieden werden, es sei denn, Sie haben Legacy-Gründe.

    – Dreier

    8. Februar um 20:53 Uhr


Hier ist eine einfache Möglichkeit, eine HTML-E-Mail zu senden, indem Sie einfach den Content-Type-Header als „text/html“ angeben:

import email.message
import smtplib

msg = email.message.Message()
msg['Subject'] = 'foo'
msg['From'] = '[email protected]'
msg['To'] = '[email protected]'
msg.add_header('Content-Type','text/html')
msg.set_payload('Body of <b>message</b>')

# Send the message via local SMTP server.
s = smtplib.SMTP('localhost')
s.starttls()
s.login(email_login,
        email_passwd)
s.sendmail(msg['From'], [msg['To']], msg.as_string())
s.quit()

  • Dies ist eine nette einfache Antwort, praktisch für schnelle und schmutzige Skripte, danke. Übrigens kann man sich einfach auf die akzeptierte Antwort beziehen smtplib.SMTP() Beispiel, das tls nicht verwendet. Ich habe dies für ein internes Skript bei der Arbeit verwendet, wo wir ssmtp und einen lokalen Mailhub verwenden. Auch dieses Beispiel fehlt s.quit().

    – Mike S

    2. September 2015 um 14:42 Uhr


  • “mailmerge_conf.smtp_server” ist nicht definiert … sagt zumindest Python 3.6 …

    – ZEE

    27. Dezember 2017 um 20:47 Uhr

Sie könnten versuchen, meine zu verwenden Mailer Modul.

from mailer import Mailer
from mailer import Message

message = Message(From="[email protected]",
                  To="[email protected]")
message.Subject = "An HTML Email"
message.Html = """<p>Hi!<br>
   How are you?<br>
   Here is the <a href="http://www.python.org">link</a> you wanted.</p>"""

sender = Mailer('smtp.example.com')
sender.send(message)

  • Dies ist eine nette einfache Antwort, praktisch für schnelle und schmutzige Skripte, danke. Übrigens kann man sich einfach auf die akzeptierte Antwort beziehen smtplib.SMTP() Beispiel, das tls nicht verwendet. Ich habe dies für ein internes Skript bei der Arbeit verwendet, wo wir ssmtp und einen lokalen Mailhub verwenden. Auch dieses Beispiel fehlt s.quit().

    – Mike S

    2. September 2015 um 14:42 Uhr


  • “mailmerge_conf.smtp_server” ist nicht definiert … sagt zumindest Python 3.6 …

    – ZEE

    27. Dezember 2017 um 20:47 Uhr

Hier ist ein funktionierendes Beispiel zum Senden von Nur-Text- und HTML-E-Mails aus Python smtplib zusammen mit den CC- und BCC-Optionen.

https://varunver.wordpress.com/2017/01/26/python-smtplib-send-plaintext-and-html-emails/

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

def send_mail(params, type_):
      email_subject = params['email_subject']
      email_from = "[email protected]"
      email_to = params['email_to']
      email_cc = params.get('email_cc')
      email_bcc = params.get('email_bcc')
      email_body = params['email_body']

      msg = MIMEMultipart('alternative')
      msg['To'] = email_to
      msg['CC'] = email_cc
      msg['Subject'] = email_subject
      mt_html = MIMEText(email_body, type_)
      msg.attach(mt_html)

      server = smtplib.SMTP('YOUR_MAIL_SERVER.DOMAIN.COM')
      server.set_debuglevel(1)
      toaddrs = [email_to] + [email_cc] + [email_bcc]
      server.sendmail(email_from, toaddrs, msg.as_string())
      server.quit()

# Calling the mailer functions
params = {
    'email_to': '[email protected]',
    'email_cc': '[email protected]',
    'email_bcc': '[email protected]',
    'email_subject': 'Test message from python library',
    'email_body': '<h1>Hello World</h1>'
}
for t in ['plain', 'html']:
    send_mail(params, t)

  • Denken Sie, diese Antwort deckt alles ab. Tolle Verbindung

    – StachelMantis

    24. Oktober 2017 um 17:02 Uhr

1006130cookie-checkSenden Sie HTML-E-Mails mit Python

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy