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