パスワードリセットメールをまとめて送信できますか?

古いフォーラムデータベースからユーザーを移行しました。パスワードリセットメールをまとめて送信する方法はありますか?APIを使ってみましたが、約3件のリセットリクエストを送信した後に「このアクションを頻繁に行っています。後でもう一度お試しください。」というエラーが発生しました(他のAPIアクションは正常に動作しています)。

RubyコンソールやAPIを使って対応可能であれば、レート制限を回避する方法をご教示ください。おそらくIPアドレスごとの制限だと思われます。

[更新]

‘forgot_password’ に対する RateLimiter が残念ながらハードコーディングされているようなので、Rubyスクリプトで対応することにしました。

全ユーザーに対してパスワードリセットトークンをまとめて送信(メール送信)するには、以下の手順で行えます。

cd /var/discourse
./launcher enter app

その後、お好みのエディタで mass-password-reset.rb という新しいファイルを作成し、以下のスクリプトを記述します。

User.all.each do |u|
  email_token = u.email_tokens.create(email: u.email)
  Jobs.enqueue(:critical_user_email, type: :forgot_password, user_id: u.id, email_token: email_token.token)
  sleep(5)
end

そして、rails r mass-password-reset.rb で実行します。

素晴らしい、ありがとうございます!先日、古いフォーラムからデータを移行した際、ユーザー(それほど多くはありません)のパスワードを手動でリセットしようとしたところ、エラーメッセージが表示されました。Discourse のログには何も記録されておらず、アプリの再構築を試みても解決しませんでした。その後、あなたのスクリプトを試したところ、外部のメール送信サービス(および Sidekiq)を通じて、これらのメールが送信されていることを確認できました。改めてありがとうございます!:slight_smile:

試してみましたが、データモデルが変更されました(おそらくセカンダリメールアドレスのため)。メールアドレスは、おそらく User Email オブジェクトに格納されるようになりました。

こんにちは、これを解決する方法は見つかりましたか?スクリプトを試そうとしていたのですが、あなたのメッセージを見て、あなたがこれを回避できたかどうか疑問に思っています。

パスワードリセットリンクからパスワードをリセットしてもらうのが最善の策だと思います。ユーザーがそれができない理由は何でしょうか?

いいえ、それは単にユーザーエクスペリエンスの問題です。古いバニラフォーラムを移行してきましたが、古いユーザーにとって最良の体験は、「こんにちは、フォーラムを新しいプラットフォームに移行しました。このリンクからログインできます:{link}」というメールを受け取ることだと思います。

訂正します。そのスクリプトは機能します。以下を行う必要がありました。

cd /var/discourse
sudo ./launcher enter app

次にファイルを作成します。

// ファイルを作成
touch password.rb

次に次のコードを追加します。

email_token = nil

User.all.each do |u|
  email_token = u.email_tokens.create(email: u.email)
  Jobs.enqueue(:critical_user_email, type: :forgot_password, user_id: u.id, email_token: email_token.token)
  sleep(5)
end

最後に、次を実行します。

rails r password.rb

私には機能しました :slight_smile:

すみません、昨日、単一ではなく一括処理をしたいことに気づいたときに、この件に戻るつもりでした。でも、解決できてよかったです。 :slight_smile: :+1:

後で検索しやすくするために、この問題を分割します。 :mag_right:

すみません、まだここで質問するのが一番良い場所かどうかわかりませんが、パスワードリセットメールはどのくらい有効かご存知ですか? 4日か3日で期限切れになることは知っていますが、古いフォーラムからユーザーを招待し、メールがn日後に期限切れになる可能性があることを通知するメッセージを送信する必要があるため、正確な時間が必要です。よろしくお願いします。

このコマンドをユーザーごと、またはテキストファイル内のユーザーリストに対して実行するにはどうすればよいですか?約8000人のユーザーを移行する必要があります。APIを使用してユーザーを作成することは問題なくできていますが、ハードコードされたレート制限のためにメールが送信されません。スクリーニングされたIPでIPアドレスをACCEPTに設定しましたが、うまくいきません。これはRailsコンソールでのみ実行できることですか?

よろしくお願いします!

上記スクリプトを、全員に送信する前にテストできるように、ユーザー1人に送信するように適応させることにも関心があります。

それほど多くのユーザーを作成するには、インポートスクリプトを使用する方が良いと思いますが、それは本題から外れています :upside_down_face:
いずれにしても、スクリプト内でメールを送信すると、レート制限に達してしまいます。

メール送信プロセスを遅くしたい場合は、Rubyループに sleep(x)(xは秒単位)を追加できます。これは、レート制限に合わせて調整する必要があります。

スクリプトをしばらく実行する予定がある場合は、screentmuxなどのセッションマネージャーを使用してください。

user = User.find_by(username: 'alehandrof')

if user
  email_token = user.email_tokens.create(email: user.email)
  Jobs.enqueue(:critical_user_email, type: :forgot_password, user_id: user.id, email_token: email_token.token)
end

これのためにRubyファイルを作成する必要はありません。Railsコンソール(./launcher enter app の後に rails c)で実行できます。

@Canapin、ご協力ありがとうございます!