简体   繁体   English

JavaMail发送后删除Content-Length标头

[英]JavaMail delete Content-Length header after send

One of my client use specific mail server to receive any data. 我的一位客户使用特定的邮件服务器来接收任何数据。 To send file, I need use headers like this: 要发送文件,我需要使用以下标头:

...
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 ---
...

I use this code to create a message, using JavaMail(v1.4.7) 我使用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();

When I send mail with props.setProperty("mail.debug", "true"); 当我使用props.setProperty("mail.debug", "true");发送邮件时props.setProperty("mail.debug", "true"); , in log I don't see Content-Length header. ,在日志中我看不到Content-Length标头。 Without Content-Length, server don't receive message. 如果没有Content-Length,服务器将不会收到消息。

Please help! 请帮忙! How to add Content-Length correctly 如何正确添加Content-Length

The Content-Length header is never supposed to be included in messages in transit. Content-Length标头绝不应包含在传输中的消息中。 The SMTP protocol defines the length of the message, independent of the header. SMTP协议定义消息的长度,与标题无关。 No SMTP server should ever require the header in messages it receives. 任何SMTP服务器都不应在收到的邮件中要求标头。 The Content-Length header is only intended for use in Unix mailboxes where multiple messages are combined in a single file. Content-Length标头仅用于在多个文件合并到一个文件中的Unix邮箱中。 If you have a server that requires the Content-Length header, it's broken and should be fixed. 如果您的服务器需要Content-Length标头,则该服务器已损坏,应予以修复。

If you really, really, really want to send a message with a Content-Length header, you'll need to subclass MimeMessage and override the writeTo method with an ignoreList and remove "Content-Length" from the ignoreList before calling super.writeTo. 如果您确实真的要发送带有Content-Length标头的消息,则需要在调用super.writeTo之前,将MimeMessage子类化,并用ignoreList覆盖writeTo方法,并从ignoreList中删除“ Content-Length”。

Also, you should really consider upgrading to the current version of JavaMail . 另外,您应该真正考虑升级到JavaMail当前版本

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM