Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.
Библиотека imaplib и получение писем в программе на python
Прежде всего, смотрим две предыдущие статьи по теме "Электронная почта"
Как всегда, когда имеешь дело с почтой, нужны настройки. Начать нужно с того, что проверить поддерживает ли почтовый сервер протокол imap. Часто он бывает просто отключен. Ну значит нужно его включить.
В предыдущих статьях по почте я писал, что для mail.ru понадобиться отдельный пароль. Для yandex,ru подходил обычный пароль. Теперь в обоих случаях нужен отдельный пароль для программы-клиента. В настройках безопасности обоих указанных серверов это можно сделать.
Нам понадобиться уже известная нам библиотека email. Также будет нужна стандартная библиотека imaplib. Кроме того нам для декодирования нужна будет стандартная же библиотека base64.
Ниже представлена программа чтения последнего полученного письма с учетом наличия вложений. Вместо имени пользователя и пароля нужно подставить свои данные.
Пояснения к программе на рисунке 1
- Прежде создаём объект для работы с почтовым сервером: IMAP4_SSL(host=ims, port=imp).
- Следующий шаг подсоединения. Собственно тут и сработает, если что-то не так: протокол, имя или пароль: ml.login(user=usr, password=ps).
- Выбор паки осуществляется командой ml.select('INBOX').
- Поиск всех писем в паке: typ, data = ml.search(None, "ALL").
- Дальше можно получить количество писем и выбирать письма по номеру: count = len(data[0].split()). Чтобы было понятно, откуда это напечатаем print(data[0]) и получим что-то типа такого b'1 2 3 4 5 6 7'. Т.е. семь писем, а седьмое - последнее.
- Если писем вообще нет, то просто выходим (count == 0).
- Содержимое последнего письма извлекается из ml.fetch(b1, '(RFC822)'), b1 = bytes(str(count).encode()).
- Ну а далее используем библиотеку email: bytes(str(count).encode()). Вот, наконец мы дошли до того содержимого, откуда и будем всё извлекать.
- Получаем дату получения письма email.utils.parsedate_tz(msg["Date"]).
- Тему: email.header.decode_header(msg["Subject"])[0][0].decode().
- Обратный адрес msg["Return-path"].
- Извлечение текстовой части for part in msg.walk(), с перекодировкой base64.b64decode(part.get_payload()).decode().
- Вывод (сохранение) всех файлов for part in msg.walk(). email.header.decode_header(part.get_filename())[0][0].decode() - имя файла в правильной кодировке. Кстати, если у вас не Linux, то может понадобиться указание нужной кодировки в методе decode().
Представленный мной рецепт проверен на двух серверах. Может на других серверах будут какие-то особенности. Ну, я думаю. можно уже легко разобраться, отталкиваясь от этого материала.
Ну пока всё! Тему почты пока закончу
Пишите свои предложения и замечания, и занимайтесь программированием, а также проектированием баз данных, хотя бы для поддержания уровня интеллекта.