# Отправка e-mail

В Nextbot уже есть действие [Админу в мессенджер](/functional/functions/sending-result/adminu-v-messendzher.md), через которое можно получать уведомления в `Telegram`, `WhatsApp`, `MAX` и другие каналы.

Если похожее уведомление нужно отправлять не в мессенджер, а на e-mail менеджера, это можно сделать через `Python Script`.

В этой статье рассмотрим простой сценарий: пользователь оставил данные, а менеджеру приходит письмо с уведомлением о новой заявке.

{% hint style="info" %}
Это не отдельное встроенное действие Nextbot, а пример реализации через `Python Script`. Логика одинаковая для `Mail.ru`, `Gmail` и `Яндекс.Почты`: меняются только SMTP-настройки и способ получения пароля приложения.
{% endhint %}

## Что понадобится

* функция, в которой уже собираются данные клиента
* действие `Python Script`
* e-mail отправителя
* пароль приложения от почтового провайдера
* e-mail менеджера, на который будут приходить уведомления
* обязательная переменная `result`

## Какие данные будем отправлять менеджеру

Для примера ниже используем 3 параметра функции:

| Имя параметра | Тип параметра | Что передаём                                    |
| ------------- | ------------- | ----------------------------------------------- |
| `client_name` | Строка        | Имя клиента                                     |
| `phone`       | Строка        | Телефон клиента                                 |
| `question`    | Строка        | Что хочет клиент или с каким вопросом обратился |

Если в вашей функции уже используются другие параметры, просто подставьте их вместо этих значений.

## Общий принцип

* e-mail менеджера в примере задаётся прямо в коде в переменной `manager_email`
* данные клиента берутся из `args`, например: `args.get("client_name", "")`
* `debug()` помогает смотреть логи выполнения во время теста
* `result` обязателен: его получает ИИ-агент после выполнения скрипта
* в среде `Python Script` уже доступны `smtplib`, `ssl` и `MIMEText`, поэтому дополнительные зависимости не нужны

{% stepper %}
{% step %}
**Шаг 1. Создайте или откройте функцию**

Создайте новую функцию, например `send_manager_email`, или откройте существующую функцию, после которой менеджер должен получать уведомление на почту.
{% endstep %}

{% step %}
**Шаг 2. Добавьте параметры функции**

Если данные клиента ещё не передаются в функцию, добавьте параметры:

| Имя параметра | Тип параметра | Инструкция для параметра          |
| ------------- | ------------- | --------------------------------- |
| `client_name` | Строка        | Имя клиента                       |
| `phone`       | Строка        | Телефон клиента                   |
| `question`    | Строка        | Кратко передай, что нужно клиенту |

Внутри `Python Script` эти значения можно получить так:

```python
client_name = args.get("client_name", "").strip()
phone = args.get("phone", "").strip()
question = args.get("question", "").strip()
```

{% endstep %}

{% step %}
**Шаг 3. Выберите почтового провайдера**

Ниже в разделе `Настройки SMTP-провайдера` выберите ваш вариант: `Mail.ru`, `Gmail` или `Яндекс.Почта`.

Из этого блока вам понадобятся значения для:

* `smtp_server`
* `smtp_port`
* `sender_email`
* `sender_password`
  {% endstep %}

{% step %}
**Шаг 4. Вставьте Python-скрипт**

Подставьте в код ниже SMTP-настройки вашего провайдера и e-mail менеджера.

{% code overflow="wrap" %}

```python
try:
    debug("Подготовка уведомления менеджеру по email...")

    smtp_server = "smtp.example.com"
    smtp_port = 465

    sender_email = "your_email@example.com"
    sender_password = "пароль_приложения"
    manager_email = "manager@example.com"

    client_name = args.get("client_name", "").strip()
    phone = args.get("phone", "").strip()
    question = args.get("question", "").strip()

    subject = "Новая заявка из Nextbot"
    body = (
        "В Nextbot поступила новая заявка.\n\n"
        f"Имя: {client_name or 'не указано'}\n"
        f"Телефон: {phone or 'не указан'}\n"
        f"Запрос: {question or 'не указан'}\n"
    )

    MIMEText = email["mime"]["text"]["MIMEText"]
    msg = MIMEText(body, "plain", "utf-8")
    msg.add_header("Subject", subject)
    msg.add_header("From", sender_email)
    msg.add_header("To", manager_email)

    context = ssl.create_default_context()
    with smtplib.SMTP_SSL(smtp_server, smtp_port, context=context) as server:
        debug("Подключение к SMTP-серверу...")
        server.login(sender_email, sender_password)
        debug("Успешный вход")
        server.sendmail(sender_email, [manager_email], msg.as_string())
        debug("Уведомление отправлено менеджеру")

    result = {
        "status": "success",
        "message": "Уведомление менеджеру отправлено",
        "manager_email": manager_email
    }

except Exception as e:
    debug(f"Ошибка при отправке email: {str(e)}")
    result = {
        "status": "error",
        "message": str(e)
    }
```

{% endcode %}
{% endstep %}

{% step %}
**Шаг 5. Сохраните и протестируйте код**

