Gmail无法通过API发送线程回复

时间:2019-02-16 19:49:28

标签: python gmail gmail-api mime-message

我正在尝试通过Python中的Gmail API发送答复,但似乎无法让Gmail Web客户端对邮件进行处理。但是,它们正被线程化到Outlook中,这很奇怪。

这是我创建消息的方式:

def create_message(sender, to, subject, message_text, reply_to, thread_id, message_id):
    message = MIMEText(message_text, 'html')
    message['to'] = to
    message['from'] = sender
    message['subject'] = subject

    if reply_to:
        message['threadId'] = thread_id
        message['In-Reply-To'] = message_id
        message['References'] = message_id


    return {'raw': base64.urlsafe_b64encode(message.as_string())}

thread_idmessage_id都是MIME消息ID,其格式类似于<CAGvK4+WJmQGjg6R_QT4rJQApFPeH2xV14DnAVcksTtrc7giE8A@mail.gmail.com>

我尝试将message['threadId']threadId标头更改为createMessage返回的168f38ab8c831d11(类似于In-Reply-To)作为MIME邮件ID,但这也不起作用(实际上,这使邮件无法同时在Gmail Outlook中运行)。

感谢您的帮助!我已经尝试过设置这些标头的每一种组合,但我很幸运。谢谢!

1 个答案:

答案 0 :(得分:0)

对于以后遇到此问题的任何人,我都能弄清楚!

就像将threadId标头设置为message['threadId'],将In-Reply-To标头设置为电子邮件地址(在我的情况下为发送者),将References标头设置为MIME消息-ID足以使消息在接收者端进行线程传递,但在发送者端却无法传递。在很多情况下,这很好,但是我希望发件人的邮箱保持井井有条,因此有必要在其中进行线程化。

为了使消息通过发件人侧,您需要在threadId之外将raw作为附加参数添加到消息中:

{'raw': base64.urlsafe_b64encode(message.as_string()), 'threadId': thread_id}

现在,我的create_message函数如下所示:

def create_message(sender, to, subject, message_text, reply_to, thread_id, message_id):
    message = MIMEText(message_text, 'html')
    message['to'] = to
    message['from'] = sender
    message['subject'] = subject

    if reply_to:
        message['threadId'] = thread_id
        message['In-Reply-To'] = sender
        message['References'] = message_id

        return {'raw': base64.urlsafe_b64encode(message.as_string()), 'threadId': thread_id}

    return {'raw': base64.urlsafe_b64encode(message.as_string())}

位置:

  • reply_to是一个布尔值,指示正在创建的特定消息是对线程的答复还是全新消息
  • thread_idmessage['threadId'],看起来应该像168f809fbb5e9838
  • message_id是MIME邮件ID标头,应类似于<CAGvK4+W5G3KnYQmjvcpTJ=OCfvPQeWUHcLJG39JVGX4V3y1efA@mail.gmail.com>

我希望有人觉得这有帮助!