fix(email): Fix func for sending email
This commit is contained in:
1 parent
beb94d2b0d
commit
b21d2bb031
1 file changed
+36
-91
+36
-91
@@ -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
|
|
||||||
Reference in new issue
Block a user