2016-02-27 38 views
1

我尝试发送带有附件的电子邮件(PDF文件),但接收方收到一个不同名称的文件,但没有.pdf结尾。该文件的名称是希腊..附件的名称编码失败

try { 
    MimeMessage message = new MimeMessage(session); 
    message.setFrom(new InternetAddress("[email protected]")); 
    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 
+0

你不应该明确地编码文件名;当你调用setFileName时,JavaMail应该为你做。你使用的是什么版本的JavaMail?如果在Transport.send之前添加'message.writeTo(System.out);',那么邮件标题的外观如何?正在使用什么程序来读取和显示收到的消息? –

+0

我使用'JavaMail是1.5.5.'接收器获取的文件没有文件结尾,所以如果您添加.pdf,您将正常打开它。 – yaylitzis

+0

我将'message.writeTo(System.out);'的输出添加到问题@BillShannon – yaylitzis

回答

0

因为你自己编码的文件名,你使用非标准MIME编码格式,如JavaMail FAQ中所述。然后使用标准RFC 2231技术将非标准编码文本分割为多个参数。正是这种非标准和标准格式的混合可能导致邮件阅读器的混乱。

尝试让JavaMail通过删除对MimeUtility.encodeText的调用来为您执行编码。如果这不起作用,请将系统属性mail.mime.encodeparameters设置为false以禁用RFC 2231编码。

+0

我删除了'MimeUtility.encodeText',并且我改进了一个pdf文件,但名称为'?? ??? ???? ???? ??? pdf。然后我补充说:'props.setProperty(“mail.mime.encodeparameters”,“false”);'和'true',但我也得到了????????。pdf – yaylitzis

+0

我加入到问题中'message.writeTo(System.out);' – yaylitzis

+0

的结果它看起来像你的默认字符集不适合文件名中的字符。尝试将系统属性'mail.mime.charset'设置为“utf-8”。 –