Обновить parser.py
This commit is contained in:
@@ -58,7 +58,7 @@ def decode_header_value(value):
|
||||
def parse_email_body(body_text):
|
||||
"""Извлекает имя оператора и номер договора из HTML письма"""
|
||||
# Ищем в 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)
|
||||
|
||||
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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user