|
У меня вылезла проблема, что из-за ежедневных рассылок изрядно заполнился почтовый ящик на mail.ru. По объёму меня не угнетало, но надоело, что там лежит 1500+ писем, которые я никогда читать не буду. Удалять их через WEB интерфейс то ещё удовольствие. Решил написать программу, которая сделает это за меня. С запросом к GeekBot написать программу в PowerShell у меня не срослось. Визуально код нормальный, но в Windows-10 программа не заработала от слова вообще. Такое ощущение, что не хватает библиотек для работы с почтой по протоколу IMAP. Запросил программу на Python.
Вот текст запроса: напиши программу на python для удаления писем из почтового ящика на сервере mail.ru. в теме письма должно быть "3DNews" и письма должны быть получены ранее 01/08/2025
Прилетел код, но не совсем рабочий. Пришлось поправить:
1. Спотыкался при пустой теме письма;
2. Не совпадали тип указанной даты с типом даты в письме;
3. Добавил вывод на экран списка папок;
4. Добавил вывод на экран протокола работы.
В итоге проковырялся 2 часа. Научился читать, править и использовать python, удалил 1500+ писем.
Код программы:
import imaplib
import email
import datetime
from email.header import decode_header
from datetime import datetime
import imap_utf7 #скачать библиотеку для показа списка папок или закомментарить, если не хотим использовать библиотеку imap_utf7
#imap_utf7 - декодирует названия папок на кириллице, положить в папку к программе.
# Настройки для подключения к Mail.ru
mail_server = 'imap.mail.ru'
username = 'имя_яшика@mail.ru'
# Сгенерируйте пароль для приложения в сервисе Mail.ru
password = 'пароль'
# Подключение к почтовому серверу
mail = imaplib.IMAP4_SSL(mail_server)
mail.login(username, password)
mbox='INBOX'
mail.select(mbox)
total=0
#Показать список папок.
status, folders = mail.list()
if status == 'OK':
for folder in folders:
print(imap_utf7.decode(folder)) #Закомментарить, если не хотим использовать библиотеку imap_utf7
# print(folder) #Раскомментарить, если не хотим использовать библиотеку imap_utf7
print()
# Поиск писем
status, messages = mail.search(None, 'ALL')
mail_ids = messages[0].split()
# Дата для сравнения
cutoff_date = datetime(2025, 8, 1)
# Строка темы для сравнения
subj_str='3DNews'
print('Писем в', mbox, ':', len(mail_ids))
print()
for mail_id in mail_ids:
status, msg_data = mail.fetch(mail_id, '(RFC822)')
msg = email.message_from_bytes(msg_data[0][1])
# Получение даты получения письма
date_str = msg['Date']
date_received = email.utils.parsedate_to_datetime(date_str)
# Добавил, но не использую. Почему-то иногда письма не по порядку даты. Досрочное завершение цикла.
# if date_received.replace(tzinfo=None) >= cutoff_date: #Если позже даты, то выходим
# break
# Получение темы письма
if msg['Subject'] is not(None): #Если не пустая тема в письме
subject, encoding = decode_header(msg['Subject'])[0]
if isinstance(subject, bytes):
subject = subject.decode(encoding if encoding else 'utf-8')
print(subject, date_received)
# Условие для удаления
if subj_str in subject and date_received.replace(tzinfo=None) < cutoff_date:
mail.store(mail_id, '+FLAGS', '\\Deleted')
total=total+1
print('Удалено:', total)
# Удаление помеченных писем
mail.expunge()
mail.logout()
print('Всего удалено:', total)
print('Очистите папку "Удалённые".')
|