Parece que MimeBodyPart.setFileName de JavaMail inserta un salto de línea en el mensaje de correo electrónico y hace que el nombre de archivo se muestre como no válido

Tenemos un código que sale al buzón de una persona y copia correos electrónicos con archivos adjuntos a un sistema de archivos.

El código para copiar el mensaje y el archivo adjunto funciona bien para la mayoría de los archivos, pero hay un problema con los nombres de archivo largos.

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);
} 

Por ejemplo, el nombre de archivo: "Copia de las opciones de CPT de cirugía SKI17042 para CRLM Population.xlsx" aparece en el archivo adjunto del correo electrónico con el nombre "Archivo adjunto sin título 00006.dat". Cuando miro el archivo .eml que se crea, parece que JavaMail inserta un salto de línea en el medio del nombre del archivo que puede estar causando el problema.

Cuando abro el .eml en un editor de texto, veo los encabezados con un salto de línea (observe los saltos de línea en las líneas 3/4 y 7/8 que abarcan el nombre del archivo:

------=_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

El contenido del archivo está bien, si toma el archivo y lo golpea en un .xlsx, se abre en Excel con el contenido como se esperaba.

¿Alguien tiene alguna información o ideas sobre cómo resolver este problema en el nombre del archivo adjunto en JavaMail?

¡Gracias!

EDITAR - Solución

    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();
Respuesta 1

Hola, tengo un problema cuando intento validar si el registro existe en este método, el cuadro de diálogo de alerta está bien, en la pantalla aparece "registro no encontrado", pero cuando escribo el registro correcto ...

Estoy tratando de analizar una cadena JSON, pero obtengo un error al intentar obtener un objeto anidado: JSONObject jsonObject = new JSONObject (jsonString); System.out.println (jsonObject); System.out.println (...

Hola, estoy trabajando con akka streams junto con akka-stream-kafka. Estoy configurando un Stream con la siguiente configuración: Fuente (Kafka) -> | Akka Actor Flow | -> Sink (MongoDB) Actor Flow básicamente por ...

Tengo una aplicación Java Spring Boot que funciona con una base de datos Postgres. Quiero usar Docker para los dos. Inicialmente, creé un archivo docker-compose.yml como se muestra a continuación: versión: servicios '3': db: ...