将邮件列表迁移到 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 的电子邮件主题(例如,使用 Discourse 的小箭头表示“In-Reply-To”)还是它纯粹是按时间顺序排列的(基于 Message-ID、In-Reply-To 和 References 的每个主题)?

1 个赞

是的,它确实可以。

3 个赞

好的。我的邮件列表中的不少电子邮件缺少应有的“In-Reply-To”和“References”标头,因此可能会被导入为新主题,而不是简单的回复。据我回忆,该脚本会使用这些标头或主题标头(而不是两者都用)。

我想我以前问过这个问题,但有没有什么非手动的方法可以在导入 Discourse 之前或之后向 MBOX 文件添加这些标头和/或以其他方式重新排列电子邮件?

现在可以合并主题并保持时间顺序,所以也许这就是答案。它们只是缺少 Discourse 的小箭头来表示该消息是回复给谁的。

1 个赞

mbox 导入脚本有两个阶段。第一个阶段是索引,它会输出一个 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. 主题匹配的最旧邮件。

这种组合方法似乎很理想。在第三种情况下,Discourse 不使用“回复”箭头可能是有意义的。

据我回忆,Mailman 3 的 Hyperkitty 根本不考虑主题,效果不太好。

2 个赞

抱歉打断一下,我有一个可能很愚蠢的问题,但我在这里找不到明确的答案。我想知道导入过程是否会为每封电子邮件创建一个新的 Discourse 用户(当然会进行去重),还是它们都作为一个系统用户导入。我有一个包含 20 年帖子的大型邮件列表,很难进行实验。另外,原始列表中的回复会怎样?它们会被线程化吗?

是的,用户已创建,每个电子邮件地址对应一个。

我成功通过 Google Takeout 导出了我的 Google Groups 数据,上传了 .mbox 文件并完成了导入。

以下步骤有助于将 data/folder 映射到现有分类,但需要在 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 个赞