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