将邮件列表迁移到 Discourse(mbox、Listserv、Google Groups 等)」

你查看过数据库吗?针对这个问题的直觉是,出于某种原因,email 字段在那里没有正确创建,因此无法读取。

请查看主贴(OP)中的第 2.3 节,以检查索引数据库。

3 个赞

我考虑导入 Discourse 的 Mailman 2 列表在其存在期间(部分时间)将 from_is_list 设置为“混淆发件人”(Munge From),因此“From:”头部显示为:

From: 列表名称 <listname-bounces@listdomain.com> 代表 [原始发件人姓名]

而不是:

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 邮件的第一行(即“发件人 [邮箱地址] [日期时间]”这一行),并从中提取邮箱地址?

3 个赞

不,当 mbox 被拆分为单封邮件时,该行会被过滤掉。你需要在 each_mail 方法中保存该值,以便后续使用。

4 个赞

我试着做这件事时还挺有趣的,后来才发现 Mailman 将邮件以原始、未经修改的形式存储在 mbox 中,因此无论邮件是否从“From: listname-bounces@listname.domain.com”发送,“From:”行中的邮箱地址在所有情况下都与“From ”行中的(原始发件人)邮箱地址相同。: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 时,大约四分之一的邮件变成了“孤儿”(回复被错误地视为新线程的开端),因为它们缺少正确的头信息。MM2 中的 Pipermail 可以根据“主题”(Subject)来组织归档(如果没有 Message-ID 或其他某个我记不清的头信息),但据我上次检查,MM3 中的 Postorius 会忽略“主题”。因此,理想情况下,您的脚本能像 Pipermail 一样工作,这样在我的邮件列表上就能大部分正确处理 :slight_smile:

另外——如果邮件像上面提到的那样杂乱无章地导入,Discourse 有什么方法可以修复吗?还是唯一的办法是尝试 index_only,然后要么给 mbox 文件添加头信息,要么按照下面引用的帖子建议重新调整 index.db

谢谢。

3 个赞

是的,确实如此。

基本上没有。不过,你可以移动帖子,但即使借助自动化工具,这也相当繁琐。

我认为这是解决你问题的最佳方案,除非你愿意修改导入脚本,并添加某种混合模式,以便在缺少 Message-ID 时,根据主题行进行分组。

3 个赞

从 Google Groups 导入功能目前无法使用,因为 Google 更改了其界面,并移除了他们在 2015 年已弃用的 AJAX 爬取方案。

有人成功使用 Google Takeout 导出 mbox 文件了吗?

4 个赞

您好,

我们如何使用此方法将 Google 群组导入到 SaaS 版 Discourse,而不是本地部署版本?

如果您支付一年的企业托管费用,他们将免费为您处理。否则,您需要自行在服务器上操作,将备份上传到您的实例,并联系支持团队请求恢复。

Google 群组脚本在设置身份验证时可能较为棘手。上次我使用时,不得不调整登录端点才能使其正常工作。

1 个赞

您还记得之前为了让登录功能正常工作所做的修改吗?即使我使用了初始步骤中提到的相同扩展程序来生成 cookies 文件,仍然收到以下错误。顺便提一下,我正在操作的是一个私有域名组。

正在登录...
2021-10-31 12:54:41 WARN Selenium [DEPRECATION] [:browser_options] :options 作为驱动程序初始化的参数已弃用。如有必要,请使用 :capabilities 并传入值 capabilities/options 的数组。
调用堆栈跟踪(最近一次调用在最后):
        31: 来自 script/import_scripts/google_groups.rb:293:in `\u003cmain\u003e'
        30: 来自 script/import_scripts/google_groups.rb:237:in `crawl'
        29: 来自 script/import_scripts/google_groups.rb:181:in `login'
        28: 来自 script/import_scripts/google_groups.rb:196:in `add_cookies'
        27: 来自 script/import_scripts/google_groups.rb:196:in `each'
        26: 来自 script/import_scripts/google_groups.rb:200:in `block in add_cookies'
        25: 来自 /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: 来自 /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: 无效的 cookie 域名:Cookie 'domain' 不匹配 (Selenium::WebDriver::Error::InvalidCookieDomainError)

很抱歉,仅修复登录是不够的。

2 个赞

最近的重新设计修复了任何问题吗?

不,除非他们在过去25天内重新添加了该功能。我认为他们不会这么做,因此该爬虫需要进行彻底的重构。

1 个赞