我试图简单地输出收件箱中每封邮件的FROM和SUBJECT字段。我已经花了太多的时间来解决这个问题,所以我把它扔到栅栏上,希望能得到一些帮助。
登录的部分似乎工作得很好,(gmail 2FA)只是处理结果似乎没有工作。什么都没有输出,而应该有。 我相信这和下面这行有关。 if isinstance(response_part, tuple) 为什么它要找一个元组?
我对python太陌生了,不知道可能是什么问题。
谁能告诉我,我的代码可能有什么问题,如何纠正?我从下面这个代码片段中得到的。
import imaplib
import base64
import os
import email
email_user = input('Email: ')
email_pass = input('Password: ')
mail = imaplib.IMAP4_SSL('imap.gmail.com',993)
mail.login(email_user, email_pass)
mail.select('Inbox')
type, data = mail.search(None, 'ALL')
mail_ids = data[0]
id_list = mail_ids.split()
for response_part in data:
if isinstance(response_part, tuple):
msg = email.message_from_string(response_part[1].decode('utf-8'))
email_subject = msg['subject']
email_from = msg['from']
print('From : ' + email_from + '\n')
print('Subject : ' + email_subject + '\n')
print(msg.get_payload(decode=True))
解决方案:
我在网上找到了一个解决方案,我想我会分享的情况下,它可以帮助别人下线。 谢谢你的帮助。
import imaplib
import base64
import os
import email
email_user = input('Email: ')
email_pass = input('Password: ')
def extract_body(payload):
if isinstance(payload,str):
return payload
else:
return '\n'.join([extract_body(part.get_payload()) for part in payload])
conn = imaplib.IMAP4_SSL("imap.gmail.com", 993)
conn.login(email_user, email_pass)
conn.select('"1. Alerts"')
typ, data = conn.search(None, 'ALL')
try:
for num in data[0].split():
typ, msg_data = conn.fetch(num, '(RFC822)')
for response_part in msg_data:
if isinstance(response_part, tuple):
msg = email.message_from_bytes(response_part[1])
gmail_subj =msg['subject']
print(gmail_subj)
gmail_from=msg['from']
print(gmail_from)
payload=msg.get_payload()
# body=extract_body(payload)
# print(body)
typ, response = conn.store(num, '+FLAGS', r'(\Seen)')
finally:
try:
conn.close()
except:
pass
conn.logout()