古いフォーラムデータベースからユーザーを移行しました。パスワードリセットメールをまとめて送信する方法はありますか?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 で実行します。
krizdabz
(Kristaps Skutelis)
2018 年 5 月 6 日午後 9:44
2
素晴らしい、ありがとうございます!先日、古いフォーラムからデータを移行した際、ユーザー(それほど多くはありません)のパスワードを手動でリセットしようとしたところ、エラーメッセージが表示されました。Discourse のログには何も記録されておらず、アプリの再構築を試みても解決しませんでした。その後、あなたのスクリプトを試したところ、外部のメール送信サービス(および Sidekiq)を通じて、これらのメールが送信されていることを確認できました。改めてありがとうございます!
試してみましたが、データモデルが変更されました(おそらくセカンダリメールアドレスのため)。メールアドレスは、おそらく 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
私には機能しました 。
すみません、昨日、単一ではなく一括処理をしたいことに気づいたときに、この件に戻るつもりでした。でも、解決できてよかったです。
後で検索しやすくするために、この問題を分割します。
すみません、まだここで質問するのが一番良い場所かどうかわかりませんが、パスワードリセットメールはどのくらい有効かご存知ですか? 4日か3日で期限切れになることは知っていますが、古いフォーラムからユーザーを招待し、メールがn日後に期限切れになる可能性があることを通知するメッセージを送信する必要があるため、正確な時間が必要です。よろしくお願いします。
このコマンドをユーザーごと、またはテキストファイル内のユーザーリストに対して実行するにはどうすればよいですか?約8000人のユーザーを移行する必要があります。APIを使用してユーザーを作成することは問題なくできていますが、ハードコードされたレート制限のためにメールが送信されません。スクリーニングされたIPでIPアドレスをACCEPTに設定しましたが、うまくいきません。これはRailsコンソールでのみ実行できることですか?
よろしくお願いします!
alehandrof
(Alex Armstrong)
2025 年 1 月 8 日午前 11:17
12
上記スクリプトを、全員に送信する前にテストできるように、ユーザー1人に送信するように適応させることにも関心があります。
Canapin
(Coin-coin le Canapin)
2025 年 1 月 8 日午後 12:24
13
それほど多くのユーザーを作成するには、インポートスクリプト を使用する方が良いと思いますが、それは本題から外れています
いずれにしても、スクリプト内でメールを送信すると、レート制限に達してしまいます。
メール送信プロセスを遅くしたい場合は、Rubyループに sleep(x)(xは秒単位)を追加できます。これは、レート制限に合わせて調整する必要があります。
スクリプトをしばらく実行する予定がある場合は、screen やtmux などのセッションマネージャーを使用してください。
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)で実行できます。