如何使用python imap打印多个电子邮件正文? [英] How do I print multiple email bodies with python imap?
问题描述
我想打印出多至少两个星期的电子邮件正文。
我已经看过周围其他类似的帖子,但我只是不能让它工作。
我已经发布的代码是我现在有多远。我可以打印出最新的电子邮件,但是我该怎么办?
import imaplib
/ pre>
import sys
mail = imaplib.IMAP4_SSL('Server')
mail.login('User','Password')
mail.select ('Inbox')
result,data = mail.uid('search',None,'ALL')
ids = data [0]
id_list = ids.split()
latest_email_uid = int(id_list [-1])$ b
$ b对于我的范围(latest_email_uid,latest_email_uid-5,-1):
result,data = mail.uid('fetch' ,我,'(RFC822)')
raw_email = data [0] [1]
导入电子邮件
email_message = email.message_from_string(raw_email)
print email_message.get_payload(decode = True)
def get_first_text_block(self,email_message_instance):
maintype = email_message_instance.get_content_maintype()
如果maintype == 'multipart':
在email_message_instance.get_payload()中的一部分:
如果part.get_content_maintype ()=='text':
return part.get_payload
elif maintype ==text:
return email_message_instance.get_payload()
谢谢!
更新
新的代码!import imaplib
import sys
import email
mail = imaplib。 IMAP4_SSL('server')
mail.login('user','password')
mail.select('Inbox')
result,data = mail.uid('search',None,'ALL')
ids = data [0]
id_list = ids.split()
latest_email_uid = int(id_list [ 1])$ b
$ b raw_emails = []
for i in range(latest_email_uid,latest_email_uid-5,-1):
result,data = mail.uid('fetch'我的'(RFC822)')
raw_emails.append(data [0] [1])$ b
$ b raw_emails中的raw_email:
email_message = email.message_from_string(raw_email)
打印email_message.get_payload(decode = True)
def get_first_text _block(self,email_message_instance):
maintype = email_message_instance.get_content_maintype()
如果maintype =='multipart':
在email_message_instance.get_payload()中的一部分:
如果部分。 get_content_maintype()=='text':
return part.get_payload
elif maintype ==text:
return email_message_instance.get_payload()
这是它的外观,我可能犯了一些错误,导致只有一个电子邮件正文被打印。帮助非常感谢!
解决方案我想你的问题在这里:
for i in range(latest_email_uid,latest_email_uid-5,-1):
result,data = mail.uid('fetch',i,'(RFC822)')
raw_email = data [0] [1]
循环后,
数据
仅包含您迭代的最后一封电子邮件。相反,请获取电子邮件列表:raw_emails = []
for i in range(latest_email_uid,latest_email_uid-5 ,-1):
result,data = mail.uid('fetch',i,'(RFC822)')
raw_emails.append(data [0] [1])$ b $ b您现在可以遍历这些:
code> for raw_emails中的raw_email:
email_message = email.message_from_string(raw_email)
...
(注意:您应该遵循 PEP-0008 并将所有
导入
语句放在顶部 - 它可以更容易地阅读和理解代码,特别是随着代码的增长。)
修改:
您的修订版只打印一次,因为
for
循环运行,而不是每次迭代。缩进很重要:for raw_emails中的raw_email:
email_message = email.message_from_string(raw_email)
打印email_message.get_payload(decode = True)#note indentation
I'm very new at coding and this is my first real attempt to do anything like this. I want to print out multiple email bodies, that are at least two weeks old. (later on in my finished program, i want to make this changeable)
I've looked around other similar post but i just couldn't get it to work. The code i've posted is how far i've come at the moment. I can print out the latest email just fine, but how do i go on from this?
import imaplib import sys mail = imaplib.IMAP4_SSL('Server') mail.login('User', 'Password') mail.select('Inbox') result, data = mail.uid('search', None, 'ALL') ids = data[0] id_list = ids.split() latest_email_uid = int(id_list[-1]) for i in range(latest_email_uid, latest_email_uid-5, -1): result, data = mail.uid('fetch', i, '(RFC822)') raw_email = data[0][1] import email email_message = email.message_from_string(raw_email) print email_message.get_payload(decode = True) def get_first_text_block(self, email_message_instance): maintype = email_message_instance.get_content_maintype() if maintype == 'multipart': for part in email_message_instance.get_payload(): if part.get_content_maintype() == 'text': return part.get_payload elif maintype == "text": return email_message_instance.get_payload()
Thank you!
UPDATE New code!
import imaplib import sys import email mail = imaplib.IMAP4_SSL('server') mail.login('user', 'password') mail.select('Inbox') result, data = mail.uid('search', None, 'ALL') ids = data[0] id_list = ids.split() latest_email_uid = int(id_list[-1]) raw_emails = [] for i in range(latest_email_uid, latest_email_uid-5, -1): result, data = mail.uid('fetch', i, '(RFC822)') raw_emails.append(data[0][1]) for raw_email in raw_emails: email_message = email.message_from_string(raw_email) print email_message.get_payload(decode = True) def get_first_text_block(self, email_message_instance): maintype = email_message_instance.get_content_maintype() if maintype == 'multipart': for part in email_message_instance.get_payload(): if part.get_content_maintype() == 'text': return part.get_payload elif maintype == "text": return email_message_instance.get_payload()
This is how it looks, i probably made some mistake which results in only one email body is printed. Help is much appreciated!
解决方案I think your problem is here:
for i in range(latest_email_uid, latest_email_uid-5, -1): result, data = mail.uid('fetch', i, '(RFC822)') raw_email = data[0][1]
After the loop,
data
only contains the last email you iterate over. Instead, get a list of emails:raw_emails = [] for i in range(latest_email_uid, latest_email_uid-5, -1): result, data = mail.uid('fetch', i, '(RFC822)') raw_emails.append(data[0][1])
You can now iterate over those:
for raw_email in raw_emails: email_message = email.message_from_string(raw_email) ...
(Note: you should follow PEP-0008 and put all
import
statements at the top - it makes it easier to read and understand the code, particularly as it grows.)
Edit:
Your revision only prints once because you
for
loop runs, not for each iteration. Indentation is important:for raw_email in raw_emails: email_message = email.message_from_string(raw_email) print email_message.get_payload(decode=True) # note indentation
这篇关于如何使用python imap打印多个电子邮件正文?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!