通过 /u/{username}/password-reset.json 批量程序化发送密码重置邮件的问题 分类:开发 (API/插件)

您好,Discourse 社区,

我正在尝试为我自托管的 Discourse 实例(版本 3.5.0.beta7-dev)的用户批量自动发送密码重置邮件。用户列在一个仅包含 custom_username 的 CSV 文件中,他们的电子邮件地址存储在 Discourse 配置文件中。虽然管理员面板(/u//preferences/security)中的手动密码重置工作正常,但我的 Python 脚本在使用 /u/{username}/password-reset.json 端点时未能发送邮件。我希望您能就如何解决此问题提供指导。

我已做的操作

  1. 用户创建

    • 我已成功通过 POST /users.json 端点使用 Python 脚本创建了用户。载荷如下:
    {
      "email": "<email>",
      "username": "<custom_username>",
      "password": "",
      "active": true,
      "approved": true,
      "send_welcome_message": false
    }
    
    • 用户出现在管理员面板(/admin/users)中,并且他们的电子邮件地址已正确存储在他们的配置文件中。
  2. 手动密码重置

    • 从管理员面板(/u//preferences/security)点击“重置密码”按钮会将密码重置邮件发送到用户注册的电子邮件地址,这证实了 SMTP 和 Sidekiq 的配置正确。
  3. 程序化密码重置

    • 我正在使用 Python 脚本通过 POST /u/{username}/password-reset.json 发送密码重置邮件。该脚本:
      • 从 approved_users.csv 读取 custom_username(例如,kebirx-ustat45947)。
      • 通过 GET /u/{username}.json 验证用户是否存在。
      • 向 /u/{username}/password-reset.json 发送 POST 请求。
    • 简化代码:
    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 日志中未显示任何错误。
  4. 先前尝试

    • 我尝试使用 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 格式

    custom_username
    kebirx-ustat45947
    keb21
    
  • 日志

    • 脚本日志显示每次 POST /u/{username}/password-reset.json 调用都返回 200 OK,但未收到邮件。
    • Sidekiq 日志(/var/www/discourse/log/sidekiq.log)和生产日志(/var/www/discourse/log/production.log)未显示任何与电子邮件相关的错误。
    • 管理员面板中的手动测试电子邮件工作正常。

问题

  1. /u/{username}/password-reset.json 是否为程序化触发密码重置邮件的正确端点? 如果不是,批量密码重置邮件推荐的端点是什么?
  2. 为什么该端点会返回 200 OK 但不发送邮件? 这是否与 API 权限、Sidekiq 队列问题或特定于 API 触发邮件的 SMTP 配置有关?
  3. 速率限制:我正在分批处理用户(每批 25 个)以避免速率限制。/u/{username}/password-reset.json 是否有特定的速率限制?
  4. 替代方法:是否有更有效的方法可以为多个用户触发密码重置邮件,而无需单独的 API 调用?例如,批量端点或 Sidekiq 作业?
  5. 调试:尽管手动重置有效,但我应该检查哪些日志或设置来确定为什么未发送 API 触发的邮件?

补充说明

  • 管理员面板的手动重置有效,因此 SMTP(在 app.yml 中配置)和 Sidekiq 似乎功能正常。
  • 我已确认用户存在并且他们在管理员面板中的电子邮件地址正确。
  • 脚本或服务器日志中未显示任何错误,这使得调试变得困难。

关于故障排除、替代端点或批量密码重置邮件的最佳实践,任何建议都将不胜感激。如果有任何未记录的 API、插件或配置调整,请告知我。谢谢!

1 个赞

我想你不需要API密钥吧?我不确定登录后是否能申请密码。