通过IMAP查找Gmail的URL-ID

26

我最喜欢的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文档中列出的FetchData属性。


更新:我会给任何知道答案的人一张25美元的亚马逊礼品卡!</bribe> - Felix Geisendörfer
嗨,我想知道你是否找到了解决这个问题的方法 - 我也遇到了类似的困境,希望能听取你的任何想法..基本上,我需要一种方法来唯一地识别应用程序中的电子邮件,并能够根据该方法查询它们。 - Ali
不好意思,我没有在这方面取得更进一步的成果。 - Felix Geisendörfer
嘿,如果你还在找答案,我已经在下面发布了。我花了两天时间盯着这些数字,直到恍然大悟 :) - jamie-wilson
我认为可以通过IMAP来实现它(并且被接受的答案是不正确的)。请看下面我的回答。 - kkurian
9个回答

18

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

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

此外,请查看此处的文档


您似乎具有 IMAP 经验,希望就一个项目与您联系,您是否有时间? - eozzy
@3zzy 请检查您的电子邮件。 - Vivek Goel

11

发现了一个东西,可能会对某些人有用。我不知道如何使用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)命令?有人知道吗? - Shkur
1
Zend Imap支持自定义命令和获取。 - Shkur
1
这是正确的答案。Gmail在内部使用十进制,但在浏览器中使用十六进制。 - Marek Stój
在这里,您可以找到有关如何通过IMAP PHP查找Gmail URL-ID的一些内容:http://mrshkur.blogspot.com/2011/09/usrbinpythonprint-hello.html - Shkur

6

我并不是非得使用IMAP,但我确实需要一种自动搜索整个收件箱并链接到匹配项的方法。 - Felix Geisendörfer
你可能会认为所有的邮件都有相同的线程 ID。 - reconbot
OP提到尝试了Ruby,不幸的是,当解析包含此属性的响应时,Ruby Net::IMAP会抛出异常。我通过修补Ruby的NET::Imap库来解决这个问题: https://gist.github.com/1404434 - Wojtek Kruszewski

3
这似乎是Gmail Web UI内部的问题。我可以想象一种解决方法如下:
  • 使用基本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”标头字段的值。这样,您就可以获得单个搜索结果,但仍需要单击才能查看。


好的,对于消息ID的搜索还算可以接受。给我发电子邮件/私信,我会为最干净的部分解决方案送您一张15美元的礼品券,好吗? - Felix Geisendörfer
1
请注意,您实际上需要在搜索中使用rfc822msgid:关键字。因此,实际的URL将是https://mail.google.com/mail/u/0/#search/rfc822msgid%3A2AE41111.1234123@gmail.com - studgeek

2

我认为目前被接受的答案是错误的(也许在以前是正确的)。

如果你查看原子源(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 Feed。


很遗憾,我认为此URL中的message_id实际上是X-GM-MSGID而不是IMAP/RFC822 ID。 - studgeek
@studgeek:没错,就是我说的。 - kkurian

1

我使用一款名为Notify的 Mac 菜单栏应用程序,它会显示新的 GMail 消息,并且我可以双击以跳转到 GMail 网站上查看这些消息。我的 GMail 设置中同时禁用了 IMAP 和 POP,因此可能就是这里的解决方案。

带我进入消息页面的 URL 如下:

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

我想知道 source=atom 是否对你有帮助,因为这个应用程序似乎可以访问你正在寻找的ID。


1

已经有一段时间了,但任何需要这些信息的人都应该阅读这篇文章:

Gmail provides a unique message ID for each email so that a unique message may be identified across multiple folders. Retrieval of this message ID is supported via the X-GM-MSGID attribute on the FETCH command. The message ID is a 64-bit unsigned integer and is the decimal equivalent for the ID hex string used in the web interface and the Gmail API.

The following is an example transcript of a call to retrieve the X-GM-MSGID of a message with the FETCH command:

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

The X-GM-MSGID attribute may also be used in the SEARCH or UID SEARCH commands to find the sequence numbers or UID of a message given Gmail's message ID. The following is an example transcript of a call to retrieve the UID of a message using the UID SEARCH command:

 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

0

我也曾经为此苦恼,后来发现 UID 实际上就是 Google 消息 ID。

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

不确定如何在 Ruby 中进行转换,但可以尝试这个:在 Ruby 中将整数转换为十六进制字符串


-2

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


我猜那应该是正确的答案,不幸的是 : )。我本来希望能通过IMAP的方式来完成它。 - Felix Geisendörfer

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