【问题标题】:imap search syntax with multiple OR arguments具有多个 OR 参数的 imap 搜索语法
【发布时间】:2019-05-01 01:33:20
【问题描述】:

我正在使用 Ruby 2.5.3 和邮件 gem (2.7.1)。我正在构建 IMAP 搜索命令来检索给定电子邮件地址列表和各种自日期的电子邮件。它是搜索电子邮件地址的逻辑或。

我正在使用这个 email_filter:

(OR (FROM a1@b.com SINCE 1-Oct-2018) (OR (FROM a2@b.com SINCE 10-Oct-2018) (OR (FROM a3@b.com SINCE 19-Oct-2018))))

这似乎与 RFC 3501 ABNR 表格一致。

ruby 代码:构建搜索:

search_options = { count: no_emails_to_process, what: :first, order: :asc, keys: email_filter}
Mail.find(search_options) do |mail, imap, uid, attrs| 
  etc ...

它引发了一个错误:

Error in IMAP command UID SEARCH: Missing argument

我认为语法不正确,因为将搜索限制为仅一个电子邮件地址可以正常工作。

我需要一些帮助。

【问题讨论】:

    标签: ruby email imap


    【解决方案1】:

    OR 接受两个参数,不多也不少。 OR a b 有效,(OR a b) 有效,但(OR a) 无效。那将是一个单一参数 OR 在一个单一参数 AND 内。当解析器遇到结束 AND 参数列表的 ) 时,解析器正在寻找 OR 的第二个参数。您查询的最后一部分是(OR (FROM a3@b.com SINCE 19-Oct-2018))

    你的意思可能是OR (FROM a1@b.com SINCE 1-Oct-2018) OR (FROM a2@b.com SINCE 10-Oct-2018) (FROM a3@b.com SINCE 19-Oct-2018)。在该表达式中,第一个 OR 接受两个参数,即 AND 和另一个 OR,第二个 OR 接受两个参数,这两个参数都是 AND。

    (我同意 OR 和 AND 之间的这种区别有点奇怪。)

    【讨论】:

    • 恕我直言,IMAP 中的 OR 语法不是很好。每个人(以及很多服务器实现)都弄错了。
    • 同意。搜索语法通常有点参差不齐,而 OR 可能是最差的。
    • 最简单的方法是构建一个表达式树,然后将其序列化。
    猜你喜欢
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    相关资源
    最近更新 更多