2016-02-27 53 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」。 –