From 5e48c893c6d782cfd1f9dbb1d5622cc294a226b0 Mon Sep 17 00:00:00 2001 From: yasusan Date: Thu, 11 Jun 2026 11:41:11 +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 | 57 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 33 insertions(+), 24 deletions(-) diff --git a/parser.py b/parser.py index 5661f3e..798a7aa 100644 --- a/parser.py +++ b/parser.py @@ -58,7 +58,7 @@ def decode_header_value(value): def parse_email_body(body_text): """Извлекает имя оператора и номер договора из HTML письма""" # Ищем в HTML: Оператор Имя создал новый договор номер - pattern = r'Оператор\s+([А-Яа-я\s]+?)\s+создал\s+новый\s+договор\s+(\d+)' + pattern = r'Оператор\s+([A-Za-zА-Яа-я\s]+?)\s+создал\s+новый\s+договор\s+(\d+)' match = re.search(pattern, body_text, re.IGNORECASE) if match: @@ -73,46 +73,45 @@ def fetch_new_emails(): try: with IMAPClient(IMAP_SERVER, ssl=True) as server: server.login(EMAIL_USER, EMAIL_PASSWORD) + server.select_folder("Новые договоры") - # Пробуем открыть папку с русским названием - try: - server.select_folder("Новые договоры") - except: - # Если не работает, пробуем кодированное имя - server.select_folder("&BB8EPgQ0BDoEOwROBEcENQQ9BDgETw-") + # Ищем все письма (для теста), потом замените на ['UNSEEN'] + messages = server.search(['ALL']) + logging.info(f"Найдено писем в папке: {len(messages)}") - # Ищем непрочитанные - 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 + for msg_id in messages[-10:]: # последние 10 писем + try: + data = server.fetch([msg_id], ['BODY[]']) + body_data = data[msg_id][b'BODY[]'] + + if not body_data: + continue + msg = email.message_from_bytes(body_data) + # Извлекаем тело письма (HTML) body = "" if msg.is_multipart(): for part in msg.walk(): - if part.get_content_type() == "text/plain": + if part.get_content_type() == 'text/html': payload = part.get_payload(decode=True) if payload: - body += payload.decode('utf-8', errors='ignore') + body = payload.decode('utf-8', errors='ignore') break else: payload = msg.get_payload(decode=True) if payload: body = payload.decode('utf-8', errors='ignore') + if not body: + continue + + # Парсим имя и номер operator_name, contract_number = parse_email_body(body) if operator_name and contract_number: @@ -122,9 +121,19 @@ def fetch_new_emails(): "received_date": datetime.now().strftime("%Y-%m-%d %H:%M:%S") }) logging.info(f"✓ Найдено: договор {contract_number}, оператор {operator_name}") - - # Помечаем как прочитанное - server.add_flags(msg_id, ['\\Seen']) + else: + logging.debug(f"Не удалось распарсить письмо {msg_id}") + + except Exception as e: + logging.error(f"Ошибка при обработке письма {msg_id}: {e}") + continue + + # Помечаем письма как прочитанные + for msg_id in messages[-10:]: + try: + server.add_flags(msg_id, ['\\Seen']) + except: + pass return new_emails