[JAVA] Der Dateiname des E-Mail-Anhangs ist verstümmelt

Phänomen

Ich habe festgestellt, dass der Name der angehängten Datei der E-Mail, die von der mit Spring Boot 2.3.4 entwickelten Anwendung (+ Spring-Boot-Starter-Mail) gesendet wurde, möglicherweise verstümmelt ist. image.png Dies ist eine Ansicht der in Outlook empfangenen E-Mail-Anhänge. Unten finden Sie den vereinfachten E-Mail-Sendecode.

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("Senden")
    helper.setText("Prüfung")

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

Wenn der Dateiname 13 Zeichen oder mehr in voller Breite enthält, wird er als verstümmelt oder codiert angezeigt.

E-Mails abrufen

Wenn Sie die Inhaltsdisposition in der Mailquelle überprüfen

//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="

Das Format der codierten Zeichenfolge hat sich geändert, z. B. die Attributnamen Dateiname * und Dateiname mit 12 und 13 Zeichen voller Breite als Begrenzung. Wenn ich dieselbe angehängte Datei in Outlook gesendet habe, wurde der Dateiname nicht verstümmelt, und als ich die Quelle überprüfte, wurde das Dateinamenmuster * auch für Dateinamen mit 13 oder mehr Zeichen voller Breite verwendet.

Quellcode-Untersuchung

Als ich dort nachgeschlagen habe, habe ich den folgenden Code in MimeMessageHelper gefunden.

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

Der Prozess verzweigt nicht abhängig von der Anzahl der Zeichen, aber es kann etwas geben, da er steuert, ob MimeUtility.encodeText mit einem Flag verwendet werden soll. Wenn Sie daher den folgenden Code hinzufügen, bevor Sie helper.addAttachment aufrufen, wird der Dateiname nicht verstümmelt, selbst wenn er 13 Zeichen in voller Breite oder mehr enthält.

helper.isEncodeFilenames = false

Ich konnte nicht tief in die Grundursache eintauchen, aber ich bin froh, dass ich sie vorerst gelöst habe.

Recommended Posts

Der Dateiname des E-Mail-Anhangs ist verstümmelt
[Windows] Java-Code ist verstümmelt
Wenn SimpleDateFormat wie ٢٠١٨١٠٠٤٠٨٣١٣٣٦٥٧ verstümmelt ist