feat(modefied)

This commit is contained in:
Black_Raven committed 2026-03-17 12:08:19 +03:00
1 parent d705f2f9d3
commit e3110c3897
12 files changed
+237 -63

No files matched your search

+127
View File
@@ -0,0 +1,127 @@
import os
import smtplib
import logging
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from pathlib import Path
# Настройка логирования
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
def send_pdf_to_email(recipient_email, pdf_filename=None, subject="PDF документ", body_text=None):
# Настройки Яндекс.Почты
SMTP_SERVER = "smtp.yandex.ru"
SMTP_PORT = 587
SENDER_EMAIL = "w0ron.black@yandex.ru"
# Получаем пароль из переменной окружения
SENDER_PASSWORD = os.environ.get('EMAIL_PASS')
if not SENDER_PASSWORD:
logger.error("Не найдена переменная окружения EMAIL_PASS")
return False
# Путь к папке с PDF файлами
data_folder = Path("./data")
if not data_folder.exists():
logger.error(f"Папка {data_folder.absolute()} не существует")
return False
# Определяем файл для отправки
if pdf_filename:
pdf_path = data_folder / pdf_filename
if not pdf_path.exists():
logger.error(f"Файл {pdf_filename} не найден в папке {data_folder}")
return False
else:
# Ищем первый PDF файл в папке
pdf_files = list(data_folder.glob("*.pdf"))
if not pdf_files:
logger.error("В папке нет PDF файлов")
return False
pdf_path = pdf_files[0]
logger.info(f"Найден файл: {pdf_path.name}")
# Проверяем размер файла (Яндекс ограничивает вложения до 30 МБ)
file_size_mb = pdf_path.stat().st_size / (1024 * 1024)
if file_size_mb > 30:
logger.error(f"Файл слишком большой: {file_size_mb:.2f} МБ (максимум 30 МБ)")
return False
# Текст письма по умолчанию
if body_text is None:
body_text = f"""
Здравствуйте!
Во вложении находится PDF документ: {pdf_path.name}
С уважением,
Отправитель
"""
# Создаем сообщение
msg = MIMEMultipart()
msg['From'] = SENDER_EMAIL
msg['To'] = recipient_email
msg['Subject'] = subject
msg['Reply-To'] = SENDER_EMAIL
# Добавляем текст письма с правильной кодировкой
msg.attach(MIMEText(body_text, 'plain', 'utf-8'))
try:
# Добавляем PDF файл
with open(pdf_path, 'rb') as file:
pdf_attachment = MIMEApplication(file.read(), _subtype='pdf')
pdf_attachment.add_header(
'Content-Disposition',
'attachment',
filename=('utf-8', '', pdf_path.name) # Поддержка русских имен файлов
)
msg.attach(pdf_attachment)
# Подключаемся к серверу Яндекс.Почты
logger.info("Подключение к серверу Яндекс.Почты...")
server = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
server.starttls()
server.login(SENDER_EMAIL, SENDER_PASSWORD)
# Отправляем письмо
server.send_message(msg)
server.quit()
logger.info(f"✅ Письмо успешно отправлено на {recipient_email}")
logger.info(f"📎 Файл: {pdf_path.name} ({file_size_mb:.2f} МБ)")
return True
except smtplib.SMTPAuthenticationError:
logger.error("❌ Ошибка аутентификации. Проверьте пароль в переменной EMAIL_PASS")
return False
except smtplib.SMTPException as e:
logger.error(f"❌ Ошибка SMTP: {e}")
return False
except Exception as e:
logger.error(f"❌ Неожиданная ошибка: {e}")
return False
def send_pdf_to_multiple(recipient_emails, pdf_filename=None, subject="PDF документ", body_text=None):
"""
Отправляет PDF файл нескольким получателям
Args:
recipient_emails (list): Список email получателей
pdf_filename (str, optional): Имя PDF файла
subject (str): Тема письма
body_text (str): Текст письма
Returns:
dict: Словарь с результатами для каждого получателя
"""
results = {}
for email in recipient_emails:
results[email] = send_pdf_to_email(email, pdf_filename, subject, body_text)
return results