2016-02-27 6 views
1

Я пытаюсь отправить электронное письмо с вложением (файл A 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

Нельзя явно указывать имя файла; JavaMail должен сделать это для вас, когда вы вызываете setFileName. Какую версию JavaMail вы используете? Если вы добавите 'message.writeTo (System.out);' перед Transport.send, как выглядят заголовки сообщений? Какая программа используется для чтения и отображения полученного сообщения? –

+0

Я использую 'JavaMail 1.5.5 .' Файл, который получает получатель, не имеет конца файла, поэтому, если вы добавите .pdf, вы откроете его нормально. – yaylitzis

+0

Я добавил вывод 'message.writeTo (System.out);' на вопрос @BillShannon – yaylitzis

ответ

0

Поскольку вы кодирующая имя файла самостоятельно, вы используете нестандартный формат кодирования MIME, как описано в JavaMail FAQ. Затем этот нестандартный кодированный текст разбивается на несколько параметров с использованием стандартной методики RFC 2231. Это сочетание нестандартного и стандартного формата, вероятно, вызывает путаницу для почтового читателя.

Попробуйте использовать JavaMail для кодирования, удалив вызов MimeUtility.encodeText. Если это не работает, установите для свойства System mail.mime.encodeparameters значение false, чтобы отключить кодирование RFC 2231.

+0

Я удалил 'MimeUtility.encodeText', и у меня было улучшение по мере того, как я получал PDF-файл, но с именем' ?? ??? ???? ???? ???? Затем я добавил: «props.setProperty (« mail.mime.encodeparameters »,« false »);' и с «true», но я также получаю и PDF. – yaylitzis

+0

Я добавил к вопросу: результат 'message.writeTo (System.out);' – yaylitzis

+0

Похоже, что ваша кодировка по умолчанию не подходит для символов в имени файла. Попробуйте установить для свойства System 'mail.mime.charset' значение" utf-8 ". –