首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python poplib获取附件

python poplib获取附件
EN

Stack Overflow用户
提问于 2011-07-01 05:23:48
回答 2查看 7.1K关注 0票数 9

我正在尝试访问POP3电子邮件服务器。我将轮询消息和下载他们中的每一个的附件。我可以成功登录并获取邮件,但无法弄清楚如何实际获取附件,稍后需要对其进行解析。我想我可以保存到tmp目录,直到我处理它。

这是我到目前为止所得到的:

代码语言:javascript
复制
pop = poplib.POP3_SSL(server)
pop.user(usr)
pop.pass_(pwd)

f = open(file_dir, 'w')
num_msgs = len(pop.list()[1])
for msg_list in range(num_msgs):
    for msg in pop.retr(msg_list+1)[1]:
        mail = email.message_from_string(msg)
        for part in mail.walk():
            f.write(part.get_payload(decode=True))
f.close()

这是我从网上找到的示例中拼凑而成的代码,但没有实际获得附件的可靠示例。我要写入的文件是空的。这里我漏掉了什么?

EN

回答 2

Stack Overflow用户

发布于 2015-06-11 23:06:42

请看下面的完整示例。

导入poplib和解析器

import poplib from email import parser

返回到pop服务器的连接的函数:

代码语言:javascript
复制
def mail_connection(server='pop.mymailserver.com'):
    pop_conn = poplib.POP3(server)
    pop_conn.user('someuser@server')
    pop_conn.pass_('password')
    return pop_conn

获取邮件的函数:

代码语言:javascript
复制
def fetch_mail(delete_after=False):
    pop_conn = mail_connection() 
    messages = [pop_conn.retr(i) for i in range(1, len(pop_conn.list()[1]) + 1)]
    messages = ["\n".join(mssg[1]) for mssg in messages]
    messages = [parser.Parser().parsestr(mssg) for mssg in messages]
    if delete_after == True:
        delete_messages = [pop_conn.dele(i) for i in range(1, len(pop_conn.list()[1]) + 1)]
    pop_conn.quit()
    return messages

然后是一个将附件保存为文件的函数。注意,allowed mimetypes;您可以拥有它们的列表,例如:

代码语言:javascript
复制
allowed_mimetypes = ["application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"]

诸若此类。

代码语言:javascript
复制
def get_attachments():
    messages = fetch_mail()
    attachments = []
    for msg in messages:
        for part in msg.walk():
            if part.get_content_type() in allowed_mimetypes:
                name = part.get_filename()
                data = part.get_payload(decode=True)
                f = open(name,'wb')
                f.write(data)
                f.close()
                attachments.append(name)
    return attachments
票数 6
EN

Stack Overflow用户

发布于 2012-01-20 22:42:15

我知道这是一个老问题,但以防万一:您传递给email.message_from_string的值实际上是电子邮件内容的列表,其中每个元素都是一行。您需要将其连接起来,以获得该电子邮件的字符串表示:

代码语言:javascript
复制
mail = email.message_from_string("".join(msg))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6541271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档