使用Gmail API发送邮件回复

3

我正在尝试回复一封发给自己的电子邮件,该邮件的主题是“测试功能”。 我有一个名为subject()的函数,它返回以下主题、消息ID和线程ID (“测试功能”,“DEFxmu7HPSRAti50ki2i6PK_DOOPLwMm5fiR+_dPkcOR7mep7hQ@mail.gmail.com”,“166e2507fc661924”)

我的完整代码如下:

def create_message(sender, to, message_id, thread_id, subject, message_text):
    message = MIMEText(message_text)
    message['from'] = sender
    message['to'] = to
    message['In-Reply-To'] = message_id
    message['References'] = message_id
    message['threadId'] = thread_id
    message['subject'] = subject

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

def send_message(service, user_id, message):
    message = (service.users().messages().send(userId="me", 
    body=message).execute())
    print('Message Id: %s' % message['id'])
    return message

def send_email(orders):
    SCOPES = 'https://mail.google.com/'
    credentials = auth.get_user_oauth2_credentials(scopes=SCOPES, 
                                                   client_id='xxxxx', 
                                                   client_secret='xxxxxx')
    service = discovery.build('gmail','v1', credentials=credentials)
    message_text = orders[0]
    created_message = create_message('th14@gmail.com','th14@gmail.com', 
        subject()[1],subject()[2], subject()[0], message_text)
    send_message(service, 'me', created_message)

send_email(['Msg Received'])

它发送了电子邮件,但不是发送到所需的线程,而只是发送了一封新邮件。

请缩进您的代码。 - Faquarl
2个回答

3
你需要在create_message函数的返回值中添加threadId
return {
    'raw': base64.urlsafe_b64encode(message.as_string().encode()).decode(),
    'threadId':thread_id
}

此外,删除 message['threadId'] = thread_id
def create_message(sender, to, message_id, thread_id, subject, message_text):
    message = MIMEText(message_text)
    message['from'] = sender
    message['to'] = to
    message['In-Reply-To'] = message_id
    message['References'] = message_id
    message['subject'] = subject

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

现在只需调用send_message并传递从上述函数创建的消息: 假设subject()[1] = "$your_thread_id"
SCOPES = 'https://mail.google.com/'
credentials = auth.get_user_oauth2_credentials(scopes=SCOPES, 
                                                   client_id='xxxxx', 
                                                   client_secret='xxxxxx')
service = discovery.build('gmail','v1', credentials=credentials)
message_text = orders[0]
created_message = create_message('th14@gmail.com','th14@gmail.com', 
    subject()[1],subject()[2], subject()[0], message_text)
send_message(service, 'me', created_message)

2
谢谢你的帮助!对于其他可能感到困惑的人,需要补充一点,即在创建回复电子邮件时必须包括的“message_id”不是“message['id']”,而是(我认为相当令人困惑)“header['value']”,其中“header”是“message['headers']”中唯一的头部,其“header['name']”为“Message-ID”。这两个值非常不同。糟糕! - Juan Carlos Ortiz

1

根据此 文档, 您可以在插入发送消息的过程中将消息添加到线程中。

为了成为线程的一部分,消息或草稿必须满足以下条件:

  1. 您在请求中提供的 MessageDraft.Message 必须指定所需的 threadId。 2. 必须按照RFC 2822标准设置 ReferencesIn-Reply-To 标头。 3. Subject 标头必须匹配。

请查看此链接以获取更多参考资料:如何使用Gmail API发送回复邮件


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接