通过 IMAP 查找 Gmail url-ID

Posted

技术标签:

【中文标题】通过 IMAP 查找 Gmail url-ID【英文标题】:Find Gmail url-IDs via IMAP 【发布时间】:2010-12-13 19:59:37 【问题描述】:

我最喜欢的 Gmail 功能之一是能够为某些邮件的网址添加书签,如下所示:

https://mail.google.com/mail/#all/124c8f386d41fd3a

我想做的是编写一个脚本,通过 IMAP 访问我的 Gmail 帐户,并创建一个 html 页面,其中包含指向我感兴趣的每封邮件的链接。

但是,似乎无法从 IMAP 信封或 UUID 属性中找到“124c8f386d41fd3a”ID。我发现的所有消息 ID 和 uuid 格式不同,不能用于生成指向我的收件箱的有效链接。

有人知道如何在 IMAP 中找到这些 url-ID 吗?

-- Felix Geisendörfer aka the_undefined

PS:我正在使用 Ruby,我之前的尝试包括:

imap.fetch(message_id, "UID")
imap.fetch(message_id, "ENVELOPE")
imap.fetch(message_id, ...)

我尝试了ruby imap docs 中为 FetchData 列出的所有属性

【问题讨论】:

更新:我将赠送 25 美元的亚马逊礼券给任何知道答案的人! 贿赂> 嗨,我想知道您是否找到了解决此问题的方法 - 我也遇到了类似的情况,希望您有任何想法。基本上我需要某种方法来唯一地识别来自一个应用程序,并能够根据该方法查询它们。 不,我没有进一步了解这个 - 抱歉。 嘿,如果您仍在寻找答案,请在下面发布答案。我花了两天时间盯着这些数字,直到它击中我:) 我认为可以通过 IMAP 做到这一点(并且接受的答案不正确)。请参阅下面的答案。 【参考方案1】:

已经有一段时间了,但任何发现自己正在寻找此信息的人都应该阅读以下内容:

Gmail 为每封电子邮件提供唯一的邮件 ID,以便可以跨多个文件夹识别唯一的邮件。检索这个 通过 FETCH 上的 X-GM-MSGID 属性支持消息 ID 命令。消息 ID 是一个 64 位无符号整数,是 Web 界面中使用的 ID 十六进制字符串的十进制等效值和 Gmail API。

以下是检索 带有 FETCH 命令的消息的 X-GM-MSGID:

a006 FETCH 1 (X-GM-MSGID)
* 1 FETCH (X-GM-MSGID 1278455344230334865) a006 OK FETCH (Success)

X-GM-MSGID 属性也可用于 SEARCH 或 UID SEARCH 查找给定消息的序列号或 UID 的命令 Gmail 的邮件 ID。以下是通话记录的示例 使用 UID SEARCH 命令检索消息的 UID:

 a007 UID SEARCH X-GM-MSGID 1278455344230334865
 * SEARCH 1 a007 OK SEARCH (Success)

以上内容摘自以下来源:https://developers.google.com/gmail/imap_extensions?csw=1#access_to_the_gmail_unique_message_id_x-gm-msgid

【讨论】:

【参考方案2】:

