Import_mbox.sh 在处理通过邮件列表服务器发送的来自三星手机的电子邮件时无法正常工作

我的测试设置中出现了一个奇怪的问题,我正在将电子邮件复制到我的 discourse 服务器并运行 import_mbox.sh 来合并这些电子邮件。原始电子邮件来自一个邮件列表。

我发现,如果人们使用三星手机回复之前的邮件列表电子邮件,当我尝试将由此产生的电子邮件导入 discourse 时,它不会提取新内容,而是会复制原始电子邮件,但将其标记为回复者所写。

如果我将有问题的原始电子邮件复制/粘贴到 Emails/Advanced Test 框中,也会出现同样的问题。如果我截断电子邮件并删除一些三星添加的部分,它似乎就能正常工作。

我无法在此处放置触发此问题的电子邮件副本,因为它们是机密的。无法导入的电子邮件包含类似以下的节(没有人类可读的内容——所有内容都以 base64 编码):

[此处截断的标题]
Content-Type: multipart/alternative;
	boundary="--_com.samsung.android.email_341310020171250"

----_com.samsung.android.email_341310020171250
Content-Transfer-Encoding: base64
Content-Type: text/plain; charset=UTF-8

VGhlIGxlZ2lzbGF0aW9uI[truncated]
[...]
[truncated]X19fX19fX19fX18NCg==
----_com.samsung.android.email_341310020171250
Content-Type: multipart/related;
	boundary="--_com.samsung.android.email_341310031317791"

所以你需要修改 import_mbox.sh 来截断电子邮件并删除那些三星的无用内容。

可能是一个可以在核心代码中解决的问题,因为这些消息在通过电子邮件处理时可能会失败(但我最近没有看代码,所以我不知道)。无论如何,最快捷的解决方案可能是修改导入脚本来处理这些消息。

或者也许有人会认识到这是核心代码中的一个问题并修复它。

1 个赞

经过进一步的调查,三星邮件应用程序似乎对纯文本和 HTML 部分进行了编码,每个部分都用 base64 编码。我发现如果在两者之间添加一个空行,邮件过滤器就能正常工作。可能是三星没有添加它应该添加的空行,或者邮件过滤器未能正确找到纯文本/HTML 文本部分,并且没有意识到一旦找到 HTML 部分,它就知道该部分的标题在哪里结束以及消息内容从哪里开始。

我尝试复制 Gmail 中的原始电子邮件(通过查看原始邮件)以及从 Thunderbird 导出相同的消息,结果相同。

三星生成的电子邮件似乎在其标题的底部有以下内容:

Content-Type: multipart/alternative;

	boundary="--_com.samsung.android.email_396413402758380"

----_com.samsung.android.email_396413402758380
Content-Transfer-Encoding: base64
Content-Type: text/plain; charset=UTF-8

WWVz[base64 编码的纯文本消息在此处]

并以以下内容结束:

[更多 base64 编码数据在此处]19fDQo=
----_com.samsung.android.email_396413402758380
Content-Transfer-Encoding: base64
Content-Type: text/html; charset=UTF-8

PGh0b[再次进行 base64 编码,这次是对同一消息的 HTML 版本进行编码]

并以以下内容结束:

[更多 base64 编码数据]NCg==
----_com.samsung.android.email_396413402758380--

现在,如果我通过在“email_396413402758380”部分之后添加一个空行来更改中间部分,一切都会完美运行!

[更多 base64 编码数据在此处]19fDQo=
----_com.samsung.android.email_396413402758380

Content-Transfer-Encoding: base64
Content-Type: text/html; charset=UTF-8

PGh0b[再次进行 base64 编码,这次是对同一消息的 HTML 版本进行编码]

这是否表明导入器存在错误?

对我来说,这表明三星的邮件程序存在错误。但我不确定,而且这与谁的错误无关。

不过,最简单的解决方法是在导入脚本中添加一个 gsub 来添加你描述的空行。

Content-Transfer-Encoding: base64 前插入一行可能更容易。

希望这不会破坏其他任何东西。

但 Gerhard 正在写一个更好的答案……现在

1 个赞

在这种情况下,我认为是我们用于解析电子邮件的 mail gem 中的一个 bug,或者是三星应用程序中的一个 bug。快速浏览了 RFC 后,我认为这很可能是解析器中的一个 bug。

您能否提供一个此类有问题电子邮件的完整示例?也许您可以请您的机密电子邮件的作者之一给您发送一封非机密电子邮件?

2 个赞

我尝试通过解码 base64、更改措辞,然后重新编码来构造一封电子邮件,并发现了其他有趣的东西。

删除原始消息中间的空格字符可以正确提取上面编写的回复。

在此示例中,在 base64 编码的 HTML 消息中间,如果我找到一个包含 [空格] 然后是斜杠 div 的行,并将其删除,从而将

21  20:17  (GMT+00:00) </div><div>To: LIST@LISTS

更改为

21  20:17  (GMT+00:00)</div><div>To: LIST@LISTS

通过删除 /div 前面的 [空格] 字符,然后重新编码为 base64 并将其放回管理员设置中的消息测试框中,过滤器就可以工作了。

如果需要,我可以发送一封电子邮件通过私信?

我制作了一个我认为可以说明问题的示例电子邮件。如果您查看 HTML 部分,它会回复之前的消息。导入器似乎无法看到原始消息是从哪里开始的。

From someone@gmail
Delivered-To: someone@gmail
Importance: Normal
MIME-Version: 1.0
Message-ID: <E1mt6gg-00H2OV-6N@relay01.mail.eu.clara.net>
Date: Fri, 3 Dec 2021 11:25:05 +0000
From: someone <someone@somewhere.net>
Subject: Re: Example e-mail
To: <LIST@LISTSERV>
In-Reply-To: <007301d7e834$c268a3e0$4739eba0$@sslmc.co.uk>
Precedence: list
Content-Type: multipart/alternative;
	boundary="--_com.samsung.android.email_7076959834053910"

----_com.samsung.android.email_7076959834053910
Content-Transfer-Encoding: base64
Content-Type: text/plain; charset=UTF-8

Yes and we are getting lots in ABC and urgent care, along with vaccination side effects from flu + booster. Apparently DEF111 can't deal with this sort of query. Looking good for Xmas and NY week   2222

Sam

Dr Sam Smithy 

---- Original message ----
From: South Souths XYZ <enquiry@SSXYZ.CO.UK>
Date: 03/12/2021 10:59 (GMT+00:00)
To: LISTS@LISTSERV.ABC.ORG.UK
Subject: everything lands back at our door!

Practices reporting to get 2 or 3 queries/day from patients regarding five vaccine issues who have been referred to their GP by XYZ 123 or the NBS. These queries include scheduling doses for immunospressed pts as well as phamaceutical questions. 
----_com.samsung.android.email_7076959834053910
Content-Transfer-Encoding: base64
Content-Type: text/html; charset=UTF-8

<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body dir="auto"><div dir="auto">Yes and we are getting lots in ABC and urgent care, along with vaccination side effects from flu + booster. Apparently DEF111 can't deal with this sort of query. Looking good for Xmas and NY week &nbsp; &nbsp;2222</div><div dir="auto"><br></div><div dir="auto">Sam</div><div dir="auto"><br></div><div id="composer_signature" dir="auto"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">Dr Sam Smithy&nbsp;</div><div dir="auto"><br></div><div><br></div><div align="left" dir="auto" style="font-size:100%;color:#000000"><div >---- Original message ----</div><div >From: South Souths XYZ &lt;enquiry@SSXYZ.CO.UK&gt; </div><div>Date: 03/12/2021  10:59  (GMT+00:00) </div><div>To: LISTS@LISTSERV.ABC.ORG.UK </div><div>Subject: everything lands back at our door! </div><div><br></div></div><div class="WordSection1"><p class="MsoNormal"><span style="font-family:'Arial','sans-serif';">Practices reporting to get &nbsp;2 or 3 queries/day from patients regarding five vaccine issues who have been referred to their GP by XYZ 123 or the NBS.&nbsp; These queries include scheduling doses for immunospressed pts as well as phamaceutical questions.&nbsp; </span></p></div></body></html>
----_com.samsung.android.email_7076959834053910--

此问题似乎也会影响来自其他邮件客户端的消息,我现在才发现。我无法公开张贴导致所有人都能查看的故障邮件,但很乐意私下给某人查看。

我目前的设置是在家庭服务器上安装了 Discourse,发送到列表服务器邮件列表的电子邮件会发送给我(该邮件会发送到 Gmail 帐户)。如果“收件人:”过滤器与列表服务器的名称匹配,我已将 Gmail 设置为将该电子邮件的副本转发到 mailinglist@mydiscoursedomain.org.uk。Discourse 有一个设置为镜像列表的类别,该类别会查找此电子邮件。

如果我也使用 import_mbox.sh 脚本,在手动复制电子邮件后,也会出现同样的问题,因此一定是查找邮件新部分的代码部分感到困惑。

有什么办法可以让 Discourse 快速处理所有先前存储的导入电子邮件,并尝试使用原始电子邮件的纯文本部分重新格式化它们,以作为上述问题的临时解决方案吗?导入前设置为使用 HTML 部分。通过使用“rails c”进行查看,我可以看到每个帖子似乎都存储了传入消息的全部文本(包括电子邮件标题)。我尝试在关闭 HTML 选项后运行“rake posts:rebuild”,虽然它缓慢地处理所有消息,但不确定是否有任何变化,例如,我也尝试打开和关闭“show trimmed content”选项,但在 rake 完成后,帖子上的三个点的小框似乎仍然存在。