How do I send HTML Formatted emails, through the gmail-api for python

前端 未结 2 480
不知归路
不知归路 2021-02-02 07:50

Using the sample code from the GMail API Example: Send Mail, and after following rules for authentication, it\'s simple enough to send a programmatically generated email, via a

相关标签:
2条回答
  • 2021-02-02 08:02

    After doing a lot of digging around, I started looking in to the python side of the message handling, and noticed that a python object is actually constructing the message to be sent for base64 encoding into the gmail-api message object constructor.

    See line 63 from above: message = MIMEText(message_text)

    The one trick that finally worked for me, after all the attempts to modify the header values and payload dict (which is a member of the message object), was to set (line 63):

    • message = MIMEText(message_text, 'html') <-- add the 'html' as the second parameter of the MIMEText object constructor

    The default code supplied by Google for their gmail API only tells you how to send plain text emails, but they hide how they're doing that. ala... message = MIMEText(message_text)

    I had to look up the python class email.mime.text.MIMEText object. That's where you'll see this definition of the constructor for the MIMEText object:

    • class email.mime.text.MIMEText(_text[, _subtype[, _charset]]) We want to explicitly pass it a value to the _subtype. In this case, we want to pass: 'html' as the _subtype.

    Now, you won't have anymore unexpected word wrapping applied to your messages by Google, or the Python mime.text.MIMEText object


    The Fixed Code

    def create_message(sender, to, cc, subject, message_text):
        """Create a message for an email.
    
        Args:
        sender: Email address of the sender.
        to: Email address of the receiver.
        subject: The subject of the email message.
        message_text: The text of the email message.
    
        Returns:
        An object containing a base64url encoded email object.
        """
        print(sender + ', ' + to + ', ' + subject + ', ' + message_text)
        message = MIMEText(message_text,'html')
        message['to'] = to
        message['from'] = sender
        message['subject'] = subject
        message['cc'] = cc
        pprint(message)
        return {'raw': base64.urlsafe_b64encode(message.as_string())}
    
    0 讨论(0)
  • 2021-02-02 08:02

    Try this:

        def CreateMessage(emailSubject, emailTo, emailFrom, message_body, emailCc, html_content=None):
            try:
                message = MIMEMultipart('alternative')
                message['to'] = emailTo
                message['from'] = emailFrom
                message['subject'] = emailSubject
                message['Cc'] = emailCc
                body_mime = MIMEText(message_body, 'plain')
                message.attach(body_mime)
                if html_content:
                    html_mime = MIMEText(html_content, 'html')
                    message.attach(html_mime)
                return {
                    'raw': base64.urlsafe_b64encode(
                        bytes(
                            message.as_string(),
                            "utf-8")).decode("utf-8")}
            except Exception as e:
                print('Error in CreateMessage()', e)
                return '400'
    
    0 讨论(0)
提交回复
热议问题