[英]Decoding a Mail.app e-mail attachment filename in Java
我在解碼電子郵件附件的文件名方面遇到了問題。 目前我正在使用JavaMail 1.4.2。 該文件名為“Żółw.rtf”(這是Turtle.rtf的潤色)。 郵件是使用Mail.app發送的(這看起來非常重要)。 重要的標題是:
--Apple-Mail-19-721116558
Content-Disposition: attachment;
filename*=utf-8''Z%CC%87o%CC%81%C5%82w.rtf
Content-Type: text/rtf;
x-unix-mode=0644;
name="=?utf-8?Q?Z=CC=87o=CC=81=C5=82w=2Ertf?="
Content-Transfer-Encoding: 7bit
相應的javax.mail.Part.getFileName()返回“=?utf-8?Q?Z = CC = 87o = CC = 81 = C5 = 82w = 2Ertf?=”,在應用MimeUtility.decodeText后,它是: “ZÃáoÃÅ≈Çw.rtf”。 顯然不是原來:)。
為了比較,MimeUtility.encodeText返回:
=?UTF-8?Q?=C5=BB=C3=B3=C5=82w.rtf?=
相比之下:
=?utf-8?Q?Z=CC=87o=CC=81=C5=82w=2Ertf?=
來自電子郵件。
根據我的研究,字母“Ż”可以用兩種方式編碼:作為單個字母或“Z”+以上點。 MimeUtility.encodeText使用前者,Mail.app使用后者。
但是我希望能夠解碼兩者。 有沒有辦法解碼使用JavaMail從Mail.app發送的文件名? 或者也許還有其他一些圖書館?
謝謝! 亞當
事實證明你必須規范化字符串:
String decoded = MimeUtility.decodeText(part.getFileName());
return Normalizer.normalize(decoded, Normalizer.Form.NFC);
很奇怪,但有效! :)更詳細地說,由於Mail.app將“Ż”編碼為兩個字符:“Z”+“dot-above”,然后必須使用Normalizer重新組合。
亞當
我不知道它是否有用我有一部分java編碼檢查郵件文件附件如果存在然后將其保存在指定的文件路徑中,並指定名稱和擴展名,如果文件名已存在於路徑下,則它會將值增加到文件名的結尾。 所以這是代碼片段:
enter
Multipart mp =(Multipart)messages [i] .getContent();
for (int j=0, n=mp.getCount(); j<n; j++) {
Part part = mp.getBodyPart(j);
String disposition = part.getDisposition();
if ((disposition != null) &&
((disposition.equals(Part.ATTACHMENT) ||
(disposition.equals(Part.INLINE))))){
String path = "c:\\Temp;
saveFile(part.getFileName(), part.getInputStream(),path);
}
}
public static void saveFile(String filename,InputStream input, String path) throws IOException {
if (filename == null) {
filename = File.createTempFile("xx", ".out").getName();
}
try{
boolean success = (new File(path)).mkdirs();
if (success) {
System.out.println("Directories: " + path + " created");
}
}catch (Exception e){//Catch exception if any
System.err.println("Error: " + e.getMessage());
}
String filenamepath = path + "//"+filename;
File file = new File(filenamepath);
for (int i=0; file.exists(); i++) {
String fname="";
String ext="";
int mid= filenamepath.lastIndexOf(".");
fname=filenamepath.substring(0,mid);
ext=filenamepath.substring(mid+1,filenamepath.length());
file = new File(newpath);
}
FileOutputStream fos = new FileOutputStream(file);
BufferedOutputStream bos = new BufferedOutputStream(fos);
BufferedInputStream bis = new BufferedInputStream(input);
int aByte;
while ((aByte = bis.read()) != -1) {
bos.write(aByte);
}
bos.flush();
bos.close();
bis.close();
System.out.println("File saved to :"+file+"*******");
}
這里
希望你覺得它有用。
此致,拉傑夫
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.