Обновить parser.py

This commit is contained in:
2026-06-10 13:44:02 +00:00
parent 61c50401be
commit 7760972c51
+23 -39
View File
@@ -1,7 +1,6 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import imaplib from imapclient import IMAPClient
import email import email
from email.header import decode_header
import re import re
import json import json
import time import time
@@ -71,47 +70,35 @@ def parse_email_body(body_text):
def fetch_new_emails(): def fetch_new_emails():
"""Проверяет папку 'Новые договоры' и возвращает новые письма""" """Проверяет папку 'Новые договоры' и возвращает новые письма"""
try: try:
mail = imaplib.IMAP4_SSL(IMAP_SERVER, IMAP_PORT) with IMAPClient(IMAP_SERVER, ssl=True) as server:
mail.login(EMAIL_USER, EMAIL_PASSWORD) server.login(EMAIL_USER, EMAIL_PASSWORD)
folder_found = False # Пробуем открыть папку с русским названием
for folder in [FOLDER_NAME, f'"{FOLDER_NAME}"', 'Новые договоры']:
try: try:
mail.select(folder, readonly=False) server.select_folder("Новые договоры")
folder_found = True except:
logging.info(f"Открыта папка: {folder}") # Если не работает, пробуем кодированное имя
break server.select_folder("&BB8EPgQ0BDoEOwROBEcENQQ9BDgETw-")
except imaplib.IMAP4.error:
continue
if not folder_found: # Ищем непрочитанные
status, folders = mail.list() messages = server.search(['UNSEEN'])
logging.error("Не найдена папка 'Новые договоры'. Доступные папки:") if not messages:
for f in folders:
logging.error(f" {f.decode('utf-8')}")
mail.logout()
return [] 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 = [] new_emails = []
for e_id in email_ids: for msg_id in messages:
status, msg_data = mail.fetch(e_id, '(RFC822)') # Получаем письмо
if status != 'OK': data = server.fetch([msg_id], ['BODY[]', 'ENVELOPE'])
continue envelope = data[msg_id][b'ENVELOPE']
for response_part in msg_data: # Получаем тело
if isinstance(response_part, tuple): body_data = data[msg_id][b'BODY[]']
msg = email.message_from_bytes(response_part[1]) if body_data:
# Парсим тело
import email
msg = email.message_from_bytes(body_data)
# Получаем тело письма (только text/plain)
body = "" body = ""
if msg.is_multipart(): if msg.is_multipart():
for part in msg.walk(): for part in msg.walk():
@@ -134,13 +121,10 @@ def fetch_new_emails():
"received_date": datetime.now().strftime("%Y-%m-%d %H:%M:%S") "received_date": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
}) })
logging.info(f"✓ Найдено: договор {contract_number}, оператор {operator_name}") 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: except Exception as e: