【发布时间】:2016-06-10 22:32:12
【问题描述】:
我尝试发送带有附件(一个 pdf 文件)的电子邮件,但收件人收到了一个名称不同且没有 .pdf 结尾的文件。文件名是希腊文..
try {
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress("from@mail.com"));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(mail));
message.setSubject(title,"utf-8");
// Create the message part
BodyPart messageBodyPart = new MimeBodyPart();
// Now set the actual message
messageBodyPart.setText("This is message body");
// Create a multipar message
Multipart multipart = new MimeMultipart();
// Set text message part
multipart.addBodyPart(messageBodyPart);
// Part two is attachment
messageBodyPart = new MimeBodyPart();
String filename = "file.pdf";
String f = name + " Πρόγραμμα Ιανουάριος 2016.pdf"; // the desired name of the file
DataSource source = new FileDataSource(filename);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(MimeUtility.encodeText(f, "UTF-8", null));
multipart.addBodyPart(messageBodyPart);
// Send the complete message parts
message.setContent(multipart);
Transport.send(message);
System.out.println("Mail " + mail +" sent");
} catch (MessagingException e) {
throw new RuntimeException(e);
}
name 是一个字符串变量,之前正在获取一个值。奇怪的是,如果我有String f = name + " αααα.pdf",接收者将成功获得一个名为Ρουβάς αααα.pdf 的pdf,但如果我有这个字符串f = name + " Πρόγραμμα Ιανουάριος 2016.pdf";,他没有。他越来越喜欢
=_UTF-8_B_zpzOtc Dz4POsc67zrHPgiDOmc6xzr3Ov8 FzqzPgc65zr_Pgi___ ___filename_1=__5wZGY=_=
我添加了message.writeTo(System.out);,我得到了:
MIME-Version: 1.0
Content-Type: multipart/mixed;
bou
ndary="----=_Part_0_1825884453.1457025565509"
------=_Part_0_1825884453.1457025565509
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
This is message body
------=_Part_0_1825884453.1457025565509
Content-Type: application/octet-stream;
name*0="=?UTF-8?B?zpzOtc+Dz4POsc67zrHPgiDOmc6xzr3Ov8+FzrHPgc6vzr/Pgi";
name*1="Ay?=
=?UTF-8?B?MDE2zpnOsc69zr/Phc6sz4HOuc6/z4IgMjAxNi5wZGY=?";
name*2="="
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename*0="=?UTF-8?B?zpzOtc+Dz4POsc67zrHPgiDOmc6xzr3Ov8+FzrHPgc6vzr/Pgi";
filename*1="Ay?=
=?UTF-8?B?MDE2zpnOsc69zr/Phc6sz4HOuc6/z4IgMjAxNi5wZGY=?";
filename*2="="
props.setProperty("mail.mime.encodeparameters", "false"); 或 true
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="----=_Part_0_797681969.1457074816557"
------=_Part_0_797681969.1457074816557
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
This is message body
------=_Part_0_797681969.1457074816557
Content-Type: application/octet-stream; name="?????????? 2016.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename*=Cp1252''%3F%3F%3F%3F%3F%3F%3F%3F%3F%3F%202016.pdf
【问题讨论】:
-
您不需要明确编码文件名;当您调用 setFileName 时,JavaMail 应该为您执行此操作。您使用的是什么版本的 JavaMail?如果在 Transport.send 之前添加
message.writeTo(System.out);,邮件标头是什么样的?正在使用什么程序来读取和显示收到的消息? -
我用
JavaMail is 1.5.5.接收方拿到的文件是没有文件结尾的,所以如果你添加.pdf就可以正常打开了。 -
我将
message.writeTo(System.out);的输出添加到问题@BillShannon -
如果你有 MimeMessageHelper 的实例,你可以添加 'mimeMessageHelper.setEncodeFilenames(false)' 会有所帮助
标签: java jakarta-mail mime-types mime