简体中文 English 繁體中文 日本語 Русский
本文为静态镜像,内容以交互版为准 在交互式文档中心打开 →

Документация по функциональным возможностям почтовой платформы

EmailAdapter — это почтовый адаптер, основанный на протоколах SMTP/IMAP, поддерживающий отправку, получение и обработку электронной почты.


Информация о документации

Основная информация

Инструкция по конфигурации

Глобальная конфигурация (EmailAdapter)

Параметр Тип Значение по умолчанию Описание
imap_server str imap.example.com Адрес сервера IMAP по умолчанию
imap_port int 993 Порт IMAP по умолчанию
smtp_server str smtp.example.com Адрес сервера SMTP по умолчанию
smtp_port int 465 Порт SMTP по умолчанию
ssl bool true Использовать SSL по умолчанию
timeout int 30 Время ожидания подключения по умолчанию (секунды)
poll_interval int 60 Интервал опроса IMAP (секунды)
max_retries int 3 Максимальное количество попыток при неудачном подключении

Конфигурация аккаунта (EmailAdapter.accounts)

Каждый аккаунт соответствует отдельной электронной почте. Конфигурация аккаунта имеет приоритет над глобальной конфигурацией.

[EmailAdapter.accounts.default]
email = "[email protected]"
password = "your-password-or-auth-code"
imap_server = "imap.example.com"    # Опционально, оставьте пустым для использования глобального значения по умолчанию
imap_port = 993                      # Опционально
smtp_server = "smtp.example.com"    # Опционально
smtp_port = 465                      # Опционально
ssl = true                           # Опционально
timeout = 30                         # Опционально
enabled = true

[EmailAdapter.accounts.backup]
email = "[email protected]"
password = "another-password"
enabled = true

Обновление парадигмы v5 (4.2.0)


Поддерживаемые возможности платформ

Типы поддерживаемых отправляемых сообщений

Все методы отправки реализованы с использованием цепочечного синтаксиса:

from ErisPulse.Core import adapter
mail = adapter.get("email")

# Простое текстовое письмо
await mail.Send.To("private", "[email protected]").Subject("Тест").Text("Содержание")

# HTML-письмо с вложениями
await mail.Send.To("private", "[email protected]") \
    .Subject("HTML-письмо") \
    .Cc(["[email protected]", "[email protected]"]) \
    .Attachment("report.pdf") \
    .Html("<h1>HTML-содержание</h1>")

# Использование Raw_ob12 для отправки стандартных сообщений OB12
await mail.Send.To("private", "[email protected]").Raw_ob12([
    {"type": "text", "data": {"text": "Текст письма"}},
    {"type": "file", "data": {"file": "/path/to/attachment.pdf"}},
])

# Указание учетной записи для отправки (множественные учетные записи)
await mail.Send.Using("default").To("private", "[email protected]").Text("Содержание")

Важно: при использовании цепочечного синтаксиса методы с параметрами (Subject / Cc / Attachment и т.д.) должны вызываться до методов отправки (Text / Html / Raw_ob12).

Основные методы отправки

Метод Описание
.Text(text: str) Отправка текстового письма
.Html(html: str) Отправка письма в формате HTML
.Raw_ob12(message, **kwargs) Отправка сообщения в формате OneBot12

Методы цепочечного синтаксиса (возвращают self, могут использоваться в комбинации)

Метод Описание
.Subject(subject: str) Установка темы письма
.Cc(emails: Union[str, List[str]]) Установка адресов копии
.Bcc(emails: Union[str, List[str]]) Установка адресов скрытой копии
.ReplyTo(email: str) Установка адреса для ответа
.Attachment(file, filename: str = None) Добавление вложения

Обратное преобразование OB12-сегментов сообщений (Raw_ob12)

OB12-сегмент Преобразование в содержимое письма
text Текстовое содержимое
image Вложение-изображение
video Вложение-видео
file Вложение-файл
audio Вложение-аудио
markdown Преобразование в HTML-содержимое

Типы событий, специфичные для почты

Основные различия

  1. Все почтовые события имеют тип message, а detail_type всегда равен private
  2. user_id — это чистый адрес электронной почты отправителя, а user_nickname — отображаемое имя отправителя
  3. Сегмент message сообщения имеет стандартный формат OB12 (сегмент text + сегмент file)
  4. Тема письма доступна через расширенное поле email_subject
  5. Полные исходные данные сохраняются в поле email_raw

Событие нового письма (email_new)

{
  "id": "<[email protected]>",
  "time": 1751990446,
  "type": "message",
  "detail_type": "private",
  "platform": "email",
  "self": {
    "platform": "email",
    "user_id": "[email protected]"
  },
  "message": [
    {
      "type": "text",
      "data": {
        "text": "Содержимое тела письма"
      }
    }
  ],
  "alt_message": "Тема письма",
  "user_id": "[email protected]",
  "user_nickname": "Saber"
}

Письмо с вложением

{
  "message": [
    {
      "type": "text",
      "data": {
        "text": "Пожалуйста, проверьте вложение"
      }
    },
    {
      "type": "file",
      "data": {
        "file_id": "document.pdf",
        "file_name": "document.pdf",
        "size": 102400
      }
    }
  ]
}

Событие ответа на письмо (email_reply)

Когда письмо содержит заголовки References или In-Reply-To, email_raw_type принимает значение email_reply:

{
  "email_raw_type": "email_reply",
  "email_raw": {
    "references": "<[email protected]>",
    "in_reply_to": "<[email protected]>"
  }
}

Описание расширенных полей

Поле Тип Описание
email_raw dict Полные исходные данные электронной почты (subject/from/to/date/cc/bcc/text_content/html_content/attachments и т.д.)
email_raw_type str Тип исходного события: email_new (новое письмо) или email_reply (ответное письмо)
email_subject str Тема письма (быстрый доступ)
email_from str Адрес электронной почты отправителя (быстрый доступ)
attachments list Список данных вложений (содержит двоичное поле data, обратная совместимость)

Примеры стандартных событий

Полное событие электронной почты

{
  "id": "<[email protected]>",
  "time": 1751990446,
  "type": "message",
  "detail_type": "private",
  "platform": "email",
  "self": {
    "platform": "email",
    "user_id": "[email protected]"
  },
  "message": [
    {
      "type": "text",
      "data": {
        "text": "Пожалуйста, проверьте вложение"
      }
    },
    {
      "type": "file",
      "data": {
        "file_id": "document.pdf",
        "file_name": "document.pdf",
        "size": 102400
      }
    }
  ],
  "alt_message": "Уведомление о встрече",
  "user_id": "[email protected]",
  "user_nickname": "Sender",
  "email_subject": "Уведомление о встрече",
  "email_from": "[email protected]",
  "email_raw": {
    "subject": "Уведомление о встрече",
    "from": "\"Sender\" <[email protected]>",
    "to": "<[email protected]>",
    "date": "Wed, 9 Jul 2026 02:00:46 +0800",
    "message_id": "<[email protected]>",
    "references": "",
    "in_reply_to": "",
    "cc": "",
    "bcc": "",
    "text_content": "Пожалуйста, проверьте вложение",
    "html_content": "<p>Пожалуйста, проверьте вложение</p>",
    "attachments": ["document.pdf"]
  },
  "email_raw_type": "email_new",
  "attachments": [
    {
      "filename": "document.pdf",
      "content_type": "application/pdf",
      "size": 102400,
      "data": "..."
    }
  ]
}

Возвращаемое значение метода отправки

{
  "status": "ok",
  "retcode": 0,
  "data": {
    "message_id": "<[email protected]>",
    "time": 1751990446
  },
  "message_id": "<[email protected]>",
  "message": "",
  "email_raw": {
    "success": true,
    "message": "Email sent successfully"
  }
}

Пример обработки событий

from ErisPulse.Core.Event import message

@message.on_message()
async def handle_email(event):
    if event.get("platform") != "email":
        return
    # Адрес отправителя (только почта)
    sender = event["user_id"]              # [email protected]
    
    # Отображаемое имя отправителя
    nickname = event.get("user_nickname")  # Sender
    
    # Тема письма
    subject = event.get("email_subject")   # Уведомление о встрече
    
    # Текстовое тело (первый текстовый сегмент)
    text = event.get_text()
    
    # Полные исходные данные
    raw = event.get("email_raw", {})
    html = raw.get("html_content", "")
    
    # Обработка вложений
    for seg in event.get("message", []):
        if seg["type"] == "file":
            filename = seg["data"]["file_name"]
            size = seg["data"]["size"]
    
    # Ответ на письмо
    await event.reply(f"Получено: {subject}")