如何在Python 3中读取电子邮件内容

4
我尝试了许多代码来访问和读取电子邮件内容,例如,对于 Gmail,我只能进行身份验证,而对于 Outlook,我有可以读取电子邮件的代码,但它被加密了...但现在它只能访问电子邮件,并且不能输出加密信息。所以我需要帮助解决这个问题。谢谢。
以下是代码:
import imaplib
import base64 

email_user = input('Email: ')
email_pass = input('Password: ')

M = imaplib.IMAP4_SSL('imap-mail.outlook.com', 993)
M.login(email_user, email_pass)
M.select()
typ, data = M.search(None, 'ALL')
for num in data[0].split():
    typ, data = M.fetch(num, '(RFC822)')
    num1 = base64.b64decode(num1)
    data1 = base64.b64decode(data)
    print('Message %s\n%s\n' % (num, data[0][1]))
M.close()
M.logout()

你得到了什么?你期望得到什么? - Nabin
我只得到了电子邮件的身份验证,但我希望能够输出显示收件箱电子邮件内容的结果。 - Ricardo91
3个回答

4

我已经检查了你的代码,有几个注释。第一个是当你把代码粘贴到这里时,逗号好像被删除了。我尝试把它们放回去了,所以请检查我的代码是否与你的匹配。请记住,如果没有访问Outlook,我无法测试我的建议。

import imaplib
import base64
email_user = input('Email: ')
email_pass = input('Password: ')

M = imaplib.IMAP4_SSL('imap-mail.outlook.com', 993)
M.login(email_user, email_pass)
M.select()

typ, data = M.search(None, 'ALL')

for num in data[0].split():
    typ, data = M.fetch(num, '(RFC822)')   # data is being redefined here, that's probably not right
    num1 = base64.b64decode(num1)          # should this be (num) rather than (num1) ?
    data1 = base64.b64decode(data)
    print('Message %s\n%s\n' % (num, data[0][1]))  # don't you want to print num1 and data1 here?

M.close()
M.logout()

假设已正确重构,你在第10行调用消息列表数据,但是在第13行重新将调用fetch()的结果分配给了data。

在第14行,您对尚未定义的num1进行解码。但我不确定这些数字是否需要解码,这似乎有点奇怪。

在第16行,您正在打印编码值,而不是已解码的值。我认为您可能需要类似于

import imaplib
import base64
email_user = input('Email: ')
email_pass = input('Password: ')

M = imaplib.IMAP4_SSL('imap-mail.outlook.com', 993)
M.login(email_user, email_pass)
M.select()

typ, message_numbers = M.search(None, 'ALL')  # change variable name, and use new name in for loop

for num in message_numbers[0].split():
    typ, data = M.fetch(num, '(RFC822)')
    # num1 = base64.b64decode(num)          # unnecessary, I think
    print(data)   # check what you've actually got. That will help with the next line
    data1 = base64.b64decode(data[0][1])
    print('Message %s\n%s\n' % (num, data1))

M.close()
M.logout()

希望这能帮到你。

2
不错的答案。但是在检索消息时,结果很混乱。例如----消息b"\r\xe9b\xbd\xea\xdeu:\x1a\xc9\xac\xe6\xa2\xcbZ}\xa8&j)\\xa2d^q\xe8\xafy\xd6\xf2\xdbM6k\xd7v\xdb~\xf4\xd3M4\xc2+aH\xc4\xcf\x89\xda9\xda\xfe\x9c\xb2\x9d\xb5\xd3^=\xda\x8bZJ\xe9\xf6\xdd'\xa9\xdbM|\xdbnz\xe3\xad;\xd3C\xc3Mq\xa8\xa2\t^JkiJ\x8b\xabq\xe0\x02pez\xd9sE\xe8\xb2\xee\x1b\xcd\xf2\x85$\x11J\xdd$\x9a'Z\x83\xb1\x0e7\xf2}+\xd5\xe7_a\xc7g\xd4" ------这应该是一些检索到的电子邮件,但我什么也看不懂。 - Mostafa Ayaz

2

使用 data[0][1].decode('utf-8')。

它会起作用。我也遇到了同样的问题。对我有用。


0

如果您的Gmail帐户未启用不安全应用程序,则即使您的代码完全正确,您也会收到身份验证错误。您只需要在Gmail帐户中启用不安全的应用程序即可。我之前也遇到了这个问题,所以进行了研究并解决了此错误。


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