似乎 google 链接 (https://mail.google.com/mail/#all/124c8f386d41fd3a) 指向整个对话。

IMAP 本身没有这样的功能(分组​​对话)

[更新]

X-GM-THRID Gmail 的 IMAP 扩展可以实现。

124c8f386d41fd3a 是 Gmail 的 十六进制线程 ID

您可以在此处阅读更多内容: http://www.limilabs.com/blog/create-gmail-url-id-via-imap

【讨论】:

我没有与 IMAP 结婚,但我确实需要某种方式来自动搜索整个收件箱并链接到匹配的项目。 你会认为也许所有的邮件都可能有相同的线程ID。 OP 提到尝试 Ruby,不幸的是 Ruby Net::IMAP 在解析包含此属性的响应时抛出异常。我通过修补 Ruby 的 NET::Imap 库来解决这个问题:gist.github.com/1404434【参考方案3】:

我认为接受的答案是不正确的(在这一点上,也许当时是正确的)。

如果您查看 atom 提要 (https://gmail.google.com/gmail/feed/atom),您会看到条目如下所示:

http://mail.google.com/mail?account_id=[EMAIL_ADDRESS]&message_id=1353f6fb621714da&view=conv&extsrc=atom

message_id 可能是十六进制的 X-GM-MSGID。您可以通过 IMAP 检索 X-GM-MSGID,因此您应该能够通过 IMAP 构建您想要的 URL,而无需使用 atom 提要。

【讨论】:

不幸的是,我认为这个 URL 中的 message_id 实际上是 X-GM-MSGID 而不是 IMAP/RFC822 ID。 @studgeek:是的,我就是这么说的。【参考方案4】:

Gmail 提供了一个属性:X-GM-THRID 用于线程 ID。

您可以使用imap fetch 函数来获取线程ID。

另请参阅文档here。

【讨论】:

您似乎有使用 IMAP 的经验,想联系一个项目,您有空吗? @3zzy 检查您的电子邮件。【参考方案5】:

我也在为此苦苦挣扎,然后我发现 UID 实际上与 Google Message ID 相同。

UID 是一个整数,而 Google 消息 ID 是它的十六进制版本。

不确定 ruby​​ 中的转换,但试试这个:Converting an integer to a hexadecimal string in Ruby

【讨论】:

【参考方案6】:

发现了一些东西。可能有人需要。我不知道怎么用ruby,我想用php,但是不知道怎么在php中扩展标准的imap函数。

openssl s_client -crlf -connect imap.gmail.com:993
. login username password
. select inbox
. FETCH 1 (X-GM-THRID)

你会得到这样的东西* 1 FETCH (X-GM-THRID 1327644190303473294) 接下来您需要将其从十进制转换为十六进制值:

<?php echo dechex(1327644190303473294); ?> //return 126cbd5b5f264e8e

【讨论】:

如何在 php imap 函数中使用 FETCH 1 (X-GM-THRID) 命令?有人知道吗? zend imap supports custom command and fetch 这是正确答案。 Gmail 在内部使用小数,但在浏览器中使用十六进制。 here you can find some about howto find Gmail url-IDs via IMAP php【参考方案7】:

实际上,获取消息直接链接的唯一官方方法是通过 gmail 提供的未读消息的 atom 提要 (https://gmail.google.com/gmail/feed/atom)... 唯一的困难是您必须进行身份验证,这在使用提要时并不常见,并且目前有 15 条新消息的限制,因此任何较新的消息都会“踢出”最旧的消息! 我希望他们很快会以其他方式提供它,无论是通过 IMAP 还是 API...

【讨论】:

我想这是正确的答案,不幸的是:)。我希望通过 IMAP 找到一种方法。【参考方案8】:

我使用一个名为Notify 的 Mac 菜单栏应用程序,它向我显示新的 GMail 消息,我可以双击这些消息以在 GMail 网站上找到它们。在我的 GMail 设置中,IMAP 和 POP 都被禁用了,所以这可能是解决方案。

将我带到消息的 URL 如下所示:

http://mail.google.com/mail/?fs=1&source=atom#all/124fb7xxxxx06752

(有些编辑,以防它是个人的)

我想知道source=atom 是否对您有帮助,因为此应用程序似乎可以访问您要查找的 ID。

【讨论】:

【参考方案9】:

这似乎是 GMail 的网络用户界面内部的东西。我可以想象这样的解决方法:

使用基本 HTML 模式登录 GMail,并获取会话 cookie

使用 curl、wget 或与此会话 cookie 类似的任何东西来获取页面

https://mail.google.com/mail/h?s=q&amp;q=2AE41111.1234123@gmail.com

“q=”部分之后的内容是来自 IMAP 的电子邮件的 Message-ID。

现在您可以从 HTML 中抓取所需邮件的“GMail ID”,搜索带有如下目标 URL 的链接:

?v=c&amp;s=q&amp;q=2AE41111.1234123%40gmail.com&amp;th=124ae57b77769275

“th”之后的部分是你需要的。

讨厌,可能效率很低,但这很可能是您最接近解决方案的地方。

如果你不是那么绝望,你可以使用搜索 URL,它以最简单的形式,使用标准 UI,如下所示:

https://mail.google.com/mail/#search/2AE41111.1234123@gmail.com

最后一部分是Message-ID头域的值。这样,您会得到一个搜索结果,但您仍然需要单击它才能查看。

【讨论】:

好的,对于 message-id 的搜索是可以接受的。给我发电子邮件/PM,我会送你一张 15 美元的礼券,以获得最干净的部分解决方案,好吗? 请注意,您实际上需要在搜索中使用rfc822msgid: 关键字。所以实际的 URL 是https://mail.google.com/mail/u/0/#search/rfc822msgid%3A2AE41111.1234123@gmail.com

以上是关于通过 IMAP 查找 Gmail url-ID的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在通过 IMAP 连接到 Gmail 时收到“需要 Web 登录”消息?

使用 PHP 通过 IMAP 连接到 Gmail - SSL 上下文失败

在 API 中查找 Gmail 暂停日期

使用 IMAP(javamail API)从 gmail 访问电子邮件

使用 c# .net 库检查来自 gmail 服务器的 IMAP 消息 [关闭]

在 javascript/node.js 中连接到 Gmail IMAP API