Обновить parser.py

This commit is contained in:
2026-06-10 13:44:02 +00:00
parent 61c50401be
commit 7760972c51
+26 -42
View File
@@ -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)
with IMAPClient(IMAP_SERVER, ssl=True) as server:
server.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
server.select_folder("Новые договоры")
except:
# Если не работает, пробуем кодированное имя
server.select_folder("&BB8EPgQ0BDoEOwROBEcENQQ9BDgETw-")
if not folder_found:
status, folders = mail.list()
logging.error("Не найдена папка 'Новые договоры'. Доступные папки:")
for f in folders:
logging.error(f" {f.decode('utf-8')}")
mail.logout()
return []
# Ищем непрочитанные
messages = server.search(['UNSEEN'])
if not messages:
return []
status, messages = mail.search(None, 'UNSEEN')
if status != 'OK' or not messages[0]:
mail.logout()
return []
new_emails = []
email_ids = messages[0].split()
logging.info(f"Найдено непрочитанных писем: {len(email_ids)}")
for msg_id in messages:
# Получаем письмо
data = server.fetch([msg_id], ['BODY[]', 'ENVELOPE'])
envelope = data[msg_id][b'ENVELOPE']
new_emails = []
# Получаем тело
body_data = data[msg_id][b'BODY[]']
if body_data:
# Парсим тело
import email
msg = email.message_from_bytes(body_data)
for e_id in email_ids:
status, msg_data = mail.fetch(e_id, '(RFC822)')
if status != 'OK':
continue
for response_part in msg_data:
if isinstance(response_part, tuple):
msg = email.message_from_bytes(response_part[1])
# Получаем тело письма (только text/plain)
body = ""
if msg.is_multipart():
for part in msg.walk():
@@ -134,14 +121,11 @@ 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"Не удалось распарсить письмо")
mail.store(e_id, '+FLAGS', '\\Seen')
# Помечаем как прочитанное
server.add_flags(msg_id, ['\\Seen'])
mail.close()
mail.logout()
return new_emails
return new_emails
except Exception as e:
logging.error(f"Ошибка при подключении к почте: {e}")