Sending HTML email using Python

前端 未结 10 1145
小鲜肉
小鲜肉 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:21

    Actually, yagmail took a bit different approach.

    It will by default send HTML, with automatic fallback for incapable email-readers. It is not the 17th century anymore.

    Of course, it can be overridden, but here goes:

    import yagmail
    yag = yagmail.SMTP("me@example.com", "mypassword")
    
    html_msg = """<p>Hi!<br>
                  How are you?<br>
                  Here is the <a href="http://www.python.org">link</a> you wanted.</p>"""
    
    yag.send("to@example.com", "the subject", html_msg)
    

    For installation instructions and many more great features, have a look at the github.

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

    Here is my answer for AWS using boto3

        subject = "Hello"
        html = "<b>Hello Consumer</b>"
    
        client = boto3.client('ses', region_name='us-east-1', aws_access_key_id="your_key",
                          aws_secret_access_key="your_secret")
    
    client.send_email(
        Source='ACME <do-not-reply@acme.com>',
        Destination={'ToAddresses': [email]},
        Message={
            'Subject': {'Data': subject},
            'Body': {
                'Html': {'Data': html}
            }
        }
    
    0 讨论(0)
  • 2020-11-22 05:23

    From Python v2.7.14 documentation - 18.1.11. email: Examples:

    Here’s an example of how to create an HTML message with an alternative plain text version:

    #! /usr/bin/python
    
    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.
    s = smtplib.SMTP('localhost')
    # sendmail function takes 3 arguments: sender's address, recipient's address
    # and message to send - here it is sent as one string.
    s.sendmail(me, you, msg.as_string())
    s.quit()
    
    0 讨论(0)
  • 2020-11-22 05:28

    Here's sample code. This is inspired from code found on the Python Cookbook site (can't find the exact link)

    def createhtmlmail (html, text, subject, fromEmail):
        """Create a mime-message that will render HTML in popular
        MUAs, text in better ones"""
        import MimeWriter
        import mimetools
        import cStringIO
    
        out = cStringIO.StringIO() # output buffer for our message 
        htmlin = cStringIO.StringIO(html)
        txtin = cStringIO.StringIO(text)
    
        writer = MimeWriter.MimeWriter(out)
        #
        # set up some basic headers... we put subject here
        # because smtplib.sendmail expects it to be in the
        # message body
        #
        writer.addheader("From", fromEmail)
        writer.addheader("Subject", subject)
        writer.addheader("MIME-Version", "1.0")
        #
        # start the multipart section of the message
        # multipart/alternative seems to work better
        # on some MUAs than multipart/mixed
        #
        writer.startmultipartbody("alternative")
        writer.flushheaders()
        #
        # the plain text section
        #
        subpart = writer.nextpart()
        subpart.addheader("Content-Transfer-Encoding", "quoted-printable")
        pout = subpart.startbody("text/plain", [("charset", 'us-ascii')])
        mimetools.encode(txtin, pout, 'quoted-printable')
        txtin.close()
        #
        # start the html subpart of the message
        #
        subpart = writer.nextpart()
        subpart.addheader("Content-Transfer-Encoding", "quoted-printable")
        #
        # returns us a file-ish object we can write to
        #
        pout = subpart.startbody("text/html", [("charset", 'us-ascii')])
        mimetools.encode(htmlin, pout, 'quoted-printable')
        htmlin.close()
        #
        # Now that we're done, close our writer and
        # return the message body
        #
        writer.lastpart()
        msg = out.getvalue()
        out.close()
        print msg
        return msg
    
    if __name__=="__main__":
        import smtplib
        html = 'html version'
        text = 'TEST VERSION'
        subject = "BACKUP REPORT"
        message = createhtmlmail(html, text, subject, 'From Host <sender@host.com>')
        server = smtplib.SMTP("smtp_server_address","smtp_port")
        server.login('username', 'password')
        server.sendmail('sender@host.com', 'target@otherhost.com', message)
        server.quit()
    
    0 讨论(0)
提交回复
热议问题