[JAVA] Le nom du fichier des pièces jointes aux e-mails est déformé

phénomène

J'ai remarqué que le nom du fichier joint du mail envoyé depuis l'application développée avec Spring Boot 2.3.4 (+ spring-boot-starter-mail) peut être déformé. image.png Il s'agit d'une vue des pièces jointes reçues dans Outlook. Vous trouverez ci-dessous le code d'envoi d'e-mail simplifié.

import org.springframework.mail.javamail.JavaMailSender
import org.springframework.mail.javamail.MimeMessageHelper
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.CommandLineRunner
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication

@SpringBootApplication
class SampleMailApplication : CommandLineRunner {

  @Autowired
  lateinit var mailSender: JavaMailSender

  override fun run(vararg args: String?)
    val message = mailSender.createMimeMessage()
    val helper = MimeMessageHelper(message, true)
    helper.setTo(username)
    helper.setFrom(username)
    helper.setSubject("Envoyer")
    helper.setText("tester")

    helper.addAttachment("Aiue Okakikukeko", ByteArrayResource("AIUEO".toByteArray()), "plain/text")
    helper.addAttachment("Aiue Okakikuke", ByteArrayResource("AIUEO".toByteArray()), "plain/text")
    helper.addAttachment("Aiue Okakikuke Kosashi", ByteArrayResource("AIUEO".toByteArray()), "plain/text")
    helper.addAttachment("Aiue Okakikuke Kosashisu", ByteArrayResource("AIUEO".toByteArray()), "plain/text")
    helper.addAttachment("Aiue Okakikuke Kosashi", ByteArrayResource("AIUEO".toByteArray()), "plain/text")

    helper.addAttachment("1234567890", ByteArrayResource("AIUEO".toByteArray()), "plain/text")
    helper.addAttachment("12345678901234567890", ByteArrayResource("AIUEO".toByteArray()), "plain/text")
    helper.addAttachment("123456789012345678901234567890", ByteArrayResource("AIUEO".toByteArray()), "plain/text")

    mailSender.send(message)
  }
}

fun main(args: Array<String>) {
  runApplication<SampleMailApplication>(*args)
}

Si le nom du fichier comprend 13 caractères pleine largeur ou plus, il sera affiché comme tronqué ou codé.

Vérifier le courriel

Si vous vérifiez la disposition du contenu dans la source de messagerie

//Aiue Okakikuke Kosashi
Content-disposition: attachment;
	filename*=UTF-8''%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A%E3%81%8B%E3%81%8D%E3%81%8F%E3%81%91%E3%81%93

//Aiue Okakikuke Kosashisu
Content-disposition: attachment;
	filename="=UTF-8B44GC44GE44GG44GI44GK44GL44GN44GP44GR44GT44GV44GX44GZ44Gb="

Le format de la chaîne de caractères codés a changé, comme les noms d'attribut étant le nom de fichier * et le nom de fichier, avec 12 et 13 caractères pleine largeur comme limite. De plus, lorsque j'ai envoyé le même fichier joint dans Outlook, le nom du fichier n'était pas déformé, et lorsque j'ai vérifié la source, le modèle de nom de fichier * était utilisé même pour les noms de fichiers avec 13 caractères de pleine largeur ou plus.

Recherche de code source

Quand je l'ai cherché là-haut, j'ai trouvé le code suivant dans MimeMessageHelper.

public void addAttachment(String attachmentFilename, DataSource dataSource) throws MessagingException {
  Assert.notNull(attachmentFilename, "Attachment filename must not be null");
  Assert.notNull(dataSource, "DataSource must not be null");
  try {
    MimeBodyPart mimeBodyPart = new MimeBodyPart();
    mimeBodyPart.setDisposition(MimeBodyPart.ATTACHMENT);
    mimeBodyPart.setFileName(isEncodeFilenames() ?
      MimeUtility.encodeText(attachmentFilename) : attachmentFilename);

Le processus ne crée pas de branche en fonction du nombre de caractères, mais il peut y avoir quelque chose car il contrôle s'il faut utiliser MimeUtility.encodeText avec un indicateur. Par conséquent, si vous ajoutez le code suivant avant d'appeler helper.addAttachment, le nom de fichier ne sera pas déformé même s'il contient 13 caractères pleine largeur ou plus.

helper.isEncodeFilenames = false

Je ne pouvais pas creuser profondément dans la cause profonde, mais je suis heureux de l'avoir résolue pour le moment.

Recommended Posts

Le nom du fichier des pièces jointes aux e-mails est déformé
[Windows] Le code Java est déformé
Lorsque SimpleDateFormat est déformé comme ٢٠١٨١٠٠٤٠٨٣١٣٣٦٥٧