From 7760972c51f615d9669ece03c6efe7bc8e780106 Mon Sep 17 00:00:00 2001 From: yasusan Date: Wed, 10 Jun 2026 13:44:02 +0000 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20parser.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- parser.py | 82 ++++++++++++++++++++++--------------------------------- 1 file changed, 33 insertions(+), 49 deletions(-) diff --git a/parser.py b/parser.py index 76ee78e..b01a460 100644 --- a/parser.py +++ b/parser.py @@ -1,7 +1,6 @@ #!/usr/bin/env python3 -import imaplib +from imapclient import IMAPClient import email -from email.header import decode_header import re import json import time @@ -71,47 +70,35 @@ def parse_email_body(body_text): def fetch_new_emails(): """Проверяет папку 'Новые договоры' и возвращает новые письма""" try: - mail = imaplib.IMAP4_SSL(IMAP_SERVER, IMAP_PORT) - mail.login(EMAIL_USER, EMAIL_PASSWORD) - - folder_found = False - for folder in [FOLDER_NAME, f'"{FOLDER_NAME}"', 'Новые договоры']: - try: - mail.select(folder, readonly=False) - folder_found = True - logging.info(f"Открыта папка: {folder}") - break - except imaplib.IMAP4.error: - continue - - if not folder_found: - status, folders = mail.list() - logging.error("Не найдена папка 'Новые договоры'. Доступные папки:") - for f in folders: - logging.error(f" {f.decode('utf-8')}") - mail.logout() - return [] - - status, messages = mail.search(None, 'UNSEEN') - if status != 'OK' or not messages[0]: - mail.logout() - return [] - - email_ids = messages[0].split() - logging.info(f"Найдено непрочитанных писем: {len(email_ids)}") - - new_emails = [] - - for e_id in email_ids: - status, msg_data = mail.fetch(e_id, '(RFC822)') - if status != 'OK': - continue + with IMAPClient(IMAP_SERVER, ssl=True) as server: + server.login(EMAIL_USER, EMAIL_PASSWORD) - for response_part in msg_data: - if isinstance(response_part, tuple): - msg = email.message_from_bytes(response_part[1]) + # Пробуем открыть папку с русским названием + try: + server.select_folder("Новые договоры") + except: + # Если не работает, пробуем кодированное имя + server.select_folder("&BB8EPgQ0BDoEOwROBEcENQQ9BDgETw-") + + # Ищем непрочитанные + messages = server.search(['UNSEEN']) + if not messages: + return [] + + new_emails = [] + + for msg_id in messages: + # Получаем письмо + data = server.fetch([msg_id], ['BODY[]', 'ENVELOPE']) + envelope = data[msg_id][b'ENVELOPE'] + + # Получаем тело + body_data = data[msg_id][b'BODY[]'] + if body_data: + # Парсим тело + import email + msg = email.message_from_bytes(body_data) - # Получаем тело письма (только text/plain) body = "" if msg.is_multipart(): for part in msg.walk(): @@ -134,15 +121,12 @@ def fetch_new_emails(): "received_date": datetime.now().strftime("%Y-%m-%d %H:%M:%S") }) logging.info(f"✓ Найдено: договор {contract_number}, оператор {operator_name}") - else: - logging.warning(f"Не удалось распарсить письмо") + + # Помечаем как прочитанное + server.add_flags(msg_id, ['\\Seen']) + + return new_emails - mail.store(e_id, '+FLAGS', '\\Seen') - - mail.close() - mail.logout() - return new_emails - except Exception as e: logging.error(f"Ошибка при подключении к почте: {e}") return []