Обновить parser.py

This commit is contained in:
2026-06-11 11:41:11 +00:00
parent 4c04d7519b
commit 5e48c893c6
+30 -21
View File
@@ -58,7 +58,7 @@ def decode_header_value(value):
def parse_email_body(body_text): def parse_email_body(body_text):
"""Извлекает имя оператора и номер договора из HTML письма""" """Извлекает имя оператора и номер договора из HTML письма"""
# Ищем в HTML: Оператор Имя создал новый договор <b>номер</b> # Ищем в HTML: Оператор Имя создал новый договор <b>номер</b>
pattern = r'Оператор\s+([А-Яа-я\s]+?)\s+создал\s+новый\s+договор\s+<b>(\d+)</b>' pattern = r'Оператор\s+([A-Za-zА-Яа-я\s]+?)\s+создал\s+новый\s+договор\s+<b>(\d+)</b>'
match = re.search(pattern, body_text, re.IGNORECASE) match = re.search(pattern, body_text, re.IGNORECASE)
if match: if match:
@@ -73,46 +73,45 @@ def fetch_new_emails():
try: try:
with IMAPClient(IMAP_SERVER, ssl=True) as server: with IMAPClient(IMAP_SERVER, ssl=True) as server:
server.login(EMAIL_USER, EMAIL_PASSWORD) server.login(EMAIL_USER, EMAIL_PASSWORD)
# Пробуем открыть папку с русским названием
try:
server.select_folder("Новые договоры") server.select_folder("Новые договоры")
except:
# Если не работает, пробуем кодированное имя
server.select_folder("&BB8EPgQ0BDoEOwROBEcENQQ9BDgETw-")
# Ищем непрочитанные # Ищем все письма (для теста), потом замените на ['UNSEEN']
messages = server.search(['UNSEEN']) messages = server.search(['ALL'])
logging.info(f"Найдено писем в папке: {len(messages)}")
if not messages: if not messages:
return [] return []
new_emails = [] new_emails = []
for msg_id in messages: for msg_id in messages[-10:]: # последние 10 писем
# Получаем письмо try:
data = server.fetch([msg_id], ['BODY[]', 'ENVELOPE']) data = server.fetch([msg_id], ['BODY[]'])
envelope = data[msg_id][b'ENVELOPE']
# Получаем тело
body_data = data[msg_id][b'BODY[]'] body_data = data[msg_id][b'BODY[]']
if body_data:
# Парсим тело if not body_data:
import email continue
msg = email.message_from_bytes(body_data) msg = email.message_from_bytes(body_data)
# Извлекаем тело письма (HTML)
body = "" body = ""
if msg.is_multipart(): if msg.is_multipart():
for part in msg.walk(): 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) payload = part.get_payload(decode=True)
if payload: if payload:
body += payload.decode('utf-8', errors='ignore') body = payload.decode('utf-8', errors='ignore')
break break
else: else:
payload = msg.get_payload(decode=True) payload = msg.get_payload(decode=True)
if payload: if payload:
body = payload.decode('utf-8', errors='ignore') body = payload.decode('utf-8', errors='ignore')
if not body:
continue
# Парсим имя и номер
operator_name, contract_number = parse_email_body(body) operator_name, contract_number = parse_email_body(body)
if operator_name and contract_number: 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") "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.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']) server.add_flags(msg_id, ['\\Seen'])
except:
pass
return new_emails return new_emails