如何使用 Gmail 发送回复 API
How To Send A Reply With Gmail API
我有两个 gmail 帐户我创建了一个包含五封邮件的线程,并在此页面上使用 gmail gapi 检索了它们 https://developers.google.com/gmail/api/v1/reference/users/threads/get。
这是我得到的:
如您所见,尽管 ID 标识完全相同的字母,但它们并不匹配。为什么会这样,如何获取统一的id?
P.S。我这样做的真正原因是我需要使用 gmail API 发送对消息的回复,但为此,您需要知道您回复的消息的 ID。如果我用我拥有的 id(不是接收者拥有的消息 id)回复消息,它只会发送一条 'new' 消息。
如何使用 Gmail 发送回复 API?
提前致谢。
与 docs say 一样,如果您尝试发送回复并希望将电子邮件发送到线程,请确保:
Subject
header匹配
References
和 In-Reply-To
header 遵循 RFC 2822 标准。
如果您想自己执行此操作,您可以获得要回复的消息的 Subject
、References
和 Message-ID
-header:
要求:
userId = me
id = 14fd1c555a1352b7 // id of the message I want to respond to.
format = metadata
metadataHeaders = Subject,References,Message-ID
GET https://www.googleapis.com/gmail/v1/users/me/messages/14fd1c555a1352b7?format=metadata&metadataHeaders=Subject&metadataHeaders=References&metadataHeaders=Message-ID
响应:
{
"id": "14fd1c555a1352b7",
"threadId": "14fd1c52911f0f64",
"labelIds": [
"SENT",
"INBOX",
"IMPORTANT",
"UNREAD"
],
"snippet": "Next level dude 2015-09-15 18:10 GMT+02:00 Emil Tholin <emtholin@gmail.com>: wow 2015-09-15 18:",
"historyId": "575289",
"internalDate": "1442333414000",
"payload": {
"mimeType": "multipart/alternative",
"headers": [
{
"name": "In-Reply-To",
"value": "<CADsZLRyzVPLRQuTthGSHKMCXL7Ora1jNW7h0jvoNgR+hU59BYg@mail.gmail.com>"
},
{
"name": "References",
"value": "<CADsZLRxZDUGn4Frx80qe2_bE5H5bQhgcqGk=GwFN9gs7Z_8oZw@mail.gmail.com> <CADsZLRyzVPLRQuTthGSHKMCXL7Ora1jNW7h0jvoNgR+hU59BYg@mail.gmail.com>"
},
{
"name": "Message-ID", // This is the same for both users, as you were asking about.
"value": "<CADsZLRwQWzLB-uq4_4G2E64NX9G6grn0cEeO0L=avY7ajzuAFg@mail.gmail.com>"
},
{
"name": "Subject",
"value": "Re: Cool"
}
]
},
"sizeEstimate": 1890
}
为了遵循 RFC 2822 标准,我们将要响应的消息的 Message-ID
添加到 References
-header,并用 space 分隔. In-Reply-To
-header 也有我们要回复的消息的值。我们还将 Re:
添加到我们的 Subject
-header 以表明它是一个响应。
// Base64-encode the mail and make it URL-safe
// (replace "+" with "-", replace "/" with "_", remove trailing "=")
var encodedResponse = btoa(
"Content-Type: text/plain; charset=\"UTF-8\"\n" +
"MIME-Version: 1.0\n" +
"Content-Transfer-Encoding: 7bit\n" +
"References: <CADsZLRxZDUGn4Frx80qe2_bE5H5bQhgcqGk=GwFN9gs7Z_8oZw@mail.gmail.com> <CADsZLRyzVPLRQuTthGSHKMCXL7Ora1jNW7h0jvoNgR+hU59BYg@mail.gmail.com> <CADsZLRwQWzLB-uq4_4G2E64NX9G6grn0cEeO0L=avY7ajzuAFg@mail.gmail.com>\n" +
"In-Reply-To: <CADsZLRwQWzLB-uq4_4G2E64NX9G6grn0cEeO0L=avY7ajzuAFg@mail.gmail.com>\n" +
"Subject: Re:Cool\n" +
"From: sender@gmail.com\n" +
"To: reciever@gmail.com\n\n" +
"This is where the response text will go"
).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
$.ajax({
url: "https://www.googleapis.com/gmail/v1/users/me/messages/send?access_token=<USER_ACCESS_TOKEN>",
method: "POST",
contentType: "application/json",
data: JSON.stringify({
raw: encodedResponse
})
});
如您所见,这是手动操作的背后难题。您也可以只回复线程。但是,这可能不足以满足您的用例。
这样,您只需提供邮件和 threadId
,并确保 Subject
相同,Google 就会正确显示。
// Base64-encode the mail and make it URL-safe
// (replace "+" with "-", replace "/" with "_", remove trailing "=")
var encodedResponse = btoa(
"Content-Type: text/plain; charset=\"UTF-8\"\n" +
"MIME-Version: 1.0\n" +
"Content-Transfer-Encoding: 7bit\n" +
"Subject: Subject of the original mail\n" +
"From: sender@gmail.com\n" +
"To: reciever@gmail.com\n\n" +
"This is where the response text will go"
).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
$.ajax({
url: "https://www.googleapis.com/gmail/v1/users/me/messages/send?access_token=<USER_ACCESS_TOKEN>",
method: "POST",
contentType: "application/json",
data: JSON.stringify({
raw: encodedResponse,
threadId: "<THREAD_ID_OF_MESSAGE_TO_RESPOND_TO>"
})
});
@Tholle 的回答(谢谢!)是正确的,让我走上了正确的轨道,但在最近的变化之后:
https://gsuiteupdates.googleblog.com/2019/03/threading-changes-in-gmail-conversation-view.html
我不得不把他的两条路混为一谈。
在我的程序中,我必须回复一个主题,但如果我只包含 threadId(如 #2),则 Gmail 仅将新邮件放入回复者邮件中的主题中,而在邮件中原始发件人(也是 gmail)显示为新线程。
我通过将 threadId 和 headers“参考”以及“In-Reply-To”与上一条消息的 ID 一起解决。
我有两个 gmail 帐户我创建了一个包含五封邮件的线程,并在此页面上使用 gmail gapi 检索了它们 https://developers.google.com/gmail/api/v1/reference/users/threads/get。
这是我得到的:
如您所见,尽管 ID 标识完全相同的字母,但它们并不匹配。为什么会这样,如何获取统一的id?
P.S。我这样做的真正原因是我需要使用 gmail API 发送对消息的回复,但为此,您需要知道您回复的消息的 ID。如果我用我拥有的 id(不是接收者拥有的消息 id)回复消息,它只会发送一条 'new' 消息。
如何使用 Gmail 发送回复 API?
提前致谢。
与 docs say 一样,如果您尝试发送回复并希望将电子邮件发送到线程,请确保:
Subject
header匹配References
和In-Reply-To
header 遵循 RFC 2822 标准。
如果您想自己执行此操作,您可以获得要回复的消息的 Subject
、References
和 Message-ID
-header:
要求:
userId = me
id = 14fd1c555a1352b7 // id of the message I want to respond to.
format = metadata
metadataHeaders = Subject,References,Message-ID
GET https://www.googleapis.com/gmail/v1/users/me/messages/14fd1c555a1352b7?format=metadata&metadataHeaders=Subject&metadataHeaders=References&metadataHeaders=Message-ID
响应:
{
"id": "14fd1c555a1352b7",
"threadId": "14fd1c52911f0f64",
"labelIds": [
"SENT",
"INBOX",
"IMPORTANT",
"UNREAD"
],
"snippet": "Next level dude 2015-09-15 18:10 GMT+02:00 Emil Tholin <emtholin@gmail.com>: wow 2015-09-15 18:",
"historyId": "575289",
"internalDate": "1442333414000",
"payload": {
"mimeType": "multipart/alternative",
"headers": [
{
"name": "In-Reply-To",
"value": "<CADsZLRyzVPLRQuTthGSHKMCXL7Ora1jNW7h0jvoNgR+hU59BYg@mail.gmail.com>"
},
{
"name": "References",
"value": "<CADsZLRxZDUGn4Frx80qe2_bE5H5bQhgcqGk=GwFN9gs7Z_8oZw@mail.gmail.com> <CADsZLRyzVPLRQuTthGSHKMCXL7Ora1jNW7h0jvoNgR+hU59BYg@mail.gmail.com>"
},
{
"name": "Message-ID", // This is the same for both users, as you were asking about.
"value": "<CADsZLRwQWzLB-uq4_4G2E64NX9G6grn0cEeO0L=avY7ajzuAFg@mail.gmail.com>"
},
{
"name": "Subject",
"value": "Re: Cool"
}
]
},
"sizeEstimate": 1890
}
为了遵循 RFC 2822 标准,我们将要响应的消息的 Message-ID
添加到 References
-header,并用 space 分隔. In-Reply-To
-header 也有我们要回复的消息的值。我们还将 Re:
添加到我们的 Subject
-header 以表明它是一个响应。
// Base64-encode the mail and make it URL-safe
// (replace "+" with "-", replace "/" with "_", remove trailing "=")
var encodedResponse = btoa(
"Content-Type: text/plain; charset=\"UTF-8\"\n" +
"MIME-Version: 1.0\n" +
"Content-Transfer-Encoding: 7bit\n" +
"References: <CADsZLRxZDUGn4Frx80qe2_bE5H5bQhgcqGk=GwFN9gs7Z_8oZw@mail.gmail.com> <CADsZLRyzVPLRQuTthGSHKMCXL7Ora1jNW7h0jvoNgR+hU59BYg@mail.gmail.com> <CADsZLRwQWzLB-uq4_4G2E64NX9G6grn0cEeO0L=avY7ajzuAFg@mail.gmail.com>\n" +
"In-Reply-To: <CADsZLRwQWzLB-uq4_4G2E64NX9G6grn0cEeO0L=avY7ajzuAFg@mail.gmail.com>\n" +
"Subject: Re:Cool\n" +
"From: sender@gmail.com\n" +
"To: reciever@gmail.com\n\n" +
"This is where the response text will go"
).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
$.ajax({
url: "https://www.googleapis.com/gmail/v1/users/me/messages/send?access_token=<USER_ACCESS_TOKEN>",
method: "POST",
contentType: "application/json",
data: JSON.stringify({
raw: encodedResponse
})
});
如您所见,这是手动操作的背后难题。您也可以只回复线程。但是,这可能不足以满足您的用例。
这样,您只需提供邮件和 threadId
,并确保 Subject
相同,Google 就会正确显示。
// Base64-encode the mail and make it URL-safe
// (replace "+" with "-", replace "/" with "_", remove trailing "=")
var encodedResponse = btoa(
"Content-Type: text/plain; charset=\"UTF-8\"\n" +
"MIME-Version: 1.0\n" +
"Content-Transfer-Encoding: 7bit\n" +
"Subject: Subject of the original mail\n" +
"From: sender@gmail.com\n" +
"To: reciever@gmail.com\n\n" +
"This is where the response text will go"
).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
$.ajax({
url: "https://www.googleapis.com/gmail/v1/users/me/messages/send?access_token=<USER_ACCESS_TOKEN>",
method: "POST",
contentType: "application/json",
data: JSON.stringify({
raw: encodedResponse,
threadId: "<THREAD_ID_OF_MESSAGE_TO_RESPOND_TO>"
})
});
@Tholle 的回答(谢谢!)是正确的,让我走上了正确的轨道,但在最近的变化之后:
https://gsuiteupdates.googleblog.com/2019/03/threading-changes-in-gmail-conversation-view.html
我不得不把他的两条路混为一谈。
在我的程序中,我必须回复一个主题,但如果我只包含 threadId(如 #2),则 Gmail 仅将新邮件放入回复者邮件中的主题中,而在邮件中原始发件人(也是 gmail)显示为新线程。
我通过将 threadId 和 headers“参考”以及“In-Reply-To”与上一条消息的 ID 一起解决。