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