"""Отправка email-уведомлений о заявках на корпоративную почту. Доступы берутся из .env (см. .env.example). Если SMTP не настроен, функция тихо пропускает отправку и возвращает False, не ломая основной поток. """ import smtplib import logging from typing import Optional from email.mime.text import MIMEText from email.header import Header from email.utils import formataddr import config logger = logging.getLogger("VK_Bot_IKP.mailer") def is_configured() -> bool: """Проверяет, заданы ли минимальные параметры SMTP для отправки писем.""" return bool( getattr(config, "SMTP_HOST", "") and getattr(config, "SMTP_USER", "") and getattr(config, "SMTP_PASSWORD", "") and getattr(config, "MAIL_TO", "") ) def send_email(subject: str, body: str, mail_to: Optional[str] = None) -> bool: """Отправляет письмо. По умолчанию на config.MAIL_TO; можно указать другой адрес (например, HR).""" if not is_configured(): logger.info("[MAIL] Пропущено: SMTP не настроен в .env (SMTP_HOST/SMTP_USER/SMTP_PASSWORD/MAIL_TO).") return False host = config.SMTP_HOST port = int(getattr(config, "SMTP_PORT", 465)) user = config.SMTP_USER password = config.SMTP_PASSWORD mail_from = getattr(config, "MAIL_FROM", "") or user mail_to = mail_to or config.MAIL_TO use_ssl = bool(getattr(config, "SMTP_USE_SSL", True)) msg = MIMEText(body, "plain", "utf-8") msg["Subject"] = Header(subject, "utf-8") msg["From"] = formataddr((str(Header("Бот ИКП", "utf-8")), mail_from)) msg["To"] = mail_to try: if use_ssl: with smtplib.SMTP_SSL(host, port, timeout=15) as server: server.login(user, password) server.sendmail(mail_from, [a.strip() for a in mail_to.split(",")], msg.as_string()) else: with smtplib.SMTP(host, port, timeout=15) as server: server.starttls() server.login(user, password) server.sendmail(mail_from, [a.strip() for a in mail_to.split(",")], msg.as_string()) logger.info(f"[MAIL] Письмо отправлено на {mail_to}: {subject}") return True except Exception as e: logger.error(f"[MAIL] Ошибка отправки письма: {e}") return False