在 Ruby Net::IMAP 中选择邮箱“已发送邮件”或“所有邮件”
Posted
技术标签:
【中文标题】在 Ruby Net::IMAP 中选择邮箱“已发送邮件”或“所有邮件”【英文标题】:Select mailbox "sent mail" or "all mail" in Ruby Net::IMAP 【发布时间】:2011-07-08 09:23:47 【问题描述】:我正在尝试在 Ruby 中使用 Net::IMAP 来搜索我发送的所有邮件,但我无法选择收件箱以外的任何邮件。
imap.select('INBOX')
工作正常,但是
imap.select('Mail/sent-mail')
如 Net::IMAP 文档中所示,我给出了“未知邮箱”。
顺便说一句,这是与 gmail 一起使用的。
我还尝试在 imap.search() 中添加“in”、“anywhere”,但没有解析。
当前代码:
imap.select('INBOX')
now = Time.now.localtime - 1209600 #two weeks
since = now.day.to_s() + "-" + Date::MONTHNAMES[now.month] + "-" + now.year.to_s()
puts "since"
puts since
begin
mail_ids = imap.search(["FROM", "me", "SINCE", since])
mail_ids.each do |id|
text = imap.fetch(id, 'BODY[HEADER.FIELDS (SUBJECT)]').to_s.split("").second.chop
puts text
end
end
【问题讨论】:
【参考方案1】:“已发送邮件”文件夹因提供商而异。 Gmail 的“已发送邮件”文件夹名为“[Gmail]/Sent Mail
”。改为选择它,它会起作用。
imap.select('[Gmail]/Sent Mail')
仅供参考,Gmail 的系统文件夹如下:
INBOX
[Gmail]/All Mail
[Gmail]/Drafts
[Gmail]/Sent Mail
[Gmail]/Spam
[Gmail]/Starred
[Gmail]/Trash
【讨论】:
请注意,这些文件夹名称已本地化。您可以使用 XLIST 命令获取文件夹类型。 美女,一直在找这个,谢谢!那么,无论语言如何,我如何选择所有邮件? 发出XLIST "" *
命令并选择返回的带有\AllMail
标记的命令。
这个系统文件夹列表在 Perl 中也适用于我。谢谢。 :-)【参考方案2】:
您可以通过以下方式找到所有文件夹的名称:
imap.list('*', '*')
Gmail 文件夹名称将根据用户选择的语言而变化。以西班牙语为例:
“[Gmail]/All”邮件将是“[Gmail]/Todos”
【讨论】:
美女,一直在找这个,谢谢!那么,无论语言如何,我如何选择所有邮件?imap_cli.list('', '*').select |k| k[:attr].include?(:All) .first
怎么样?【参考方案3】:
我发现以下内容很有帮助(ruby 2.0.0-p195)
# list all folders
imap.list '', '%'
【讨论】:
【参考方案4】:不要使用LIST "" *
。你们许多人最终拥有数千个邮箱。使用 LIST "" %
。如果你只对children/subfolders
感兴趣,你可以做imap.list '', '%/%'
之类的imap.list '', '%/%/%'
仅列出父文件夹,深度为 1。
C: RUBY0002 LIST "" "%"
S: * LIST (\HasNoChildren) "/" Calendar
S: * LIST (\HasNoChildren) "/" Contacts
S: * LIST (\HasNoChildren) "/" "Deleted Items"
S: * LIST (\HasNoChildren) "/" Drafts
S: * LIST (\Marked \HasChildren) "/" INBOX
S: * LIST (\HasNoChildren) "/" Journal
S: * LIST (\HasNoChildren) "/" "Junk E-Mail"
S: * LIST (\HasNoChildren) "/" Notes
S: * LIST (\HasNoChildren) "/" Outbox
S: * LIST (\HasNoChildren) "/" "Sent Items"
S: * LIST (\HasNoChildren) "/" Tasks
S: RUBY0002 OK LIST completed.
列出孩子。深度2。
C: RUBY0003 LIST "" "%/%"
S: * LIST (\HasNoChildren) "/" INBOX/subfolder
S: RUBY0003 OK LIST completed.
C: RUBY0004 SELECT INBOX/subfolder
S: * 2 EXISTS
S: * 0 RECENT
S: * FLAGS (\Seen \Answered \Flagged \Deleted \Draft $MDNSent)
S: * OK [PERMANENTFLAGS (\Seen \Answered \Flagged \Deleted \Draft $MDNSent)] Permanent flags
S: * OK [UIDVALIDITY 37286] UIDVALIDITY value
S: * OK [UIDNEXT 6] The next unique identifier value
S: RUBY0004 OK [READ-WRITE] SELECT completed.
【讨论】:
以上是关于在 Ruby Net::IMAP 中选择邮箱“已发送邮件”或“所有邮件”的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 ruby 的 net/imap 库读取电子邮件的正文?