Send password reset emails in bulk?

I have migrated users from old forum database. Is there any way to send password reset e-mails in bulk? I’ve tried to use API but got You have performed this action too many times, try again later. after requesting to send about 3 reset emails… (other API actions work fine)

I’d be happy to use ruby console or API if you can please advise how to go around that rate limit. It is probably limit per IP address as I’ve investigated.

[updated]

Seems like RateLimiter for ‘forgot_password’ is unfortunately hardcoded so I went ruby script way…

For mass reseting (sending out tokens for password reset to all users) you can do

cd /var/discourse
./launcher enter app

Then create new file mass-password-reset.rb using your favourite editor with following script:

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

And then run it with rails r mass-password-reset.rb

「いいね!」 5

Awesome, thanks! I recently migrated data from my old forum and when tried to manually reset passwords for my users (not too many of them), ran into error message. Discourse logs didn’t show anything, tried to rebuild app and it didn’t help. Then tried your script and now via outsourced email sending service (and Sidekiq) I see that these mails are sending out. So, thanks again! :slight_smile:

「いいね!」 2

Tried this but the data model has now changed (due to secondary email I think). Email addresses are now in User Email object I think.

「いいね!」 2

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

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

いいえ、それは単にユーザーエクスペリエンスの問題です。古いバニラフォーラムを移行してきましたが、古いユーザーにとって最良の体験は、「こんにちは、フォーラムを新しいプラットフォームに移行しました。このリンクからログインできます:{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:

「いいね!」 2

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

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

「いいね!」 3

すみません、まだここで質問するのが一番良い場所かどうかわかりませんが、パスワードリセットメールはどのくらい有効かご存知ですか? 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)で実行できます。

「いいね!」 2

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