python poplib получить вложение

Я пытаюсь получить доступ к почтовому серверу POP3. Я буду опрашивать сообщения и скачивать вложения для каждого из них. Я могу успешно войти в систему и получить сообщения, но не могу понять, как на самом деле получить вложение, которое мне нужно будет проанализировать позже. Я думаю, что могу сохранить в каталоге tmp, пока не обработаю его.

Вот что я получил до сих пор:

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()

Это код, который я собрал по кусочкам из примеров, которые нашел в Интернете, но нет надежного примера фактического получения вложения. Файл, в который я пишу, пуст. Что мне здесь не хватает?


person t0x13    schedule 30.06.2011    source источник
comment
Интересно, вы нашли решение своей проблемы?   -  person bogeymin    schedule 22.12.2011
comment
@bogeymin Я нашел ответ. Если надо, могу тебе файл выкопать :)   -  person t0x13    schedule 22.02.2012
comment
Я знал ответ и добавил бы его сюда, если бы вы не нашли проблему. Но вопрос был старый, поэтому я не знал, нужен ли на него ответ.   -  person bogeymin    schedule 22.02.2012
comment
Привет, я хотел бы знать ответ, есть ли кто-нибудь, кто может сказать мне в это время? :П   -  person Felix Yan    schedule 23.06.2012
comment
Этот ответ помог мне. Это похоже на ваш код, за исключением того, что в нем есть некоторые проверки для пропуска контента, который не включает вложение. Кроме того, принято отредактировать свой вопрос с решением, как только вы его найдете.   -  person Minh Tran    schedule 16.01.2019


Ответы (2)


Пожалуйста, смотрите полный пример ниже.

Импортировать poplib и парсер

import poplib from email import parser

Функция для возврата соединения с поп-сервером:

def mail_connection(server='pop.mymailserver.com'):
    pop_conn = poplib.POP3(server)
    pop_conn.user('someuser@server')
    pop_conn.pass_('password')
    return pop_conn

Функция для получения почты:

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

Затем функция для сохранения вложений в виде файлов. NB, allowed mimetypes; у вас может быть их список, например:

allowed_mimetypes = ["application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"]

и так далее.

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 = file(name,'wb')
                f.write(data)
                f.close()
                attachments.append(name)
    return attachments
person torrange    schedule 11.06.2015
comment
Привет. Один вопрос - в строке messages = [parser.Parser().parseg(mssg) для mssg в сообщениях] , откуда вы получаете parser.Parser() ? Его нет в парсере модуля stdlib. - person Paweł Sopel; 26.01.2017
comment
@Pawel - из парсера импорта электронной почты - person Ominus; 25.04.2017
comment
@Ominus Спасибо, это он. - person torrange; 26.04.2017
comment
@PawełSopel Я обновил пример с помощью импорта соответствующих библиотек. - person torrange; 26.04.2017
comment
Где устанавливается или сохраняется местоположение файла? Я новичок в питоне. - person WhiteSpider; 24.10.2019

Я знаю, что это старый вопрос, но на всякий случай: значение, которое вы передаете в email.message_from_string, на самом деле представляет собой список содержимого электронного письма, где каждый элемент представляет собой строку. Вам нужно присоединиться к нему, чтобы получить строковое представление этого письма:

mail = email.message_from_string("".join(msg))
person Harel    schedule 20.01.2012