在 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 库读取电子邮件的正文?

Ruby IMAP 库不解码邮件主题

手机qq邮箱已发邮件打不开图片怎么回事6

FOXMAIL 不能发邮件

foxmail为啥收取邮件不全,已发邮件只能收取9月30号之前的,近期的都搜不到

QQ邮箱已发送邮件图片自己无法预览会不会影响发送?在线等