import imaplib
import email
import time
import re
from email import message_from_bytes
class Mailchecker:
# Конструктор класса, устанавливающий соединение с почтовым сервисом и, при необходимости, удаляющий письма с заданной темой
def __init__(self, login="akoledachkin@gmail.com", password="utyv slpq tgcj btio", email_service="imap.gmail.com", subject_for_deletion=""):
self.mail = imaplib.IMAP4_SSL(email_service) # Создание защищенного IMAP соединения
self.mail.login(login, password) # Вход в почтовый аккаунт
if subject_for_deletion:
self.delete_emails_with_subject(subject_for_deletion) # Удаление писем с заданной темой, если она указана
# Метод для поиска электронных писем по части темы и содержимому, соответствующему регулярному выражению
def search_emails(self, partial_subject, regex_pattern, folder="inbox", timeout=90, check_frequency=1):
start_time = time.time()
while (time.time() - start_time) < timeout:
self.mail.select(folder) # Выбор папки для поиска
query = f'(HEADER Subject "{partial_subject}")' # Формирование запроса для поиска писем с частичным совпадением темы
result, data = self.mail.search(None, query)
if data[0]:
for email_id in data[0].split():
result, data = self.mail.fetch(email_id, "(RFC822)") # Получение данных письма
msg = message_from_bytes(data[0][1]) # Преобразование данных письма в объект сообщения
# Обработка многочастных писем
if msg.is_multipart():
for part in msg.walk():
if part.get_content_type() in ['text/plain', 'text/html']:
body = part.get_payload(decode=True).decode('utf-8', errors='ignore')
match = re.search(regex_pattern, body, re.DOTALL)
if match:
return match.group()
else:
body = msg.get_payload(decode=True).decode('utf-8', errors='ignore')
match = re.search(regex_pattern, body, re.DOTALL)
if match:
return match.group()
time.sleep(check_frequency) # Ожидание перед следующей проверкой
return None
# Метод для удаления писем с определенной темой
def delete_emails_with_subject(self, partial_subject, folder="inbox"):
self.mail.select(folder) # Выбор папки
query = f'(SUBJECT "{partial_subject}")' # Формирование запроса для поиска писем с полным совпадением темы
result, data = self.mail.search(None, query)
if result == 'OK':
for num in data[0].split():
self.mail.store(num, '+FLAGS', '\\Deleted') # Пометка писем как удаленных
self.mail.expunge() # Окончательное удаление помеченных писем