如何搜索主题包含数字的电子邮件

How to search for email where the subject contains numbers

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

示例...我有一个电子邮件标题,如“您收到了 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 内容,我只想知道标题(如我之前解释的)是否存在,所以我可以做剩下的事情,有什么办法可以更有效地做到这一点?

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

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)

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

BODY.PEEK 方法不会修改邮件的标志(而只是 BODY 会将邮件标记为已读等)。

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