ユーザーメールドメインが多すぎて機能しないため、Mailgunドメインが無効になりました:どうすればよいですか?

こんにちは!

当フォーラムには、現在機能していない特定のドメインのメールアドレスを持つインポートされたユーザーが多数います。
そのようなメールアドレスを持つユーザーは数千人に上ります。

これまで問題はありませんでしたが、「digest メールを何日間で抑制するか」の値を増やしたところ、機能しないドメインを持つ多くのユーザーを含む、大量の digest メールが送信されてしまいました。

その結果、メールの跳ね返りが多発し、Mailgun が私のドメインを無効化してしまいました。

この問題を解決し、再発を防ぐために、これらのアカウントに対してどのような対応をすべきでしょうか?これらのアカウントの多くは、まだフォーラムに戻ってきていない正当なユーザーに属しており、必ずしも放置されたアカウントとは限りません。

この問題により、修正されるまでユーザーはフォーラムに登録できません。

メールのバウンス処理をご覧ください

なぜかこのトピックを検索で見つけられませんでした…パニックになったのかもしれません!:sweat_smile:

迅速な回答をどうもありがとうございます!

ただし、bademail.domain のような無数のメールアドレスがある場合、以下のような処理を行うのがよいでしょう。

rake posts:remap['bademail.domain', 'no-email.invalid']

詳しくは Replace a string in all posts をご覧ください。これにより、Discourse がそれらのメールアドレスに送信しないように設定されます。もう一つの有効な解決策は、以下のようになります。

bad = User.find_by_email     
# 該当するユーザーをすべて取得する検索条件を記述
bad.update_all(active: false)

既知の無効なメールアドレスを持つすべてのユーザーを無効化します。最初の部分の具体的な実装方法はすぐに思い浮かびませんが、それほど難しくないはずです。

はい、これらのメールドメインを削除するためにこの方法を考えていました。

Discourse のメソッドが @no-email.invalid という形式のメールアドレスを作成していることに気づきました:

また、インポーターのベースクラスでは、わずかに異なる @email.invalid が使用されています:

  1. Discourse がメールを送信する際、これら 2 つの異なる「ダミードメイン」はどちらも無視されますか?

  2. 動作しないドメインを @no-email.invalid に置き換えるべきか、それとも @email.invalid にすべきか、あるいはどちらでも問題ありませんか?

@pfaffman さん、投稿内でマッピングを行う理由が、ユーザーのメールアドレスを変更するのではなく、なぜそうすべきなのか理解できていません… :thinking: もし何か見落としているのでなければ、これらのメールアドレスは投稿に含まれていないはずです。

もしそれが推奨される方法であれば、各プロファイルの @brokendomains.com 形式のアドレスを @no-email.invalid または @email.invalid に置き換えたいと考えています。どのように行うかは自分で調べられますが、どちらの「偽」ドメインを使用すべきか迷っています。

posts:remap はそのドメインをすべてのテーブルでリマップするものだと確信していますが、何らかのクラスに配置する必要があったようです。

あるいは、UserEmails テーブル(またはそれに相当するもの)に独自の置換ルールを書くこともできます。

whatever.invalid というアドレスは、世界中に「無効なアドレスである」と伝えるため、送信を試みないはずです。

なるほど、これで問題が解決するでしょうか?

User.find_each do |u|
	if u.email.include? "@brokendomain.com"
		u.update(email: SecureRandom.hex + "@email.invalid")
	end
end

私はこうするかもしれません。

UserEmail.where("email like '%@brokendomain.com'").each do |e|
   e.update(email: SecureRandom.hex + "@email.invalid")
end

あなたの方法も機能するかもしれませんが、メールが別のモデルやテーブルに移された後に u.email.include? が使用可能になるように User モデルが更新されているかどうかは確信が持てません。

ターゲットのメールアドレスが返ってくるか確認するためにスクリプトを実行しましたが、問題なく動作しました。

特定のメールドメインを選択するクエリを使用しているため、あなたのスクリプトの方が私のものより高速であるはずです。

ご協力いただき、本当にありがとうございます :+1:

おっと、私が意図していたのはこちらのリマップです。単に

  discourse remap old new

です。詳しくは Change the domain name or rename your Discourse をご覧ください。

上記の方法でも機能すると思いますが、UserEmails のソリューションの方がわずかに優れているかもしれません。

ありがとうございます。私が採用したのはこちらの方法です。
17,000 人のユーザーのうち 5,000 人以上が、そのようなメールドメインを持っていました。私が「** digest メールを日数後に抑制**」の設定を増やした際に、エラーメール(バウンス)の数が増えたのも当然です…

これは .invalid で終わるものに対する Discourse の特別な処理であり、これは 予約 された TLD です。