查找特定电子邮件的主题 - imap -python
Find the subject of a specific email - imap -python
我需要从名为 - xteam 的特定发件人那里找到主题为 'Reset Password' 的电子邮件,然后对该邮件进行一些进一步的操作
如果我这样做:
imap_host = 'imap.gmail.com'
imap_user = 'abc@gmail.com'
imap_pass = 'pass113'
imap = imaplib.IMAP4_SSL(imap_host)
imap.login(imap_user, imap_pass)
status, message = imap.search(None, '(SUBJECT "Reset Password")')
除了 xteam 之外,还有许多其他发件人发送了带有 'Reset Password' 主题
的电子邮件
然后我尝试了:
status, message = imap.search(None, '(FROM "help@xteam.com")')
但 xteam 发送了许多其他不相关的电子邮件
最后:
status, message = imap.search(None, '(AND (FROM "help@xteam.com") (SUBJECT "Reset Password"))')
这给出了错误:
imaplib.IMAP4.error: SEARCH 命令错误: BAD [b'无法解析命令']
哪种方法最好。
search
函数不解码括号内的字符串:它需要多个参数:
status, message = imap.search(None, 'FROM', "help@xteam.com", 'SUBJECT', "Reset Password")
AND
不需要指定,因为它是默认值,所以括号没有意义。 OR
运算符也不需要括号,因为它只需要两个操作数。你不能做 OR tag1 value1 tag2 value2 tag3 value3
因为那意味着 OR tag1 value1 tag2 value2 [AND] tag3 value3
。相反,你 OR OR tag1 value1 tag2 value2 tag3 value3
。由于只有两个操作数的规则,它被隐式括起来,就好像它是 OR ( OR tag1 value1 tag2 value2 ) tag3 value3
一样。这种波兰语表示法使 IMAP 解析器更易于编写,但代价是涉及 OR
的复杂查询难以正确执行。以下是搜索键的完整语法:
search = "SEARCH" [SP "CHARSET" SP astring] 1*(SP search-key)
但使用 imaplib
您可以将编码保留为 None
以获得默认值。您可以有多个
形式的搜索键
search-key = "ALL" / "ANSWERED" / "BCC" SP astring /
"BEFORE" SP date / "BODY" SP astring /
"CC" SP astring / "DELETED" / "FLAGGED" /
"FROM" SP astring / "KEYWORD" SP flag-keyword /
"NEW" / "OLD" / "ON" SP date / "RECENT" / "SEEN" /
"SINCE" SP date / "SUBJECT" SP astring /
"TEXT" SP astring / "TO" SP astring /
"UNANSWERED" / "UNDELETED" / "UNFLAGGED" /
"UNKEYWORD" SP flag-keyword / "UNSEEN" /
"DRAFT" / "HEADER" SP header-fld-name SP astring /
"LARGER" SP number / "NOT" SP search-key /
"OR" SP search-key SP search-key /
"SENTBEFORE" SP date / "SENTON" SP date /
"SENTSINCE" SP date / "SMALLER" SP number /
"UID" SP sequence-set / "UNDRAFT" / sequence-set /
"(" search-key *(SP search-key) ")"
如最后一行所示,您可以包含方括号,但它们必须是单独的参数。
我需要从名为 - xteam 的特定发件人那里找到主题为 'Reset Password' 的电子邮件,然后对该邮件进行一些进一步的操作
如果我这样做:
imap_host = 'imap.gmail.com'
imap_user = 'abc@gmail.com'
imap_pass = 'pass113'
imap = imaplib.IMAP4_SSL(imap_host)
imap.login(imap_user, imap_pass)
status, message = imap.search(None, '(SUBJECT "Reset Password")')
除了 xteam 之外,还有许多其他发件人发送了带有 'Reset Password' 主题
的电子邮件然后我尝试了:
status, message = imap.search(None, '(FROM "help@xteam.com")')
但 xteam 发送了许多其他不相关的电子邮件
最后:
status, message = imap.search(None, '(AND (FROM "help@xteam.com") (SUBJECT "Reset Password"))')
这给出了错误:
imaplib.IMAP4.error: SEARCH 命令错误: BAD [b'无法解析命令']
哪种方法最好。
search
函数不解码括号内的字符串:它需要多个参数:
status, message = imap.search(None, 'FROM', "help@xteam.com", 'SUBJECT', "Reset Password")
AND
不需要指定,因为它是默认值,所以括号没有意义。 OR
运算符也不需要括号,因为它只需要两个操作数。你不能做 OR tag1 value1 tag2 value2 tag3 value3
因为那意味着 OR tag1 value1 tag2 value2 [AND] tag3 value3
。相反,你 OR OR tag1 value1 tag2 value2 tag3 value3
。由于只有两个操作数的规则,它被隐式括起来,就好像它是 OR ( OR tag1 value1 tag2 value2 ) tag3 value3
一样。这种波兰语表示法使 IMAP 解析器更易于编写,但代价是涉及 OR
的复杂查询难以正确执行。以下是搜索键的完整语法:
search = "SEARCH" [SP "CHARSET" SP astring] 1*(SP search-key)
但使用 imaplib
您可以将编码保留为 None
以获得默认值。您可以有多个
search-key = "ALL" / "ANSWERED" / "BCC" SP astring /
"BEFORE" SP date / "BODY" SP astring /
"CC" SP astring / "DELETED" / "FLAGGED" /
"FROM" SP astring / "KEYWORD" SP flag-keyword /
"NEW" / "OLD" / "ON" SP date / "RECENT" / "SEEN" /
"SINCE" SP date / "SUBJECT" SP astring /
"TEXT" SP astring / "TO" SP astring /
"UNANSWERED" / "UNDELETED" / "UNFLAGGED" /
"UNKEYWORD" SP flag-keyword / "UNSEEN" /
"DRAFT" / "HEADER" SP header-fld-name SP astring /
"LARGER" SP number / "NOT" SP search-key /
"OR" SP search-key SP search-key /
"SENTBEFORE" SP date / "SENTON" SP date /
"SENTSINCE" SP date / "SMALLER" SP number /
"UID" SP sequence-set / "UNDRAFT" / sequence-set /
"(" search-key *(SP search-key) ")"
如最后一行所示,您可以包含方括号,但它们必须是单独的参数。