我的一个客户端使用特定的邮件服务器来接收任何数据。 要发送文件,我需要使用这样的标题:
...
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标头。
如果没有Content-Length,服务器就不会收到消息。
请帮忙!如何正确添加内容长度
答案 0 :(得分:3)
Content-Length标头永远不应包含在传输中的邮件中。 SMTP协议定义消息的长度,与标头无关。没有SMTP服务器应该在它收到的消息中要求标头。 Content-Length标头仅用于在多个消息组合在一个文件中的Unix邮箱中。如果你的服务器需要Content-Length标题,那么它就会被破坏并且应该被修复。
如果你真的,真的,真的想要发送带有Content-Length头的消息,你需要继承MimeMessage并用ignoreList覆盖writeTo方法,并在调用super之前从ignoreList中删除“Content-Length” .writeTo。
此外,您应该考虑升级到current version of JavaMail。