javax.mail.Part和writeTo,无法获取与原文件相同的"eml"文件

javax.mail.Part and writeTo, unable to obtain the same "eml" file as the original one

我的应用程序通过 javamail 1.5.6 解析许多消息,它侦听传入的消息然后存储一些关于它们的信息。

几乎所有消息都包含数字签名,所以我的应用程序也需要检索完整的 eml,即表示电子邮件的原始文件,这样应用程序用户始终可以证明这些消息的有效性。

所以,一旦我有了 javax.mail.Message,我就必须生成它的 eml,所以我这样做:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
m.writeTo(baos);
this.originalMessage = baos.toString(StandardCharsets.UTF_8.name());

这种方法通常有效,但我收到了一些包含如下部分的多部分消息:

This is a multi-part message in MIME format. --------------55D0DAEBFD4BF19F87D16E72 Content-Type: text/plain; charset=iso-8859-15; format=flowed Content-Transfer-Encoding: 8bit

In allegato si notifica ai sensi e per gli effetti dell'art. 11 R.D. 1611/1993, al messaggio PEC, oltre alla Relata di Notifica e contestuale attestazione di conformità, --------------55D0DAEBFD4BF19F87D16E72

word "conformità" 在生成的字符串中没有正确转换,它变成了 "conformit�",例如用 MS Outlook 打开这样的 eml 会导致数字签名无效,因此消息看起来已损坏,不同于原来的

你有同样的想法吗?非常感谢

原始消息不是UTF-8编码的字符串,"eml"文件也不是UTF-8编码的文件。它们都是字节流,你的数字签名应该在字节流上工作。

在您的特定示例中,消息部分的内容使用 iso-8859-15 字符集编码,而不是 UTF-8。