我在解码电子邮件附件的文件名方面遇到了问题。目前我正在使用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ááÃÅ≈Ç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发送的文件名?或者也许还有其他一些图书馆?
谢谢! 亚当
答案 0 :(得分:12)
原来你必须规范化字符串:
String decoded = MimeUtility.decodeText(part.getFileName());
return Normalizer.normalize(decoded, Normalizer.Form.NFC);
很奇怪,但是有效! :) 更详细地说,由于Mail.app将“Ż”编码为两个字符:“Z”+“dot-above”,然后必须使用Normalizer重新组合。
亚当
答案 1 :(得分:0)
我不知道它是否有用我有一部分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+"*******");
}
这里
希望你觉得它很有用。
此致 拉杰夫