Von JavaMail gesendete E-Mails Der Dateiname der angehängten Datei kann von Google Mail nicht wiederhergestellt werden

Ich denke, wenn Sie E-Mails in Java senden, verwenden Sie meistens JavaMail.

In letzter Zeit ist das Problem aufgetreten, dass der Dateiname der angehängten Datei nicht durch die von JavaMail und Google Mail gesendeten E-Mails wiederhergestellt werden kann.

Der Dateiname des Anhangs wird im Wesentlichen durch den Dateinamenparameter im Content-Disposition-Header angegeben. Einige Mailer scheinen den Parameter name im Header "Content-Type" zu sehen, und javamail scheint den Dateinamen in beide einzubetten.

Es scheint jedoch, dass JavaMail 1.5.3 diesen Einbettungsteil behoben hat.

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

Wenn der Wert des Parameters lang ist, wird er gemäß RFC 2231 aufgeteilt.

Lassen Sie uns mit einem einfachen Programm überprüfen. Das erste ist "70 Zeichen nur für Zahlen" und das zweite ist "30 Zeichen nur für Hiragana".

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

Die Ergebnisse von JavaMail 1.5.2 und 1.5.3 sind wie folgt.

: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?="

Google Mail weiß, dass der erste auf den richtigen Dateinamen zurückgesetzt werden kann, der zweite jedoch nicht. (Stand 2017-11-21)

Betrachtet man den Content-Disposition-Header in der Google Mail-Funktion "Nachrichtenquelle anzeigen", so ist die zweite, dass die Parameterwerte nicht mit ihrer ursprünglichen Form verknüpft sind.

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

Ich bin nicht sicher, ob diese JavaMail-Verschiebung als MIME-Spezifikation korrekt ist. (Diejenigen, die verstehen, ich würde es begrüßen, wenn Sie mir sagen könnten) Wir wissen, dass nicht nur 1.5.3, sondern auch die aktuellste Version 1.6.0 dasselbe tun wird.

Wenn Sie den Wert der Systemeigenschaft mail.mime.splitlongparameters auf false setzen, entspricht das Verhalten dem von bis zu 1.5.2.

1.5.3(mail.mime.splitlongparameters=false)


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

Hinzugefügt (2017-11-30)

Ich fand es falsch, eine MIME-codierte Zeichenfolge an ContentDisposition # setParameter () zu übergeben. Ich werde zu einem späteren Zeitpunkt zusammenfassen, was zu tun ist.

Recommended Posts

Von JavaMail gesendete E-Mails Der Dateiname der angehängten Datei kann von Google Mail nicht wiederhergestellt werden
Benennen Sie den Paketnamen einer vorhandenen JAR-Datei um
Der angehängte Dateiname wurde in der Spring Boot-Mail verstümmelt, also Gegenmaßnahmen
[Kotlin] Ermittelt den Argumentnamen des Konstruktors durch Reflektion
Ruft den Objektnamen der vom neuen Operator erstellten Instanz ab
Ändern Sie den Dateinamen und das Ausgabeziel der JavaVM-Fehlerdatei
Korrigieren Sie den Namen der Kriegsdatei auf den in Maven festgelegten
Überschreiben Sie den gleichnamigen Upload mit dem BOX SDK (Java).