导入“无法映射帖子”错误

我在导入时大约有 1000 篇帖子失败,主要错误似乎是“映射帖子失败”,例如:

无法映射帖子 b9ec0145-e587-c0e2-768d-ad482c3ab928@mmtaylor.net
undefined method `hex’ for nil:NilClass

这似乎导致许多其他帖子失败,并出现类似以下的错误信息:

1109 / 65895 ( 1.7%) [400 项/分钟] 父消息 b9ec0145-e587-c0e2-768d-ad482c3ab928@mmtaylor.net 不存在。跳过 CAKPLMstp+CaTyfFinM-dHHpVxNHt0fy2vXT9Fx+21mE2RT-ijg@mail.gmail.com: A PCT approach to the “Power Law”

有什么建议可以解决此问题吗?

我有 28 年的帖子,每年一个文件夹,每月一个 mbox 文件。mbox 文件中共有 66909 条消息。导入显示为 65895。相差的 1014 条是否就是导入输出中指示的失败条目?

这些帖子是通过 Aid4Mail 从 Eudora mbx 格式转换为标准 mbox 格式的。

对于“父消息不存在”错误,我发现了 421 个实例。
对于“映射帖子失败”错误,我发现了 149 个实例。

我的 split_regex 是 “^From .@. [0-9]{4}”,这似乎适用于如下所示的邮件头:

From mmt-xxx@somedomain.net Wed Aug 10 12:06:53 2016

3 个赞

救命!对此有什么建议吗?:woozy_face:

上周我在处理另一个问题时也遇到过同样的错误。我打算本周修复它,并在修复后在此处发布更新。

这些只是警告,很可能是因为“无法映射帖子”的错误而出现的。当某条消息引用了不存在的帖子时就会发生这种情况。我相当确定,修复另一个问题后,这些警告中的大多数(如果不是全部的话)都会消失。

5 个赞

该错误应已通过 FIX: Email attachments with a size of 0 bytes caused error · discourse/discourse@e84d88d · GitHub 修复。

3 个赞

我已升级、重新构建了导入,确认 receiver.rb 已更新,并再次运行导入。

这似乎解决了好几百条消息的问题,谢谢。

不过,仍有大约 200 条消息失败,原因主要有两类:

缺少日期。跳过 bbe76bf7a9cab5a2ec2a06e6ef453555

无法映射邮件 23a86e52-71ba-7435-1c9c-c4f2a134b90d@mmtaylor.net 对应的帖子
Discourse::InvalidAccess

此外,还有大量“父项不存在”的提示,我推测这些是由上述问题导致的。

请问这些错误可能是什么原因?对于第一个问题,我查看了 mbx 邮件,但并未发现缺少日期。

您可以查看导入脚本生成的 index.db 文件。这是一个 SQLite3 数据库。您可以运行以下查询,查看解析器正在处理的数据。该查询将选择您发布的两个 Message-ID 对应的邮件。

SELECT *
FROM email
WHERE msg_id IN ('bbe76bf7a9cab5a2ec2a06e6ef453555', '23a86e52-71ba-7435-1c9c-c4f2a134b90d@mmtaylor.net')

我想 email_dateraw_message 这两列对您来说可能最有趣。也许您能找出是什么让邮件解析器感到困惑……

1 个赞

第一条记录的日期为 null,我在 mbx 中也看到该消息没有日期。我注意到带有“:Re”的回复出现在“初始”消息之前,这就是我以为日期并未缺失的原因。导入时是否将具有该主题的父消息作为文件中的第一条?

邮件日期是否取自“Date:”行,例如?

Date: Wed, 25 Mar 1992 12:23:00 GMT

我会看看能否修复那些缺失日期的记录。

关于第二个问题,我看不出有什么明显错误。这张图片是否对问题有任何提示?

不是,除非你将导入器的 group_messages_by_subject 设置更改为 true,否则它会使用 In-Reply-ToReferences 头进行匹配,并按 Message-ID 排序。

是的。

我最大的猜测是某个附件存在问题。也许是文件扩展名不被允许?

1 个赞

我确实将 group_messages_by_subject 设置为了 true,因为如果不这样设置,完全没有任何分组。

该消息包含两个内联图片:

Content-Type: application/octet-stream;
name=“Conflict (was … long live Wil”
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename=“Conflict (was … long live Wil”

Content-Type: image/jpeg; name=“2.1.3FarmerSideEffectLoop.jpg”
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename=“2.1.3FarmerSideEffectLoop.jpg”

是否可能是因为第一个文件名没有扩展名?

1 个赞

我能否通过在 index.db 中插入日期来解决日期问题,而不是去折腾 mbx 文件?

1 个赞

是的,这样可以。我过去也这样做过。我建议在 settings.yml 中将 index_only 设置为 true,这样它就不会在索引消息后立即开始导入。你可以在索引完成后在数据库中进行所有必要的更改。然后将 index_only 改回 false 并重新启动导入。

我觉得我可能误解了某些地方。索引不是已经完成了吗?毕竟 index.db 已经构建好了。

我已经把 index.db 转移到了我的桌面。我打算先更新日期,然后把 index.db 传回服务器,再运行导入。这样不对吗?

我决定采用编辑 mbox 文件的方法,添加一行“Date”,例如“Date: Wed, 25 Mar 1992 17:43:06”。我传输了更新后的文件并重新运行了导入操作,共两次。然而,email_date 字段并未更新。

我需要删除 index.db 吗?

是的,你需要删除它。

1 个赞