如何使用python imap打印多个电子邮件正文? [英] How do I print multiple email bodies with python imap?

查看:163
本文介绍了如何使用python imap打印多个电子邮件正文?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我非常新的编码,这是我第一次真正尝试这样做的事情。
我想打印出多至少两个星期的电子邮件正文。



我已经看过周围其他类似的帖子,但我只是不能让它工作。
我已经发布的代码是我现在有多远。我可以打印出最新的电子邮件,但是我该怎么办?

  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])$ ​​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()
/ pre>

谢谢!



更新
新的代码!

  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 并将所有导入语句放在顶部 - 它可以更容易地阅读和理解代码,特别是随着代码的增长。)






修改



您的修订版只打印一次,因为 print 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 print after the 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