通过message_id从imap检索单个电子邮件

时间:2014-05-01 15:48:34

标签: email imap

我正在使用ruby的Net :: IMAP对象,我可以使用以下任意一种方式检索一组电子邮件:

IMAP.all ..args..

IMAP.find ..args..

但是,无论如何都要检索特定的电子邮件,最好是使用message-id标题?

这是可能的,还是仅限于allfind并尝试使用更好的参数缩小结果集?

3 个答案:

答案 0 :(得分:3)

我不了解您在IMAP中使用的技术。但是,IMAP Specification提供了通过各种字段进行搜索的功能,包括电子邮件标头。您可以使用以下IMAP命令检索包含Message-Id <53513DD7.8090606@imap.local>的电子邮件的UID:

0005 UID SEARCH HEADER Message-ID <53513DD7.8090606@imap.local>

然后,这将为您提供如下响应:

* SEARCH 1
0005 OK UID completed

在我的情况下,带有Message-Id <53513DD7.8090606@imap.local>的电子邮件是第一个,因此SEARCH命令返回了匹配的1 UID。

然后,您可以使用UID FETCH命令检索消息,例如:

0006 UID FETCH 1 BODY[]

当然,如果您事先知道UID,则可以跳过UID SEARCH步骤,但这取决于您的应用程序。

答案 1 :(得分:1)

对于任何正在考虑这个问题的人来说,这些键都可以解决问题:

keys: ['HEADER', 'MESSAGE-ID', message_id]

答案 2 :(得分:0)

只是为了给出一个完整的红宝石解决方案,这对其他人有帮助。

请记住,如果邮件位于子文件夹中,您需要手动搜索每个文件夹以查找您所关注的邮件。

search_message_id = "<message-id-you-want-to-search-for>"

email = "youremail-or-imap-login"
password = "yourpassword"

imap = Net::IMAP.new("imap.example.com", 993, ssl: true)
imap.login(email, password)

imap.select("Inbox")
imap.search(["HEADER", "Message-ID", search_message_id]).each do |message_id|
  envelope = imap.fetch(message_id, "ENVELOPE")[0].attr["ENVELOPE"]
  puts "Id:\t#{envelope.message_id}"
  puts "From:\t#{envelope.from[0].mailbox}@#{envelope.from[0].host}"
  puts "To:\t#{envelope.to[0].mailbox}@#{envelope.to[0].host}"
  puts "Subject:\t#{envelope.subject}"
end

imap.logout
imap.disconnect

您可以通过执行以下操作更改上述内容以搜索所有子文件夹:

folders = imap.list("", "*")
folders.each do |folder|
  imap.select(folder.name)
  imap.search # ...
end