JavaMail 发送后删除 Content-Length header

JavaMail delete Content-Length header after send

我的一个客户使用特定的邮件服务器来接收任何数据。 要发送文件,我需要像这样使用 headers:

...
MIME-Version: 1.0
Content-Type: application/octet-stream; name=file.zip
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=file.zip
Content-Length: 9245

--- base64 file content ---
...

我使用此代码创建消息,使用 JavaMail(v1.4.7)

final SMTPMessage message = new SMTPMessage(session); // I use SMTPMessage for add extensions 
message.setDisposition("attachment; filename=" + fileName);
message.setContent(content, "application/octet-stream; name=" + fileName);
message.setHeader("Content-Length", String.valueOf(content.length));
message.saveChanges();
...
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
message.writeTo(baos);
message.setMailExtension("SIZE=" + baos.size());

final SMTPTransport tr = (SMTPTransport) session.getTransport("smtp");
tr.connect(user, password); // I need to use SMTP and POP3 authorization
final Address[] a = new Address[adrses.size()];
tr.sendMessage(message, adrses.toArray(a));
tr.close();

当我用 props.setProperty("mail.debug", "true"); 发送邮件时,在日志中我没有看到 Content-Length header。 没有 Content-Length,服务器不接收消息。

请帮忙!如何正确添加Content-Length

Content-Length header 永远不应包含在传输中的邮件中。 SMTP 协议定义了消息的长度,与 header 无关。任何 SMTP 服务器都不应在其接收的邮件中要求 header。 Content-Length header 仅适用于 Unix 邮箱,其中多条消息组合在一个文件中。如果您的服务器需要 Content-Length header,它已损坏,应该修复。

如果您真的非常非常想发送带有 Content-Length header 的消息,您需要子类化 MimeMessage 并使用 ignoreList 覆盖 writeTo 方法并删除 "Content-Length" 在调用 super.writeTo.

之前来自 ignoreList

此外,您真的应该考虑升级到 current version of JavaMail