【问题标题】:How to search for email where the subject contains numbers如何搜索主题包含数字的电子邮件
【发布时间】:2022-10-24 22:06:30
【问题描述】:

我正在寻找标题包含我收到多少比特币的信息的电子邮件,但由于电子邮件标题中有一个数字,我想要一种方法来查找数字等于或大于该数字的电子邮件。

示例...我有一个电子邮件标题,例如“您收到 0.000666703 BTC”,但我想搜索标题是这个还是有大量数字,例如,我希望能够找到这个标题“您收到0.002719281 BTC”,但我不想找到这个“您收到 0.000028181 BTC”,因为数字较小。我希望能够找到大于或等于第一个标题的数字,这是我的代码:

import imaplib                                       
import credentials                                   
import email
from bs4 import BeautifulSoup                                                                             
imap_ssl_host = 'imap.gmail.com'                     
imap_ssl_port = 993                                  
username = "myemail"          
password = "mypass"
server = imaplib.IMAP4_SSL(imap_ssl_host, imap_ssl_port)                                                                                                       
server.login(username, password)                     
server.select('INBOX')                               
typ, data = server.search(None, '(FROM "no-reply@coinbase.com" SUBJECT "You received 0,00066703 BTC" SINCE "24-Sep-2021")')                                         
for num in data[0].split():                           
 typ, data = server.fetch(num,'(RFC822)')             
 msg = email.message_from_bytes(data[0][1])     
 print(msg.get_payload(decode=True))                

主题的开头将始终是“您收到”,但之后有数字,字母将是 btc 和“BTC”的数量以及我在问题中的示例,但我怎样才能只提取数字?

控制台输出是 HTML 内容,我只想知道标题(就像我之前解释的那样)是否存在,所以我可以做剩下的事情,有什么方法可以更有效地做到这一点?

【问题讨论】:

  • 如果您只关心主题,您显然只需要获取主题。从您的示例中不清楚您是要搜索具有该主题的消息(在这种情况下,显然搜索返回的所有消息都是匹配的)还是更通用的。
  • 控制台输出是任何有效负载,不一定是 HTML(尽管如果所有消息都来自同一个发件人并且它们总是发送 HTML,则可能是结果)。
  • @tripleee 我明白了,我的问题是如何找到大于 0 的数字,例如,在电子邮件的标题中,你知道吗?
  • 如果您没有从该地址收到任何不相关的邮件,只需查找来自该发件人的所有邮件并检查其主题。如果您有更严格的标准,请再次edit您的问题以澄清实际问题是什么。
  • @tripleee我只想知道标题是否包含大于0的数字,例如HTML内容无关紧要,我只需要知道是否有这样的电子邮件

标签: python imaplib


【解决方案1】:

如果您只关心主题,则仅获取主题。

import imaplib
from email.parser import HeaderParser
from email.policy import default  # use Python >= 3.6 EmailMessage API

... 

parser = HeaderParser(policy=default)

server.select('INBOX')
typ, data = server.search(None, '(FROM "no-reply@coinbase.com" SUBJECT "You received" SINCE "24-Sep-2021")')
if typ == 'ok':
    for num in data[0].split():
       ok, fetched = server.fetch(num, '(BODY.PEEK[HEADER.FIELDS (SUBJECT)])')
       if ok == 'ok':
           subj = parser.parsestr(fetched[0][1].decode('us-ascii'))
           if not subj.startswith('Subject: You received'):
               continue
           try:
               amount = float(subj.split()[2])
           except IndexError, ValueError:
               continue
           if amount > 0.000666703:
               print('Message %i: %s', num, subj)

Subject: 标头是一个bytes 字符串,您至少必须为decode。但是,也可能有一个 MIME 包装(可能是 Subject: =?UTF-8?B?WW91IHJlY2VpdmVkIDAuMTIzIEJUQw==),您需要使用 email.parser.HeaderParser 方法或类似方法对其进行解码。界面有点乱(你真的希望有办法传递它bytes,这样你就不必单独decode)。

BODY.PEEK 方法不会修改消息的标志(而 BODY 会将消息标记为已读等)。

一些 IMAP 服务器支持更复杂的搜索语法(甚至可能是正则表达式),但我希望这应该是相当可移植和健壮的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 2023-03-09
    • 1970-01-01
    • 2011-12-02
    • 2012-09-10
    相关资源
    最近更新 更多