将 8 位 MIME 消息转换为引用打印

Posted

技术标签:

【中文标题】将 8 位 MIME 消息转换为引用打印【英文标题】:Convert 8bit MIME message to quoted-printable 【发布时间】:2011-06-12 21:24:12 【问题描述】:

将包含原始 8 位部分的 MIME 电子邮件转换为仅包含 7 位部分的符合 RFC822 的邮件的最简单方法是什么? 这些部分必须自动转换为“Content-Transfer-Encoding:quoted-printable”。

我的应用是用 Java 开发的。但是命令行工具会很棒。我尝试了reformime,但这个工具似乎有问题并且不能正确重写消息:-(

感谢您的帮助, 奥利维尔

【问题讨论】:

【参考方案1】:

JavaMail 似乎是一个不错的解决方案。从您的文件中创建一个MimeMessage,找到您要更改其内容传输编码的正文部分,调用MimeBodyPart.setHeader("Content-Transfer-Encoding", "quoted-printable"),然后通过MimeMessage.writeTo() 写出生成的消息。

类似这样的事情:

Session session = Session.getInstance(new Properties());
MimeMessage mm = new MimeMessage(new FileInputStream(msgfile));
// assuming we know that it's a multipart; otherwise, check Content-Type first...
MimeMultipart multi = (MimeMultipart) mm.getContent();
for (int i = 0; i < multi.getCount(); i++) 
    MimeBodyPart mbp = (MimeBodyPart) multi.getBodyPart(i);
    mbp.setHeader("Content-Transfer-Encoding", "quoted-printable");

mm.saveChanges();
mm.writeTo(new FileOutputStream(outfile));

请注意,默认情况下MimeMessage 会在您更改邮件时重置Message-ID 标头。如果您不想这样做,请将MimeMessage.updateMessageID() 覆盖为无操作。

【讨论】:

感谢您的回复。修改 JavaMail 的 MimeMessage 对象不适用于嵌套的 Multipart。使用您的解决方案,某些部分已更新,但有些部分未更新。我认为这是 JavaMail 的一个众所周知的问题(参见:labs.consol.de/lang/en/blog/java/java-mail/…)。 我的示例代码不处理嵌套的多部分;它只是向您展示您可能想要使用的功能的指南。您是否真的编写了一个递归程序来展示文章中提到的问题?因为从流中解析的消息不应该有这个问题......

以上是关于将 8 位 MIME 消息转换为引用打印的主要内容,如果未能解决你的问题,请参考以下文章

将 MIMEText 编码为引用的可打印文件

Imap消息编码问题

在 Swift 中解码引用的可打印消息

MIME Base64编码

如何在 SMTP 的多部分 MIME 消息中使用 8 位编码?

mime decode pdf 引用可打印