Привет, сообщество Discourse,
Я пытаюсь автоматизировать массовую отправку писем для сброса пароля пользователям на нашем самостоятельно размещённом экземпляре Discourse (версия 3.5.0.beta7-dev). Пользователи перечислены в CSV-файле, содержащем только custom_username, а их адреса электронной почты хранятся в их профилях Discourse. Хотя ручной сброс пароля из панели администратора (/u//preferences/security) работает безупречно, мой Python-скрипт, использующий конечную точку /u/{username}/password-reset.json, не отправляет письма. Буду признателен за любые рекомендации по устранению этой проблемы.
Что я сделал
- Создание пользователей:
- Я успешно создал пользователей через конечную точку POST /users.json с помощью Python-скрипта. Полезная нагрузка:
json
Скрыть текст
Копировать
{ "email": "<email>", "username": "<custom_username>", "password": "", "active": true, "approved": true, "send_welcome_message": false }
- Пользователи отображаются в панели администратора (/admin/users), и их адреса электронной почты корректно сохранены в профилях.
- Ручной сброс пароля:
- В панели администратора (/u//preferences/security) нажатие кнопки «Сбросить пароль» отправляет письмо для сброса пароля на зарегистрированный адрес электронной почты пользователя, что подтверждает правильную настройку SMTP и Sidekiq.
- Программный сброс пароля:
- Я использую Python-скрипт для отправки писем для сброса пароля через POST /u/{username}/password-reset.json. Скрипт:
- Читает custom_username из approved_users.csv (например, kebirx-ustat45947).
- Проверяет существование пользователя через GET /u/{username}.json.
- Отправляет POST-запрос на /u/{username}/password-reset.json.
- Упрощённый код:
python
Скрыть текст Запустить
Копировать
response = requests.post( f"{FORUM_URL}/u/{username}/password-reset.json", headers={"Api-Key": API_KEY, "Api-Username": API_USERNAME}, timeout=10 )
- Ответ 200 OK, но письма не отправляются. В логах скрипта (discourse_send_welcome_emails.log) или в логах Sidekiq ошибок не обнаружено.
- Предыдущая попытка:
- Я пытался использовать POST /admin/users/{user_id}/send_welcome-email.json, но получил ошибку 404. Я не смог найти эту конечную точку в документации API, поэтому перешёл на /u/{username}/password-reset.json.
Окружение
- Версия Discourse: 3.5.0.beta7-dev
- Настройка: Самостоятельно размещённый, доступен по адресу https://forum.kebirxai.tr
- Ключ API: Административный с полными правами
- Формат CSV:
csv
Скрыть текст
Копировать
custom_username kebirx-ustat45947 keb21
- Логи:
- Логи скрипта показывают 200 OK для каждого вызова POST /u/{username}/password-reset.json, но письма не получаются.
- Логи Sidekiq (/var/www/discourse/log/sidekiq.log) и продакшн-логи (/var/www/discourse/log/production.log) не содержат ошибок, связанных с электронной почтой.
- Ручные тестовые письма из /admin/email работают нормально.
Вопросы
- Является ли /u/{username}/password-reset.json правильной конечной точкой для программной триггерной отправки писем для сброса пароля? Если нет, какая конечная точка рекомендуется для массовой отправки таких писем?
- Почему конечная точка может возвращать 200 OK, но не отправлять письма? Может ли это быть связано с правами доступа API, проблемами очереди Sidekiq или настройками SMTP, специфичными для писем, инициированных через API?
- Ограничение частоты запросов: Я обрабатываю пользователей партиями по 25, чтобы избежать ограничений. Существуют ли специфичные ограничения частоты запросов для /u/{username}/password-reset.json?
- Альтернативные подходы: Есть ли более эффективный способ триггерной отправки писем для сброса пароля нескольким пользователям без индивидуальных вызовов API? Например, конечная точка для массовых операций или задание Sidekiq?
- Отладка: Какие логи или настройки следует проверить, чтобы определить, почему письма, инициированные через API, не отправляются, несмотря на то что ручные сбросы работают?
Дополнительные заметки
- Ручной сброс из панели администратора работает, поэтому SMTP (настроен в app.yml) и Sidekiq, похоже, функционируют корректно.
- Я проверил, что пользователи существуют, и их адреса электронной почты верны в панели администратора.
- В логах скрипта или сервера ошибок нет, что затрудняет отладку.
Буду очень признателен за любые предложения по устранению неполадок, альтернативные конечные точки или лучшие практики для массовой отправки писем для сброса пароля. Если существуют недокументированные API, плагины или настройки конфигурации, пожалуйста, сообщите. Спасибо!