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

データベースを確認されましたか?この問題に関する直感は、何らかの理由でメールフィールドが正しく作成されておらず、そのため読み取れないのではないかというものです。

インデックスデータベースの確認については、OP の 2.3 をご覧ください。

「いいね!」 3

Discourse にインポートしようとしている Mailman 2 リストは、その存在期間の一部において from_is_list が「Munge From」に設定されていました。そのため、「From:」ヘッダーは以下のように表示されていました。

From: リスト名 <リスト名-bounces@リストドメイン.com> On Behalf Of [元の送信者名]

これは、以下のような形式の代わりにです。

From: [元の送信者名] <username@example.com>

これにより、インポーターがこれらのメッセージをすべて同一ユーザー(メールアドレス: listname-bounces@listdomain.com)からのものとしてインポートするのではないかと思ったのですが…しかし…

mbox ファイル内の新しいメールの開始を示す最初の行は、まだ以下のように始まっています。

From username@example.com [日付 時刻 グループ]

(Hyperkitty のアーカイブでも、元の送信者のメールアドレスが通常通り表示されています。)

そこで質問です——インポーター・スクリプトは、送信者のアドレスを「From:」ヘッダーから取得するのでしょうか、それとも「From 」行から取得するのでしょうか?よろしくお願いいたします。

この件については、以前のスレッドで少し議論しました:Working on a mailman2 to discourse migration script - #10 by dachary

「いいね!」 1

From: ヘッダーを使用しています。

「いいね!」 1

素早い返信ありがとうございます!これを変更するのはどれくらい大変でしょうか?公式でなくても構いません(他の人にも役立つかもしれませんが)、私自身がスクリプトを実行する前に変更するだけでいいのです。Ruby はまだわかりませんが、コロンをスペースに書き換えるだけなら……

単純な変更ではありませんが、実現可能でしょう。インポートスクリプト内で実装する必要はありません。他のスクリプト言語に精通しているなら、インポートを実行する前に mbox ファイルの From: ヘッダーを更新するのはそれほど難しくないはずです…

ただし、インポートスクリプト内で修正することも自由です。PR を歓迎します!
ヘッダーの修正のよい出発点は each_mail メソッドです…

「いいね!」 5

お疲れ様です。どうやらこれが現在の決定的な要因のようです。indexer.rb の69行目から70行目をご覧ください:

parsed_email = receiver.mail
from_email, from_display_name = receiver.parse_from_field(parsed_email)

その時点で、parsed_email から mbox メール形式の最初の行(つまり「From [メールアドレス] [日時]」という行)を取得し、そこからメールアドレスを抽出することは可能でしょうか?

「いいね!」 3

いいえ、その行は mbox が個別のメッセージに分割される際にフィルタリングされます。後でその値を使用するには、each_mail メソッド内でその値を保存する必要があります。

「いいね!」 4

これは面白い試みでした。でも、Mailman がメールを mbox に元のまま、手つかずの形で保存していることに気づくまででした。つまり、すべてのケースで「From:」行には、元の送信者のメールアドレスと同じものが含まれており、メールが「From: listname-bounces@listname.domain.com」から送信された場合でも同様です。:man_facepalming:

開発用の Discourse インストール環境も Ruby 自体も持っていなかったため制限がありましたが、https://rubular.com/https://replit.com/languages/ruby(そして DuckDuckGo)を使ってある程度の進展はできました。もしご一見いただければ、これが実際に必要だった場合に、うまくいっていた(あるいはほぼうまくいっていた)かどうかをお知らせいただければ幸いです。

    def each_mail(filename)
      raw_message = +''
      first_line_number = 1
      last_line_number = 0

      each_line(filename) do |line|
        if line.scrub =~ @split_regex
          if last_line_number > 0
            # 次にメールの先頭に到達しました
            yield raw_message, first_line_number, last_line_number
            raw_message = +''
            first_line_number = last_line_number + 1
          else
            # 現在のメールの先頭に到達しました。メールアドレスを取得します
            new_email = line.match(/^From (\S+@\S+).*/).captures
          end
        else
          raw_message << line
        end

        last_line_number += 1
      end

      # 古いメールアドレス("From:" 行)を取得
      old_email = raw_message.match(/^From: .*\u003c(\S+@\S+)\u003e/).captures

      # "From " 行のアドレスを "From:" 行に代入
      raw_message = raw_message.sub(old_email, new_email)

      yield raw_message, first_line_number, last_line_number if raw_message.present?
    end
「いいね!」 3

まあ、ほぼ…と呼んでおきましょうか :wink:

「いいね!」 1

