fix(email): Fix func for sending email

This commit is contained in:
Black_Raven committed 2026-03-30 20:47:47 +03:00
1 parent beb94d2b0d
commit b21d2bb031
1 file changed
+36 -91
+36 -91
View File
@@ -1,103 +1,66 @@
import os import os
import smtplib import smtplib
import logging import logging
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText from email.mime.text import MIMEText
from email.mime.application import MIMEApplication from email.mime.multipart import MIMEMultipart
from pathlib import Path
# Настройка логирования # Настройка логирования
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
def send_pdf_to_email(recipient_email, pdf_filename=None, subject="PDF документ", body_text=None): def send_lead_to_email(name, phone, email):
"""
Отправляет информацию о заявке на фиксированный email rkplastic@mail.ru.
Args:
name (str): ФИО клиента
phone (str): Телефон клиента
email (str): Email клиента
Returns:
bool: True если отправка успешна, иначе False
"""
# Настройки Яндекс.Почты # Настройки Яндекс.Почты
SMTP_SERVER = "smtp.yandex.ru" SMTP_SERVER = "smtp.yandex.ru"
SMTP_PORT = 587 SMTP_PORT = 587
SENDER_EMAIL = "w0ron.black@yandex.ru" SENDER_EMAIL = "w0ron.black@yandex.ru"
# Получаем пароль из переменной окружения
SENDER_PASSWORD = os.environ.get('EMAIL_PASS') SENDER_PASSWORD = os.environ.get('EMAIL_PASS')
RECIPIENT_EMAIL = "rkplastic@mail.ru"
if not SENDER_PASSWORD: if not SENDER_PASSWORD:
logger.error("Не найдена переменная окружения EMAIL_PASS") logger.error("❌ Не найдена переменная окружения EMAIL_PASS")
return False return False
# Путь к папке с PDF файлами # Тема и текст письма
data_folder = Path("./data") subject = "Новая заявка с сайта"
body = f"""На сайте оставлена заявка:
if not data_folder.exists(): Имя: {name}
logger.error(f"Папка {data_folder.absolute()} не существует") Телефон: {phone}
return False Почта: {email}
"""
# Определяем файл для отправки
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 = MIMEMultipart()
msg['From'] = SENDER_EMAIL msg['From'] = SENDER_EMAIL
msg['To'] = recipient_email msg['To'] = RECIPIENT_EMAIL
msg['Subject'] = subject msg['Subject'] = subject
msg['Reply-To'] = SENDER_EMAIL msg['Reply-To'] = SENDER_EMAIL
# Добавляем текст письма с правильной кодировкой # Добавляем текст в кодировке UTF-8
msg.attach(MIMEText(body_text, 'plain', 'utf-8')) msg.attach(MIMEText(body, 'plain', 'utf-8'))
try: try:
# Добавляем PDF файл logger.info(f"Подключение к SMTP-серверу {SMTP_SERVER}:{SMTP_PORT}...")
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 = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
server.starttls() server.starttls()
server.login(SENDER_EMAIL, SENDER_PASSWORD) server.login(SENDER_EMAIL, SENDER_PASSWORD)
# Отправляем письмо
server.send_message(msg) server.send_message(msg)
server.quit() server.quit()
logger.info(f"✅ Письмо успешно отправлено на {recipient_email}") logger.info(f"✅ Заявка успешно отправлена на {RECIPIENT_EMAIL}")
logger.info(f"📎 Файл: {pdf_path.name} ({file_size_mb:.2f} МБ)")
return True return True
except smtplib.SMTPAuthenticationError: except smtplib.SMTPAuthenticationError:
logger.error("❌ Ошибка аутентификации. Проверьте пароль в переменной EMAIL_PASS") logger.error("❌ Ошибка аутентификации. Проверьте пароль в переменной EMAIL_PASS")
return False return False
@@ -107,21 +70,3 @@ def send_pdf_to_email(recipient_email, pdf_filename=None, subject="PDF доку
except Exception as e: except Exception as e:
logger.error(f"❌ Неожиданная ошибка: {e}") logger.error(f"❌ Неожиданная ошибка: {e}")
return False 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