我正在使用ruby的Net :: IMAP对象,我可以使用以下任意一种方式检索一组电子邮件:
IMAP.all ..args..
或
IMAP.find ..args..
但是,无论如何都要检索特定的电子邮件,最好是使用message-id标题?
这是可能的,还是仅限于all
和find
并尝试使用更好的参数缩小结果集?
答案 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