E-mail envoyé par JavaMail Impossible de restaurer le nom de fichier du fichier joint par Gmail

Lors de l'envoi de courrier en Java, je pense que la plupart du temps, vous utilisez JavaMail.

Récemment, le problème selon lequel le nom de fichier du fichier joint ne peut pas être restauré par le courrier envoyé par JavaMail et Gmail est arrivé.

Le nom de fichier de la pièce jointe est essentiellement spécifié par le paramètre filename dans l'en-tête Content-Disposition. Certains expéditeurs semblent voir le paramètre de nom dans l'en-tête Content-Type, et javamail semble intégrer le nom de fichier dans les deux.

Cependant, il semble que JavaMail 1.5.3 a corrigé cette partie d'intégration.

https://github.com/javaee/javamail/commit/85051272fde868b9fa51e5eb9ca57dcbffffab5a

Si la valeur du paramètre est longue, elle sera divisée selon la RFC 2231.

Vérifions avec un programme simple. Le premier est «70 caractères pour les nombres seulement» et le second est «30 caractères pour hiragana seulement».

ContentDispositionTest.java


import javax.mail.internet.ContentDisposition;
import javax.mail.internet.MimeUtility;

public class ContentDispositionTest {
    public static void main(String args[]) throws Exception {
        ContentDisposition cd = new ContentDisposition("attachment");
        cd.setParameter("filename",
                        "1234567890123456789012345678901234567890123456789012345678901234567890");
        System.out.println(cd.toString());

        cd.setParameter("filename",
                        MimeUtility
                                .encodeText("Aiue Okakikuke Kosashi Suseso", "UTF-8", "B"));
        System.out.println(cd.toString());
    }
}

Les résultats de JavaMail 1.5.2 et 1.5.3 sont les suivants.

:1.5.2


attachment; 
	filename=1234567890123456789012345678901234567890123456789012345678901234567890
attachment; 
	filename="=?UTF-8?B?44GC44GE44GG44GI44GK44GL44GN44GP44GR44GT44GV44GX44GZ44Gb44Gd?="

:1.5.3


attachment; 
	filename*0=123456789012345678901234567890123456789012345678901234567890; 
	filename*1=1234567890
attachment; 
	filename*0="=?UTF-8?B?44GC44GE44GG44GI44GK44GL44GN44GP44GR44GT44GV44GX44"; 
	filename*1="GZ44Gb44Gd?="

Gmail sait que le premier peut être restauré avec le nom de fichier correct, mais pas le second. (À partir du 21/11/2017)

En regardant l'en-tête Content-Disposition dans la fonction "Afficher la source du message" de Gmail, la seconde est que les valeurs des paramètres ne sont pas concaténées dans leur forme d'origine.

Content-Disposition: attachment; filename="=?UTF-8?B?44GC44GE44GG44GI44GK44GL44GN44GP44GR44GT44GV44GX44\"; filename*1=\"GZ44Gb44Gd?="

Je ne suis pas sûr que ce déplacement JavaMail soit correct en tant que spécification MIME. (Ceux qui comprennent, j'apprécierais que vous me le disiez) Nous savons que non seulement la 1.5.3, mais la dernière version actuelle 1.6.0 fera de même.

En définissant la valeur de la propriété système mail.mime.splitlongparameters sur false, le comportement sera le même que dans la version 1.5.2.

1.5.3(mail.mime.splitlongparameters=false)


attachment; 
	filename=1234567890123456789012345678901234567890123456789012345678901234567890
attachment; 
	filename="=?UTF-8?B?44GC44GE44GG44GI44GK44GL44GN44GP44GR44GT44GV44GX44GZ44Gb44Gd?="

Ajouté (30/11/2017)

J'ai trouvé erroné de passer une chaîne codée MIME à ContentDisposition # setParameter (). Je résumerai ce qu'il faut faire à une date ultérieure.

Recommended Posts

E-mail envoyé par JavaMail Impossible de restaurer le nom de fichier du fichier joint par Gmail
Renommez le nom du package d'un fichier jar existant
Le nom du fichier joint a été déformé dans le courrier de Spring Boot, donc des contre-mesures
[Kotlin] Récupère le nom de l'argument du constructeur par réflexion
Récupère le nom d'objet de l'instance créée par le nouvel opérateur
Modifier le nom de fichier et la destination de sortie du fichier d'erreur JavaVM
Fixez le nom du fichier de guerre à celui défini dans Maven
Écraser le téléchargement du fichier avec le même nom avec BOX SDK (java)