Python通过IMAP识别和读取Outlook邮件中的链接

4
我试图编写一个Python3代码,登录Outlook邮件帐户,然后使用IMAP和BeautifulSoup搜索具有某些特定过滤器(发件人、主题、日期)的电子邮件以获取并解析它,然后从其正文中获取特定链接。
我已经能够完成以下步骤: 1- 使用IMAP登录我的电子邮件帐户,然后访问我的收件箱。 2- 获取电子邮件,然后解析它们。 3- 在不同的.txt文件中查找链接。
但是我无法通过IMAP搜索特定的电子邮件。请问是否有人可以帮助我展示在Outlook中搜索特定电子邮件的正确语法?
先感谢您的帮助。
import imaplib
import email
from email.utils import parseaddr

username = 'hae42@mail.aub.edu'
password = 'Null'
Mymail = imaplib.IMAP4_SSL('outlook.office365.com')#imap- 
mail.outlook.com or outlook.office365.com
Mymail.login(username, password)
#Mymail.list() #OUT: list of "folders"
Mymail.select("INBOX") #connect to inbox

def get_body(msg):
    if msg.is_multipart():
        return get_body(msg.get_payload(0))
    else:
        return msg.get_payload(None,True)

def search(key, value, Mymail):
    result, data = Mymail.search(None, key, '"()"'.format(value))
    return data

result, data = Mymail.fetch(latest_email_id, '(RFC822)')
raw_email = email.message_from_bytes(data[0][1])

 print(search('FROM', 'email@outlook.example'))

你读过RFC 3501的搜索规范吗?imaplib并没有提供任何花哨的功能,你只需将原始搜索字符串提供给库即可。 - Max
1
我认为如果我提供更多的解释会更好,我只是添加了一个读取Outlook邮件的代码片段。 在GMAIL示例中,使用同样的搜索功能来指定您想要获取和解析的电子邮件,包括识别发件人,“FROM”,“EXAMPLE@GMAIL.COM”。然后返回[b'1 2 3'],例如您收件箱中的前三封电子邮件都来自该发件人。 我的问题是,我不知道如何为Outlook邮件实现此功能,它返回b'',表示没有来自我指定的发件人的电子邮件,尽管我确信有(我已经检查过了)。 - Hadi K.
1个回答

3

我使用 IMAPClientmailparser 工具,可以读取来自Outlook、Gmail和其他邮箱的邮件:

from imapclient import IMAPClient
import mailparser

with IMAPClient(self.host) as server:
    server.login(self.username, self.password)
    server.select_folder('INBOX')
    messages = server.search(['UNSEEN', ])  # in your case: ['FROM', 'email@outlook.example']

    # for each unseen email in the inbox
    for uid, message_data in server.fetch(messages, 'RFC822').items():
        email_message = mailparser.parse_from_string(message_data[b'RFC822'])

您可以按照上面的链接介绍访问电子邮件的元素。例如:
# parse html from email
soup = BeautifulSoup(email_message.body, "html.parser")
msg_body = soup.get_text()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接