通过Python Gmail API发送包含双尖括号的电子邮件

4 投票
1 回答
1631 浏览
提问于 2025-04-18 18:02

我想用Python通过Gmail API发送邮件,但我总是收到以下错误信息:<HttpError 400 when requesting https://www.googleapis.com/gmail/v1/users/me/messages/send?alt=json returned "Invalid value for .....">

我尝试了各种方法,最后发现这个错误是在我邮件中包含两个尖括号('<<'和'>>')时发生的(见例子)。我尝试了很多方法来处理这些文本,但我觉得问题可能出在我使用了'raw'这个选项……不过'raw'是谷歌示例中唯一的方式。

有没有其他方法可以通过Gmail API发送邮件?换句话说,我该怎么做才能在文本中包含尖括号并成功发送邮件呢?
谢谢!

我现在的代码如下(来自谷歌的示例代码):

import base64
from email.mime.audio import MIMEAudio
from email.mime.base import MIMEBase
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import mimetypes
import os

from apiclient import errors

(...other code...)
SendMessage(service, "me", CreateMessage("me", sender, "<<NOT OK>> " + action, "TEST!"))
(...other code...)

def SendMessage(service, user_id, message):
    """Send an email message.

    Args:
    service: Authorized Gmail API service instance.
    user_id: User's email address. The special value "me"
    can be used to indicate the authenticated user.
    message: Message to be sent.

    Returns:
    Sent Message.
    """
    try:
        # print message
        message = service.users().messages().send(userId=user_id, body=message).execute()
        print '<mail> Message SEND (Id: %s' % message['id'] + ')'
        return message
    except errors.HttpError, error:
        print 'An error occurred (SendMessage): %s' % error


def CreateMessage(sender, to, 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 base64 encoded email object.
    """

    print "<mail> send to: " + to
    print "<mail> subject: " + subject
    print "<mail> message: " + message_text

    message = MIMEText(message_text)
    message['to'] = to
    message['from'] = sender
    message['subject'] = subject
    return {'raw': base64.b64encode(message.as_string())}

1 个回答

5

你需要使用:

base64.urlsafe_b64encode(message.as_string())

这里用的是安全的URL base64 字母表,否则你的 'raw' 字段里会出现无效字符。具体可以参考:https://developers.google.com/gmail/api/v1/reference/users/messages/send

撰写回答