如何搜索主题包含数字的电子邮件
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 服务器支持更复杂的搜索语法(甚至可能是正则表达式),但我希望这应该具有合理的可移植性和健壮性。
我正在寻找标题包含我收到的比特币数量信息的电子邮件,但由于电子邮件标题中有一个数字,我想要一种方法来查找数字等于或大于该数字的电子邮件数.
示例...我有一个电子邮件标题,如“您收到了 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 服务器支持更复杂的搜索语法(甚至可能是正则表达式),但我希望这应该具有合理的可移植性和健壮性。