こんにちは、Discourseコミュニティの皆様
セルフホスト型のDiscourseインスタンス(バージョン3.5.0.beta7-dev)で、ユーザーに一括でパスワードリセットメールを送信しようとしています。ユーザーはcustom_usernameのみを含むCSVファイルにリストされており、メールアドレスはDiscourseのプロフィールに保存されています。管理者パネル(/u//preferences/security)からの手動パスワードリセットは正常に機能しますが、/u/{username}/password-reset.jsonエンドポイントを使用したPythonスクリプトではメールが送信されません。この問題のトラブルシューティングに関するガイダンスをいただけると幸いです。
行ったこと
- ユーザー作成:
- Pythonスクリプトを使用して、POST
/users.jsonエンドポイント経由でユーザーを正常に作成しました。ペイロードは次のとおりです。
- Pythonスクリプトを使用して、POST
{
"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経由でパスワードリセットメールを送信しています。スクリプトは次のとおりです。approved_users.csvからcustom_usernameを読み込みます(例: kebirx-ustat45947)。- GET
/u/{username}.jsonを使用してユーザーが存在することを確認します。 - POSTリクエストを
/u/{username}/password-reset.jsonに送信します。
- 簡易コード:
- Pythonスクリプトを使用して、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ログにエラーは表示されません。
- 以前の試み:
- POST
/admin/users/{user_id}/send_welcome-email.jsonを使用しようとしましたが、404エラーが返されました。APIドキュメントでこのエンドポイントを見つけられなかったので、/u/{username}/password-reset.jsonに切り替えました。
- POST
環境
- 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)には、メール関連のエラーは表示されません。
- 管理者パネルからの手動テストメールは正常に機能します。
- スクリプトログは、各POST
質問
- プログラムでパスワードリセットメールをトリガーするための正しいエンドポイントは
/u/{username}/password-reset.jsonですか? もしそうでない場合、一括パスワードリセットメールの推奨エンドポイントは何ですか? - エンドポイントが200 OKを返しながらメールを送信しないのはなぜですか? これはAPI権限、Sidekiqキューの問題、またはAPIトリガーメール固有のSMTP設定に関連していますか?
- レート制限: レート制限を回避するために、25件ずつのバッチでユーザーを処理しています。
/u/{username}/password-reset.jsonに特定のレート制限はありますか? - 代替アプローチ: 個別のAPI呼び出しなしで、複数のユーザーのパスワードリセットメールをトリガーするより効率的な方法はありますか?例えば、一括エンドポイントやSidekiqジョブなどです。
- デバッグ: 手動リセットは正常に機能しているにもかかわらず、APIトリガーメールが送信されない理由を特定するために、どのログや設定を確認すべきですか?
追加情報
- 管理者パネルからの手動リセットは機能するため、SMTP(app.ymlで設定済み)とSidekiqは機能しているようです。
- ユーザーが存在し、管理者パネルでメールアドレスが正しいことを確認しました。
- スクリプトまたはサーバーログにエラーが表示されないため、デバッグが困難です。
トラブルシューティング、代替エンドポイント、または一括パスワードリセットメールのベストプラクティスに関する提案があれば、ぜひ教えてください。ドキュメント化されていないAPI、プラグイン、または設定の調整があれば、お知らせください。ありがとうございます!