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