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

感谢您提供此指南和导入脚本!我已成功将其与 Google 群组一起使用,并使用了 Google Takeout。我只是将 .mbox 文件放在正确的目录中并运行了脚本。

我确实有一个关于导入其父级不在 .mbox 中的电子邮件的问题。例如,我们的群组中有许多帖子是由未发送到群组的电子邮件的转发(FWD)发起的,或者是在对话中间将群组添加到回复列表中以将其纳入其中。

目前,在导入时,这些之前的电子邮件似乎不存在。您可以通过点击电子邮件图标并查看 HTML 来找到它们。我想知道是否有人遇到过同样的情况并有任何解决方案。我可以设想将之前的电子邮件链包含在帖子中,或者尝试解析它并从中提取一些消息并添加所有这些消息。

1 个赞

您需要找到一种方法来从引用的文本生成这些消息,并将它们添加到 mbox 文件中(可能带有 Id 标头),然后再运行导入脚本。

1 个赞

这确实非常棒。但我遇到了一些问题,一些邮件进入 Discourse 时,最初的邮件显示正常,但后续的 mbox 格式回复却未格式化地显示在同一帖子中。我不确定是什么原因导致的。

问题是,如何在不删除并重新创建目标 Discourse 实例的情况下,删除所有导入的邮件(20 年的量)?

我知道推荐的内存要求是 8GB。我确实尝试在一台 2GB 的虚拟机上导入 20 年的帖子,它运行了一段时间后崩溃了,并显示“killed”消息。像 DigitalOcean 这样的托管提供商的 8GB 机器(对我来说)很贵。有没有办法用更少的内存来完成这项工作?也许分批导入?

也许可以删除那些分类,然后删除相关的自定义主题字段。

不,我认为你无法在一台小型机器上进行大量导入。你可以在台式机上尝试,但随后会遇到将数据库传回互联网的带宽问题。

1 个赞

我知道这个帖子上的活动不多,但我无法让它正常工作。我导入的许多 mbox 格式的电子邮件没有正确拆分。From 行看起来像这样:

From MAILER-DAEMON Tue Nov 01 05:57:09 2022

但有些消息导入正确,然后在同一正文中包含以典型 From 行开头的原始 mbox 格式项。换句话说,它们没有被拆分。我看不到我需要修改拆分所用的正则表达式,而且我不会 Ruby,所以我无法调试导入脚本。

我不知道接下来该怎么办。有 20 年的消息要导入,所以我不能手动检查导入的消息来修复它们。总之,这个脚本对我来说不起作用。为什么只有我遇到这种情况?

你不是唯一一个。我的第一份付费 discourse 工作就是花了几个月时间清理旧的 mbox 文件,这些文件不知何故被手动编辑过,原因我已经记不清了。

听起来你确实需要修改正则表达式,或者找到其他方法来修复那些错误的邮件。一种方法是使用其他工具将邮件分割成一个文件一个。

顺便说一句,在我懂得 ruby 之前,我写过好几个导入脚本。

每次导入都是独一无二的。拥有 20 年的数据,你很可能会遇到各种不同的问题,因为在使用的各种系统中,情况一直在变化。

2 个赞

你说得对。那肯定是的。

我想将 mailman2 系统中的 20 年邮件导入到归档目录中,但不想为它们创建用户 ID(甚至不是暂存的),因为我们的许多订阅者已经离开或去世,这会创建许多占用空间的帐户。

我可以将它们全部导入到同一个用户 ID(也许是“archive”)下吗?

这可能是一个愚蠢的问题,但由于应用程序在导入过程中已关闭,这意味着那些注册了新帖子电子邮件通知的用户不会收到关于所有已加载归档的电子邮件轰炸,对吗?

您可以注释掉 import_users 函数,所有消息都将归系统所有。

您不会节省太多空间。

在用户通过“忘记密码”流程登录其帐户之前,不会有用户收到电子邮件。如果您将这些数据导入现有社区,那么我认为用户将收到有关导入脚本创建的新消息的通知。

1 个赞

谢谢,我一直在查看导入脚本,并认为我或许可以禁用新用户部分。测试该功能在我的待办事项列表中。

我考虑的不是文件空间,而是可能存在数百个永远不会被使用的暂存用户账户,所以这更像是脑力空间或一个非常长的用户列表。

您了解您的用户,但拥有无人使用的账户似乎比不知道谁发布了 20 年的消息要好得多。

3 个赞

这是一个有效的观点,Jay。

我找不到 import_mbox.sh 文件,当我直接执行 mbox.rb 脚本时,会遇到很多 Ruby 错误:

root@lists-import:/var/www/discourse/script/import_scripts# ruby mbox.rb mbox
fatal: detected dubious ownership in repository at ‘/var/www/discourse’
To add an exception for this directory, call:

    git config --global --add safe.directory /var/www/discourse

