Контрактный интерфейс для отправки писем

Определите абстрактный 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-сервером не гарантирует доставку в почтовый ящик. В тестах передавайте поддельный клиент, не отправляя настоящие письма.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее