Sending HTML email using Python

前端 未结 10 1144
小鲜肉
小鲜肉 2020-11-22 04:57

How can I send the HTML content in an email using Python? I can send simple text.

相关标签:
10条回答
  • 2020-11-22 05:05

    You might try using my mailer module.

    from mailer import Mailer
    from mailer import Message
    
    message = Message(From="me@example.com",
                      To="you@example.com")
    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)
    
    0 讨论(0)
  • 2020-11-22 05:06

    Here is a simple way to send an HTML email, just by specifying the Content-Type header as 'text/html':

    import email.message
    import smtplib
    
    msg = email.message.Message()
    msg['Subject'] = 'foo'
    msg['From'] = 'sender@test.com'
    msg['To'] = 'recipient@test.com'
    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()
    
    0 讨论(0)
  • 2020-11-22 05:08

    Here's a working example to send plain text and HTML emails from Python using smtplib along with the CC and BCC options.

    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 = "from_email@domain.com"
          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': 'to_email@domain.com',
        'email_cc': 'cc_email@domain.com',
        'email_bcc': 'bcc_email@domain.com',
        'email_subject': 'Test message from python library',
        'email_body': '<h1>Hello World</h1>'
    }
    for t in ['plain', 'html']:
        send_mail(params, t)
    
    0 讨论(0)
  • 2020-11-22 05:16

    Here is a Gmail implementation of the accepted answer:

    import smtplib
    
    from email.mime.multipart import MIMEMultipart
    from email.mime.text import MIMEText
    
    # me == my email address
    # you == recipient's email address
    me = "my@email.com"
    you = "your@email.com"
    
    # 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()
    
    0 讨论(0)
  • 2020-11-22 05:16

    Simplest solution for sending email from Organizational account in Office 365:

    from O365 import Message
    
    html_template =     """ 
                <html>
                <head>
                    <title></title>
                </head>
                <body>
                        {}
                </body>
                </html>
            """
    
    final_html_data = html_template.format(df.to_html(index=False))
    
    o365_auth = ('sender_username@company_email.com','Password')
    m = Message(auth=o365_auth)
    m.setRecipients('receiver_username@company_email.com')
    m.setSubject('Weekly report')
    m.setBodyHTML(final_html_data)
    m.sendMessage()
    

    here df is a dataframe converted to html Table, which is being injected to html_template

    0 讨论(0)
  • 2020-11-22 05:17

    for python3, improve @taltman 's answer:

    • use email.message.EmailMessage instead of email.message.Message to construct email.
    • use email.set_content func, assign subtype='html' argument. instead of low level func set_payload and add header manually.
    • use SMTP.send_message func instead of SMTP.sendmail func to send email.
    • use with block to auto close connection.
    from email.message import EmailMessage
    from smtplib import SMTP
    
    # construct email
    email = EmailMessage()
    email['Subject'] = 'foo'
    email['From'] = 'sender@test.com'
    email['To'] = 'recipient@test.com'
    email.set_content('<font color="red">red color text</font>', subtype='html')
    
    # Send the message via local SMTP server.
    with smtplib.SMTP('localhost') as s:
        s.login('foo_user', 'bar_password')
        s.send_message(email)
    
    0 讨论(0)
提交回复
热议问题