Mailing リストを Discourse へ移行する (mbox、Listserv、Google Groups など)

解決策は、あなたの投稿の文字通りすぐ上の投稿にあります。:wink:

スクリプトを修正する必要があります。みんなのために問題を解決するPRを作成してもらえませんか?

ありがとうございます、これで解決しました。申し訳ありませんでした。私の読解力のなさの償いとして、Added duplication to name to prevent modification of frozen string exception by adam-skalicky · Pull Request #30325 · discourse/discourse · GitHub を開きました。これにより、他の誰かが愚かな質問をする恥を避けることができます。

「いいね!」 1

このインポートスクリプトは、DiscourseがMailman 2のメールスレッディングを何らかの形で再現しますか(例:「In-Reply-To」を示すためにDiscourseの小さな矢印を使用するなど)それとも、純粋に時系列(Message-ID、In-Reply-To、Referencesに基づく各スレッド)ですか?

「いいね!」 1

はい、その通りです

「いいね!」 3

クール。メーリングリストのメールの多くに、本来あるべき「In-Reply-To」および「References」ヘッダーが付いていないため、返信ではなく新しいトピックとしてインポートされる可能性があります。記憶が正しければ、スクリプトはこれらのヘッダーまたは件名ヘッダー(両方ではない)を使用します。

以前に尋ねたかもしれませんが、MBOXファイルにこれらのヘッダーを追加したり、Discourseにインポートする前後にメールを並べ替えたりする手動以外の方法があれば教えていただけますか?

トピックをマージして時系列順に保持することが可能になったので、それが答えかもしれません。返信対象を示すDiscourseの小さな矢印が欠けているだけです。

「いいね!」 1

mbox インポート スクリプトには 2 つのフェーズがあります。最初のフェーズはインデックス作成で、SQLite データベースが出力されます。インポート前に SQLite のデータを変更するか、Ruby スクリプトを変更することができます。

件名またはヘッダーによる並べ替え/グループ化のすべての処理は、ここで実行されます。

メールをどのようにグループ化したいかがわかっている場合は、独自のグループ化ロジックを追加できます。

「いいね!」 3

そんな複雑なものは、しばらくは考えられません!

https://bazaar.launchpad.net/~mailman-coders/mailman/2.1/view/head:/Mailman/Archiver/pipermail.py#L669 の Mailman 2 の Pipermail は、優先順位に従って次のものを探しているようです。

  1. In-Reply-To。
  2. References。
  3. 件名が一致する最も古いメール。

これらのアプローチの組み合わせは理想的だと思われます。3番目の場合、Discourse が「返信」矢印を使用しない方が理にかなっているかもしれません。

記憶によれば、Mailman 3 の Hyperkitty は件名をまったく考慮していませんでしたが、それはそれほど良くありませんでした。

「いいね!」 2

失礼ながら、もしかしたら愚かな質問かもしれませんが、ここで明確な答えを見つけることができませんでした。インポートプロセスは、重複排除はもちろんのこと、各メールに対して新しいDiscourseユーザーを作成するのか、それともすべてが1つのシステムユーザーとして取り込まれるのかを知りたいです。メーリングリストには20年分の投稿があり、かなり大規模で実験しにくい状況です。また、元のリストでの返信はどうなりますか?それらはスレッド化されますか?

はい、ユーザーはメールアドレスごとに作成されます。

Google グループから Google Takeout を実行し、.mbox ファイルをアップロードしてインポートすることができました。

data/folder を既存のカテゴリにマッピングするには以下の手順が役立ちましたが、これは app コンテナではなく、import コンテナ内で行う必要があります(この記事では app コンテナで実行するよう書かれています):

./launcher enter import
rails c

# URL に表示されるカテゴリ ID を使用します。
# 例えば、カテゴリのパスが /c/soccer/16 の場合、ID は 16 です
category = Category.find(16)

# mbox ファイルが保存されているディレクトリ名を使用します。
# 例えば、ファイルが import/data/foo に保存されている場合、ディレクトリ名は "foo" です
category.custom_fields["import_id"] = "soccer"
category.save!

Discourse にはすでに自己移行したユーザーが存在していたため、インポートスクリプトはそれらのユーザーに対して連絡先を作成できませんでした(これは問題ないかもしれません)。しかし、これらの既存の Discourse ユーザーが関与していたインポートされたメッセージでは、送信者が名前ではなく system として表示されてしまいます。

既存のユーザーをインポートされたメッセージにマッピングする方法はありますか?

現在は最近のバックアップから復元してすべて元に戻しました。既存の Discourse ユーザーとインポートされたメッセージの扱いについてガイダンスを得て、再挑戦する準備ができています。

更新:

Claude の助けを借りて既存のユーザーのマッピング問題を解決しました。上記のコードに加えて、Rails コンソールで以下のループを実行する必要があります:

User.where("id > 0").find_each do |u|
  email = u.email.downcase
  unless u.custom_fields["import_id"].present?
    u.custom_fields["import_id"] = email
    u.save_custom_fields
  end
end
「いいね!」 1