1. Включите **режим отладки** в `Python Script`.
2. Нажмите **«Тестировать код»**.
3. Передайте тестовые значения, например:
   * `client_name`: `Иван`
   * `phone`: `79991112233`
   * `question`: `Хочет узнать стоимость и сроки`
4. Нажмите **«Запустить тест»**.

При успешной отправке в логах появятся сообщения о подключении, входе и отправке письма, а в `result` вернётся статус `success`.
{% endstep %}

{% step %}
**Шаг 6. Добавьте инструкцию в системный промпт**

После сохранения функции укажите в системном промпте, когда агент должен отправлять уведомление менеджеру.

Пример:

> Если пользователь оставил контактные данные или просит передать информацию менеджеру, вызови функцию `send_manager_email` и передай `client_name`, `phone` и `question`.
> {% endstep %}
> {% endstepper %}

## Настройки SMTP-провайдера

{% tabs %}
{% tab title="Mail.ru" %}

1. Откройте почту `Mail.ru`.
2. Перейдите в **Настройки → Все настройки → Безопасность → Пароли для внешних приложений**.
3. Нажмите **«Создать»** и сохраните сгенерированный пароль.
4. Если сервис попросит выбрать тип доступа, выберите вариант для отправки писем через SMTP.

Официальная справка `Mail.ru`: [пароль для внешнего приложения](https://help.mail.ru/mail/faq/password/external/) и [настройка почтовой программы](https://help.mail.ru/mail/login/mailer/).

```python
smtp_server = "smtp.mail.ru"
smtp_port = 465
sender_email = "your_email@mail.ru"
sender_password = "пароль_приложения"
```

{% endtab %}

{% tab title="Gmail" %}

1. Включите **двухфакторную аутентификацию** в аккаунте Google.
2. Создайте **пароль приложения**: [App Passwords](https://myaccount.google.com/apppasswords).
3. Подставьте значения в переменные `smtp_server`, `smtp_port`, `sender_email`, `sender_password`.

```python
smtp_server = "smtp.gmail.com"
smtp_port = 465
sender_email = "your_email@gmail.com"
sender_password = "16-значный_пароль_приложения"
```

{% endtab %}

{% tab title="Яндекс.Почта" %}

1. Убедитесь, что для ящика разрешена работа с почтовыми клиентами.
2. Создайте пароль приложения в `Яндекс ID`.
3. Подставьте значения в переменные `smtp_server`, `smtp_port`, `sender_email`, `sender_password`.

Официальная справка Яндекса: [Другие программы](https://yandex.ru/support/mail/mail-clients/others.html).

```python
smtp_server = "smtp.yandex.ru"
smtp_port = 465
sender_email = "your_name@yandex.ru"
sender_password = "пароль_приложения"
```

{% endtab %}
{% endtabs %}

## Дополнительные варианты

<details>

<summary><strong>Если нужно отправлять копию второму менеджеру или руководителю</strong></summary>

К основному примеру выше добавьте:

```python
cc_email = "head@example.com"
msg.add_header("Cc", cc_email)

recipients = [manager_email, cc_email]
server.sendmail(sender_email, recipients, msg.as_string())
```

Важно: в `sendmail` нужно передавать список всех получателей, а не только основной e-mail.

</details>

<details>

<summary><strong>Если данные приходят из формы персональных данных</strong></summary>

Вместо `args.get("client_name", "")`, `args.get("phone", "")` и `args.get("question", "")` можно брать значения из формы:

```python
form_data = args.get("form_data", {})

client_name = form_data.get("client_name", "").strip()
phone = form_data.get("phone", "").strip()
question = form_data.get("question", "").strip()
customer_email = form_data.get("email", "").strip()
```

Если нужно, `customer_email` тоже можно добавить в текст письма менеджеру.

</details>

{% hint style="warning" %}
Перед запуском проверьте:

* используется пароль приложения, а не обычный пароль от почты
* в `manager_email` указан правильный адрес менеджера
* первый тест лучше отправить на свой адрес
* после теста проверьте папку `Спам`
  {% endhint %}

## Частые ошибки

* **Менеджеру приходят пустые поля**\
  Значит, значения `client_name`, `phone` или `question` не были переданы в функцию.
* **Ошибка авторизации на SMTP-сервере**\
  Обычно это значит, что используется обычный пароль от почты вместо пароля приложения.
* **Письмо не найдено во входящих**\
  Проверьте папки `Спам` и `Промоакции`, а также правильность адреса в `manager_email`.
* **Непонятно, где смотреть причину ошибки**\
  Включите режим отладки и посмотрите сообщения, отправленные через `debug()`.

{% hint style="info" %}
Если вам подходят `Telegram`, `WhatsApp`, `MAX` и другие каналы без написания кода, используйте действие [Админу в мессенджер](/functional/functions/sending-result/adminu-v-messendzher.md).

Больше информации о `Python Script` — в статье [Python](/functional/functions/sending-result/python.md).
{% endhint %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://doc.nextbot.ru/functional/functions/sending-result/python/otpravka-e-mail.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