はは…「つまり、チャンスがあるってことか!?」

「いいね!」 3

メールアーカイブ(mbox)のインポートが正常に完了した後、メッセージの内容には、Gmane や mailman2 アーカイブサーバーによって元々隠蔽されていたはずのメールアドレスが表示されます。これにより、アドレスを収集するボットがそれらを収集(ハーベスティング)できてしまうため、この問題を回避する方法を探しています。

  1. 投稿内のメールアドレスをすべて削除する(表示プラグインなどを使う?)
  2. すでにその機能を提供しているサイト設定があるか
  3. その他のアイデア

ご助力を заранее お願いいたします!

「いいね!」 5

これは「どちらか一方」の選択肢でしょうか?

MM2 の mbox を MM3 にインポートしようとした際、ヘッダーが正しく設定されていないため、約 4 分の 1 のメールが孤立してしまいました(返信が新しいスレッドの開始として誤って扱われました)。MM2 の Pipermail は、Message-ID や他のヘッダー(名前を忘れてしまいましたが)が存在しない場合、件名(Subject)を使ってアーカイブを構造化できます。しかし、最後に確認した限り、MM3 の Postorius は件名を無視していました。理想的には、スクリプトも Pipermail と同様に動作し、私のリストではほぼ正確に処理してくれると助かります :slight_smile:

また、上記のようにメールがぐちゃぐちゃにインポートされた場合、Discourse 側でそれを修正する方法はありますか?それとも、以下の投稿で提案されているように、index_only を試して、mbox ファイルにヘッダーを追加するか、index.db を修正するしかないのでしょうか?

ありがとうございます。

「いいね!」 3

はい、その通りです。

実質的にはありません。投稿を移動させることは可能ですが、自動化を使っても面倒な作業です。

インポートスクリプトを修正して、Message-ID が欠落している場合に備え、Message-ID と件名でグループ化するハイブリッドモードを追加することに抵抗がなければ、それが問題解決の最善策だと思います。

「いいね!」 3

Google グループからのインポートは現在機能していません。これは、Google が UI を変更し、2015 年に非推奨となった AJAX クローリング方式を削除したためです。

Google Takeout を使って mbox ファイルのエクスポートに成功した方はいますか?

「いいね!」 4

こんにちは、

このツールを使って、オンプレミスではなく SaaS の Discourse に Google グループをインポートするにはどうすればよいでしょうか?

1 年間のビジネスホスティングを利用すれば、無料で対応してくれます。それ以外の場合は、ご自身のサーバーで作業し、バックアップをインスタンスにアップロードした上で、サポートにメールを送って復元を依頼する必要があります。

Google グループのスクリプトは、認証を正しく動作させるのが難しい場合があります。私が最後に使用した際は、ログインエンドポイントを調整してようやく動作させることができました。

「いいね!」 1

ログインが動作するように修正したことを覚えていますか?初期手順で記載されているのと同じ拡張機能を使用してクッキーファイルを生成したにもかかわらず、以下のエラーが発生しています。ちなみに、私が扱っているのはプライベートドメイングループです。

Logging in...
2021-10-31 12:54:41 WARN Selenium [DEPRECATION] [:browser_options] :options as a parameter for driver initialization is deprecated. Use :capabilities with an Array of value capabilities/options if necessary instead.
Traceback (most recent call last):
        31: from script/import_scripts/google_groups.rb:293:in `\u003cmain\u003e'
        30: from script/import_scripts/google_groups.rb:237:in `crawl'
        29: from script/import_scripts/google_groups.rb:181:in `login'
        28: from script/import_scripts/google_groups.rb:196:in `add_cookies'
        27: from script/import_scripts/google_groups.rb:196:in `each'
        26: from script/import_scripts/google_groups.rb:200:in `block in add_cookies'
        25: from /usr/local/lib/ruby/gems/2.7.0/gems/selenium-webdriver-4.0.3/lib/selenium/webdriver/common/manager.rb:61:in `add_cookie'
        24: from /usr/local/lib/ruby/gems/2.7.0/gems/selenium-webdriver-4.0.3/lib/selenium/webdriver/remote/bridge.rb:349:in `add_cookie'
#0 0x557491640f93 \u003cunknown\u003e: invalid cookie domain: Cookie 'domain' mismatch (Selenium::WebDriver::Error::InvalidCookieDomainError)

ログインの修正だけでは不十分です。

「いいね!」 2

最近のリデザインで何か改善されましたか?

いいえ、過去 25 日間にその機能が再追加されない限りは。おそらく追加されないでしょうから、スクレイパーは全面的な見直しが必要になります。

「いいね!」 1