Работа с файлами mailbox
Чем хорош почтовый клиент Mozilla Thunderbird?
Хотя бы тем, что хранит письма в удобном формате mailbox. Благодрая этому можно рулить почтой программно: считывать содержимое ящика, удалять и добавлять письма.
Зачем это может понадобитсья? Например, каждый день вам на почту приходят реестры платежей, которые нужно выгрузить из аттача, распаковать, и, в зависимости от имени файла, скопировать в определенную директорию. Напрашивается автоматизация процесса.
В составе богатой библиотеки Питона есть модуль mailbox. Небольшой пример:
import os
import cgitb
cgitb.enable(display=False, logdir=os.path.dirname(__file__))
import mailbox
MAILBOX_PATH = "path/to/mailbox.file" # Путь к файлу ящика
DATA_PATH = "store/path" # Директория для файлов
mbox = mailbox.mbox(MAILBOX_PATH, create=False)
for i, message in enumerate(mbox):
attachments = message.get_payload()
for attachment in attachments:
filename = attachment.get_filename()
if filename and filename.endswith(".txt"):
body = attachment.get_payload(decode=True)
filepath = os.path.join(DATA_PATH, filename)
with open(filepath, "w") as f:
f.write(body)
mbox.remove(i)
mbox.close()
Основной цикл обходит все письма в ящике. Переменная attachments — это список частей письма. Частью может быть всё — простой текст, HTML-сообщение, файловое вложение и т.д.
get_filename()
возвращает имя части. Для файлов оно будет отлично от
None. Нас интересуют только текстовые файлы. Тело файла извлекается
методом get_payload()
части.
При передаче файла он может быть закодирован методами base64 или
uuencode. Чтобы получить исходный файл, передается параметр
decode=True
. Полученный файл пишется на диск.
Сообщение удаляется из ящика. По окончании цикла ящик закрывается.
Нашли ошибку? Выделите мышкой и нажмите Ctrl/⌘+Enter