通过 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&q=2AE41111.1234123@gmail.com
“q=”部分之后的内容是来自 IMAP 的电子邮件的 Message-ID。
现在您可以从 HTML 中抓取所需邮件的“GMail ID”,搜索带有如下目标 URL 的链接:
?v=c&s=q&q=2AE41111.1234123%40gmail.com&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 上下文失败
使用 IMAP(javamail API)从 gmail 访问电子邮件