Автоматизация рутины: пишем бота на Python для автоответов на письма

📩 На Python можно легко написать бота, который будет автоматически отвечать на входящие сообщения. В статье разберём пример кода, покажем базовый сценарий и идеи для улучшения, чтобы освободить ваше время для более важных задач

РазработкаPython

6 мин

Зачем это нужно в 2025? 🕒

Почта всё ещё — основной канал общения с клиентами и партнёрами. На деле 60–80% входящих — рутина: подтверждения, повторяющиеся вопросы, «добрый день, подскажите…». Бот освобождает часы в неделю, ускоряет ответ пользователю и снижает вероятность «залеживания» писем.

Что будем строить ⚙️

  • Мини-бот на IMAP + SMTP для базового автоответа.

  • Маршрутизация по ключевым словам (например, «оплата», «сотрудничество»).

  • Конспект «как перейти» на Gmail API (OAuth 2.0) для надёжности.

  • План развёртывания: cron / APScheduler, логирование, Docker.

  • Секьюрити-минимум: .env, App Password, ограничение частоты.

Ниже — минимальный рабочий вариант.

# pip install python-dotenv
import os, imaplib, smtplib, email
from email.mime.text import MIMEText
from dotenv import load_dotenv

load_dotenv()
IMAP = os.getenv("IMAP_SERVER", "imap.gmail.com")
SMTP = os.getenv("SMTP_SERVER", "smtp.gmail.com")
EMAIL = os.getenv("EMAIL_ADDRESS")
PASS  = os.getenv("EMAIL_PASSWORD")  # App Password для Gmail

def send_reply(to_addr:str, subject:str):
    msg = MIMEText("Спасибо! Мы получили ваше письмо и ответим в ближайшее время.")
    msg["Subject"] = f"Re: {subject or ''}".strip()
    msg["From"] = EMAIL
    msg["To"] = to_addr
    with smtplib.SMTP_SSL(SMTP, 465) as smtp:
        smtp.login(EMAIL, PASS)
        smtp.sendmail(EMAIL, [to_addr], msg.as_string())

with imaplib.IMAP4_SSL(IMAP) as imap:
    imap.login(EMAIL, PASS)
    imap.select("INBOX")
    status, data = imap.search(None, '(UNSEEN)')
    ids = data[0].split()
    for msg_id in ids:
        _, raw = imap.fetch(msg_id, "(RFC822)")
        msg = email.message_from_bytes(raw[0][1])
        sender = email.utils.parseaddr(msg.get("From",""))[1]
        subj   = msg.get("Subject","")
        if sender:
            send_reply(sender, subj)
        # пометить как прочитанное
        imap.store(msg_id, '+FLAGS', '\\Seen')

💡 Совет: во время тестов добавьте «сухой режим» (dry-run), чтобы логировать действия вместо реальной отправки.

Умнее: ответы по ключевым словам 🧭

Простейшая логика: смотрим на тему и тело письма, выбираем шаблон ответа.

KEYMAP = {
    "оплата": "По оплате: счет отправлен, сроки — 1-2 банковских дня. Если нужен акт — ответьте на это письмо.",
    "сотрудничество": "Рады интересу! Напишите коротко о вашей аудитории и формате — вернёмся с предложением.",
    "техподдержка": "Опишите шаги воспроизведения и пришлите скриншоты/логи — поможем оперативно."
}
DEFAULT = "Спасибо за письмо! Мы на связи и вернемся с ответом в ближайшее время."

def choose_reply(subject:str, body:str) -> str:
    text = f"{subject} {body}".lower()
    for key, template in KEYMAP.items():
        if key in text:
            return template
    return DEFAULT

Можно расширить до простого «интента»: искать несколько ключей, считать «вес» совпадений и выбирать лучший шаблон.

Развёртывание и эксплуатация 🚀

  • Планировщик: cron, APScheduler или systemd-timer.

  • Docker: закрепите версию Python и зависимостей, подключите .env как секрет.

  • Логи: уровень INFO для нормальной работы и WARNING/ERROR для сбоев; отправляйте ошибки в Telegram/Slack.

  • Ограничение частоты: не отвечайте чаще 1 раза на адрес в сутки; ведите кэш «ответов за последние 24 часа».

  • A/B: тестируйте тексты автоответов и тему письма — влияет на дальнейшую коммуникацию.

Безопасность и этика 🔒

  • Храните секреты в .env, используйте App Password или OAuth 2.0, не коммитьте токены в репозиторий.

  • Добавьте в ответ «вы получили автоответ» и способ связаться с человеком.

  • Ведите белый список доменов/адресов для автоматических действий; спорные письма оставляйте на ручной разбор.

  • Соблюдайте политику почтового провайдера и закон о персональных данных.

📊 Что может делать почтовый бот на Python

Сценарий

Что делает бот

Польза

Автоответ

«Спасибо, письмо получили» + ожидание сроков

Снимает рутину, ускоряет first response

Фильтрация

Кладёт в папки: «оплата», «сотрудничество», «поддержка»

Инбокс без хаоса

Пересылка

Отправляет вопросы по оплате — бухгалтеру, интеграции — техподдержке

Быстрый роутинг

Ключевые слова

Выбирает шаблон по содержимому письма

Более уместные ответы

Интеграция с CRM

Создаёт лид/сделку, подтаскивает контакт

Прозрачная воронка

ИИ-ответ

Формирует текст через LLM по краткому резюме письма

Человечный тон, меньше ручной работы

Идеи апгрейдов 💡

  • Резюме письма: извлекайте краткий конспект и подставляйте в ответ.

  • Шаблоны с переменными: имя отправителя, номер заказа, дедлайн.

  • Анти-петля: не отвечать на автоответы/но-реплай, проверять заголовки Auto-Submitted.

  • Мультиязычность: определяйте язык письма и подбирайте шаблон.

📎 Храните шаблоны в JSON/YAML и катите изменения без релиза кода.

В Кодике мы делаем обучение программированию увлекательным и понятным: у нас есть интересные курсы с заданиями, которые помогают прокачивать навыки шаг за шагом.

А ещё у нас есть активный telegram-канал, где мы обсуждаем крутые идеи, делимся опытом и вместе разбираем задачи — учиться становится не только полезно, но и весело.

Оставьте комментарий: какой сценарий автоответов нужен именно вам — «оплата», «поддержка», «сотрудничество» или что-то своё?

Комментарии