メールアーカイブのインポート時に mailto:foo@bar.com を難読化する

こんにちは、

メールアーカイブの正常なインポートmbox)後、メッセージの内容には、Gmane や mailman2 アーカイブサーバーによって隠蔽されていたはずのメールアドレスが表示されます。これにより、Discourse 上でボットがアドレスを収集・収集するリスクが高まります。これを回避する方法を探しています。

  1. 投稿内のメールアドレスを全体的に削除する(表示プラグインなど)
  2. 既にその機能を持つサイト設定がある
  3. 他のアイデアはありますか?

お手伝いいただき、ありがとうございます!

なぜメッセージの内容にメールアドレスが表示されるのでしょうか?具体例をいただけますか?

「いいね!」 1

ボットをさらに刺激しないよう、公開されている投稿へのリンクをPMでお送りします :stuck_out_tongue:

以下は、メッセージを難読化したものです:


2010年12月23日 14:05、[redacted] l <[redacted]@gmail.com](mailto:[redacted]@gmail.com)
mailto:[redacted]@gmail.com が投稿:

参考までに、アップデートがある場合の私の手順は以下の通りです

これはインポート時の問題であり(まだ対応可能な場合)、インポートフェーズ中に修正すべきです。あなたのフォーラムを確認しましたが、古いメールが切り捨てられていないことによるメールヘッダーの破損やインデントの誤り、さらに返信関係にあるメールが別々のトピックに分割されているなど、壊れた内容でいっぱいです。

インポート時に show_trimmed_content が有効化されていたか(こちら)、または返信切り取りコードがメッセージ形式を認識できなかった可能性があります(こちら)。他にも多くの問題があるように見えます。

「いいね!」 2

的確な推測です。返信トリマーコードが頻繁に必要以上に内容を切り捨ててしまうため、確かに show_trimmed_content を true に設定しました。これはインポートされた mbox だけでなく、メールでの返信でも毎日発生していました。トリマーの改善は可能だとは思いますが、それは困難な戦いのように思えました。メールを利用する人々は、常に (i) 何らかの理由で奇妙な形式のメールを送信し、(ii) それらが完全に表示されることを期待するからです。

インポートには他にも確かに問題があります。完璧とは程遠いです。それらについて議論できるのは嬉しいですが、現時点では緊急の課題ではありません。

インポートでメールを隠すオプションを見落としていないようであれば、残る選択肢は以下の 2 つのようです。

  • 投稿内のコンテンツを s/{email_regexp}/obfuscated/ のようなパターンでグローバルに置換する
  • 表示内容を s/{email_regexp}/obfuscated/ のようなパターンで隠すプラグインを見つける、あるいは作成する(HTML コンバーターなど)

あるいは…私は方向性を間違えているのでしょうか?

これが私の進むべき道です。

PostgreSQL の regexp_replace を使用して、posts.raw および posts.cooked に含まれるすべてのメールアドレスを置換します。

「いいね!」 3

それを実行して、このトピックにHOWTOを投稿します。アドバイスありがとうございます!

:warning: 以下の手順を試す前に、必ず Discourse のバックアップを取得してください :warning:

以下の手順で、投稿内のすべてのメールアドレスを [email_redacted] に置換できます。正規表現は限定的であり、見落としが生じる可能性がありますが、すべての投稿の内容を修正する際に、私が読み理解できる表現を好みます。

$ ./launcher enter app
/var/www/discourse# su - postgres -c psql
psql (13.2 (Debian 13.2-1.pgdg100+1))
ヘルプを表示するには「help」と入力してください。

postgres=# \c discourse
データベース「discourse」に接続しました。ユーザーは「postgres」です。
discourse=# \set re '[0-9a-z._%+-]+@[a-z0-9.-]+\\.[a-z]{2,64}'
discourse=# update posts set raw = regexp_replace(raw, :'re', '[email_redacted]', 'gi') where raw ~ :'re';
UPDATE 1
discourse=# update posts set cooked = regexp_replace(cooked, :'re', '[email_redacted]', 'gi') where cooked ~ :'re';
UPDATE 1