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