Обновить parser.py
This commit is contained in:
@@ -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)
|
||||||
|
server.select_folder("Новые договоры")
|
||||||
|
|
||||||
# Пробуем открыть папку с русским названием
|
# Ищем все письма (для теста), потом замените на ['UNSEEN']
|
||||||
try:
|
messages = server.search(['ALL'])
|
||||||
server.select_folder("Новые договоры")
|
logging.info(f"Найдено писем в папке: {len(messages)}")
|
||||||
except:
|
|
||||||
# Если не работает, пробуем кодированное имя
|
|
||||||
server.select_folder("&BB8EPgQ0BDoEOwROBEcENQQ9BDgETw-")
|
|
||||||
|
|
||||||
# Ищем непрочитанные
|
|
||||||
messages = server.search(['UNSEEN'])
|
|
||||||
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[]']
|
||||||
|
|
||||||
# Получаем тело
|
if not body_data:
|
||||||
body_data = data[msg_id][b'BODY[]']
|
continue
|
||||||
if body_data:
|
|
||||||
# Парсим тело
|
|
||||||
import email
|
|
||||||
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}")
|
||||||
server.add_flags(msg_id, ['\\Seen'])
|
|
||||||
|
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
|
return new_emails
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user