Определите абстрактный send с четырьмя параметрами и реализуйте SMTP-адаптер. Сборку письма, настройки транспорта и обработку ошибок держите внутри реализации.
Контрактный интерфейс для отправки писем
Определите абстрактный send с четырьмя параметрами и реализуйте SMTP-адаптер. Сборку письма, настройки транспорта и обработку ошибок держите внутри реализации.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Разработать интерфейс (или абстрактный класс), определяющий обязательный метод отправки электронной корреспонденции. Метод send должен принимать параметры: получатель (recipient), отправитель (sender), тема письма (title) и тело сообщения (content). Далее предоставить одну из реализаций — традиционный почтовый клиент.
Ответ
Определите абстрактный send с четырьмя параметрами и реализуйте SMTP-адаптер. Сборку письма, настройки транспорта и обработку ошибок держите внутри реализации.
from abc import ABC, abstractmethod
from email.message import EmailMessage
class Mailer(ABC):
@abstractmethod
def send(self, recipient: str, sender: str,
title: str, content: str) -> None:
pass
class SmtpMailer(Mailer):
def __init__(self, smtp_client):
self.client = smtp_client
def send(self, recipient, sender, title, content):
message = EmailMessage()
message['To'] = recipient
message['From'] = sender
message['Subject'] = title
message.set_content(content)
refused = self.client.send_message(message)
if refused:
raise RuntimeError('SMTP отклонил получателя')
Соединение создаётся снаружи с timeout, TLS и учётными данными из защищённой конфигурации. Исключения не следует скрывать сообщением об успехе. Принятие SMTP-сервером не гарантирует доставку в почтовый ящик. В тестах передавайте поддельный клиент, не отправляя настоящие письма.