Gmail API 正在 sending/insert 调用后检索邮件 ID

Gmail API retrieving Message ID after sending/insert call

在通过 API 的响应插入消息后,有没有办法获取消息 ID?

例如,我使用以下代码插入初始消息:

try:
    message1 = service.users().messages().insert(userId='me', body=temp).execute()
    print(f"{message1['id']} / {message1['threadId']}")

在这个API调用中,idthreadId是一样的,都是16个字符的字符串。

接下来,我插入一个回复。我进入 Gmail 以获取邮件 ID (<...@mail.gmail.com>) 并在下一个 API 调用中进行如下设置:

message['subject'] = 'Re: test subject'
message['In-Reply-To'] = '<...@mail.gmail.com>'
message['References'] = '<...@mail.gmail.com>'
encoded_message = urlsafe_b64encode(message.as_bytes())
temp = {'raw': encoded_message.decode(), 'labelIds': ['UNREAD'], 'threadId': 'THREAD_ID_FROM_FIRST_CALL'}
try:
    message1 = service.users().messages().insert(userId='me', body=temp).execute()
    print(f"{message1['id']} / {message1['threadId']}")

此处的响应与上面的 message1['id'] 不同,但 message1['threadId'] 相同,因此它在 Gmail 中显示正确。但是,有没有办法轻松地从响应正文中获取消息 ID?我可以从 message1['id'] 生成它吗?另一种方法是让第二个 API 找到 message1['id'] 的消息,但我试图避免这种情况。谢谢。

不幸的是,除了进行新的 API 调用外,没有直接的方法来检索新的 messageId

这是因为messageIdthreadId是两个不同的参数:

  • messageId对应线程中的消息

  • threadId对应线程

因此,如果您在线程中插入一个新回复,threadId 显然与原始消息关联的回复相同,但新回复将收到一个新 ID - a messageId 这是唯一的,与与之关联的 threadId 无关。

您可以改为按 threadId 对所有线程进行分组,并在此基础上插入新回复。这样,您还可以轻松地从该特定线程收集 messageId

参考