Похоже, JavaMail MimeBodyPart.setFileName вставляет разрыв строки в сообщение электронной почты и заставляет имя файла отображаться как недопустимый - PullRequest
0 голосов
/ 16 ноября 2018

У нас есть код, который отправляется в почтовый ящик человека и копирует электронные письма с вложениями в файловую систему.

Код для копирования сообщения и вложения работает нормально для большинства файлов, но есть проблема с длинными именами файлов.

if (attachment instanceof FileAttachment || attachment.getIsInline()) {
    System.out.println(attachment.getName());
    String FILE_NAME = "C:path\\" + attachment.getName();
    attachment.load(FILE_NAME);

    MimeBodyPart attachmentMime = new MimeBodyPart();
    attachmentMime.setContent(new MimeMultipart(attachment.getContentType()));
    javax.activation.DataSource source = new FileDataSource(FILE_NAME);
    attachmentMime.setDataHandler(new DataHandler(source));
    attachmentMime.setFileName(attachment.getName());
    multipart.addBodyPart(attachmentMime);
} 

Например, имя файла: «Копия выбора CPT операции SKI17042 для CRLM Population.xlsx» отображается во вложении электронной почты с именем «Untitled attachment 00006.dat».Когда я смотрю на файл .eml, который создается, я вижу, что JavaMail вставляет разрыв строки в середине имени файла, что может вызывать проблему.

Когда я открываю .eml в текстовом редакторе,Я вижу заголовки с разрывом строки (обратите внимание на разрывы строк в строках 3/4 и 7/8, которые охватывают имя файла:

------=_Part_3_840180718.1542390637623
Content-Type: application/octet-stream; 
    name*0="Copy of SKI17042 surgery CPT choices for CRLM
 population.xls"; name*1=x
Content-Transfer-Encoding: base64
Content-Disposition: attachment; 
    filename*0="Copy of SKI17042 surgery CPT choices for CRLM
 population.xls"; filename*1=x

Содержание файла в порядке, если вы берете файл и шлепаете по.xlsx открывается в Excel с ожидаемым содержимым.

У кого-нибудь есть какая-либо информация или идеи о том, как решить эту проблему с именем вложения файла в JavaMail?

Спасибо!

РЕДАКТИРОВАТЬ - Решение

    Properties props = System.getProperties();

    props.put("mail.mime.splitlongparameters", false);

    Session session = Session.getInstance(props, null);

    createProjectFolder(folder);

    Message message = new MimeMessage(session);
    message.setFrom(new InternetAddress(objectJSON.getString("from"), objectJSON.getString("fromName")));
    message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(objectJSON.getString("to")));
    message.setRecipients(Message.RecipientType.CC, InternetAddress.parse(objectJSON.getString("cc")));
    message.setSubject(objectJSON.getString("subject"));
    message.setSentDate(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a").parse(objectJSON.getString("date")));

    // create the message part 
    Multipart multipart = new MimeMultipart("mixed");
    MimeBodyPart content = new MimeBodyPart();

    // fill message
    if (objectJSON.getString("body").toLowerCase().contains("html")) {
        content.setContent( objectJSON.getString("body"), "text/html; charset=utf-8" );
    }
    else {
        content.setText(objectJSON.getString("body"), "utf-8");
    }

    multipart.addBodyPart(content);

        if (objectJSON.getInt("hasAttachment") == 1) {

            ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP2);

            service.setUrl(new URI("https://mail/ews/Exchange.asmx"));

            ExchangeCredentials credentials = new WebCredentials(developerEmail, password);

            service.setCredentials(credentials);

            try {

                EmailMessage messageWithAttachment = EmailMessage.bind(service, new ItemId(emailId));

                    AttachmentCollection attachmentsCol = messageWithAttachment.getAttachments(); 
                    System.out.println("attachments: " + attachmentsCol.getCount());
                    for (int i = 0; i < attachmentsCol.getCount(); i++) { 
                        FileAttachment attachment = (FileAttachment)attachmentsCol.getPropertyAtIndex(i); 

                        if (attachment instanceof FileAttachment || attachment.getIsInline()) {
                            System.out.println(attachment.getName());
                            String FILE_NAME = "C:\\R2D4\\eclipse-workspace\\DataLine\\WebContent\\WEB-INF\\email_attachments\\" + attachment.getName();
                            attachment.load(FILE_NAME);

                            MimeBodyPart attachmentMime = new MimeBodyPart();
                            attachmentMime.setContent(new MimeMultipart(attachment.getContentType()));
                            javax.activation.DataSource source = new FileDataSource(FILE_NAME);
                            attachmentMime.setDataHandler(new DataHandler(source));
                            attachmentMime.setFileName(attachment.getName());
                            multipart.addBodyPart(attachmentMime);

                        } 

                    }

            }
            catch(Exception e) {
                e.printStackTrace();
            }

            service.close();

        }


    // integration
    message.setContent(multipart);
    message.saveChanges();

1 Ответ

0 голосов
/ 16 ноября 2018

Если имя файла длиннее 60 символов, оно будет разделено на несколько параметров, как описано в RFC 2231. Похоже, ваш код, обрабатывающий сообщения, не понимает, как обрабатывать параметры, закодированные в RFC 2231. Вы можете отключить любое использование кодировки RFC 2231, установив для свойства mail.mime.encodeparameters значение false. Вы можете отключить только разделение длинных параметров, установив (к сожалению недокументированное) свойство mail.mime.splitlongparameters в значение false.

...