具有多个OR参数的imap搜索语法

时间:2018-11-29 03:20:52

标签: ruby email imap

我正在使用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格式一致。

红宝石代码:构造搜索:

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

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

我需要一些帮助。

1 个答案:

答案 0 :(得分:2)

OR接受两个参数,既不多也少。 OR a b有效,(OR a b)有效,但(OR a)不起作用。那将是一个单参数或在一个单参数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之间的区别有点奇怪。)