/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/zeitwerk-2.6.7/lib/zeitwerk/loader/callbacks.rb:25:in `on_file_autoloaded’: expected file /var/www/discourse/lib/freedom_patches/pluck_first.rb to define constant FreedomPatches::PluckFirst, but didn’t (Zeitwerk::NameError)

  raise Zeitwerk::NameError.new(msg, cref.last)

大家好。这是一份很棒的指南。感谢 Gerhard 和其他人的贡献。

有人在这里为 Lyris 适配过吗?我想迁移一个历史安装,并想了解他们在类似项目中是否遇到过任何特殊问题。

我需要将帖子从邮件列表导入到 Discourse,遇到了两个问题。

  • 找不到 sqlite3
  • 找不到 import_mbox.sh

以下是我的解决方案:

安装 sqlite3

我将以下内容添加到 Gemfile

 gem "sqlite3", "~> 1.3", ">= 1.3.13"

然后运行:

cd discourse
bundle config set frozen false
bundle install

运行导入

cd discourse
RAILS_ENV=production bundle exec rails runner script/import_scripts/mbox.rb script/import_scripts/mbox/settings.yml
1 个赞

你可能错过了隐藏在“Regular import”(常规导入)后面的这一步,该步骤位于 1.2. Preparing the Docker container 中。

1 个赞

我遇到了这个 can't modify frozen String 错误。有人能提供修复建议或找出我哪里做错了什么吗?

root@sajcf:~# /var/discourse/launcher stop app
检测到 x86_64 架构。
+ /usr/bin/docker stop -t 600 app
app
root@sajcf:~# /var/discourse/launcher enter import
检测到 x86_64 架构。
root@sajcf-import:/var/www/discourse# import_mbox.sh
mbox 导入正在开始...

正在加载现有组...
正在加载现有用户...
正在加载现有类别...
正在加载现有帖子...
正在加载现有主题...

正在创建索引
正在索引 /shared/import/data/jjcf 中的文件
正在索引 /shared/import/data/jjcf/SAJCF.mbox

正在索引回复和用户

正在创建类别
/var/www/discourse/script/import_scripts/base.rb:447:in `strip!': can't modify frozen String: "jjcf" (FrozenError)
        from /var/www/discourse/script/import_scripts/base.rb:447:in `block in create_categories'
        from /var/www/discourse/script/import_scripts/base.rb:438:in `each'
        from /var/www/discourse/script/import_scripts/base.rb:438:in `create_categories'
        from /var/www/discourse/script/import_scripts/mbox/importer.rb:50:in `import_categories'
        from /var/www/discourse/script/import_scripts/mbox/importer.rb:34:in `execute'
        from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'
        from script/import_scripts/mbox.rb:13:in `<module:Mbox>'
        from script/import_scripts/mbox.rb:11:in `<module:ImportScripts>'
        from script/import_scripts/mbox.rb:10:in `<main>'

你可以谷歌一下如何解决这个问题。我认为使用.dup可能是一个简单的方法。

1 个赞

更具体地说,我已经成功修改了允许导入的代码,在文件 /var/www/discourse/script/import_scripts/base.rb 的第 447 行添加了 .dup

params[:name].dup.strip!

有一点还不清楚:我该如何导入到多站点中的一个站点?

有人遇到过“无法修改冻结的字符串”错误吗?我的 index.db 创建正常,但在创建类别时失败了。

root@xxxxxxxxxx:/var/www/discourse# import_mbox.sh
mbox 导入正在开始...

正在加载现有组...

正在加载现有用户...

正在加载现有类别...

正在加载现有帖子...

正在加载现有主题...

正在创建索引

正在索引 /shared/import/data/xxxxx-xxxxxxx@xxxxxxx.com 中的文件

正在索引 /shared/import/data/xxxxx-xxxxxxx@xxxxxxx.com/export.mbox

正在索引回复和用户

正在创建类别

/var/www/discourse/script/import_scripts/base.rb:447:in `strip!': **无法修改冻结的字符串:“xxxxx-xxxxxxx@xxxxxxx.com” (****FrozenError****)**

from /var/www/discourse/script/import_scripts/base.rb:447:in `block in create_categories'

from /var/www/discourse/script/import_scripts/base.rb:438:in `each'

from /var/www/discourse/script/import_scripts/base.rb:438:in `create_categories'

from /var/www/discourse/script/import_scripts/mbox/importer.rb:50:in `import_categories'

from /var/www/discourse/script/import_scripts/mbox/importer.rb:34:in `execute'

from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'

from script/import_scripts/mbox.rb:13:in `<module:Mbox>'

from script/import_scripts/mbox.rb:11:in `<module:ImportScripts>'

from script/import_scripts/mbox.rb:10:in `<main>'