mbp.setFileName(new String(fds.getName().getBytes("gb2312"),"iso8859-1"));
解决方案 »
- 这道android程序为什么出错?
- 如何从.java文件中分析函数调用
- 关于BorderLayout的问题
- linux下java项目的部署
- JB的进来看一看.急,在线等,谢谢!
- 关于线程的疑问...
- java的swing中,很多时候一个JComponent有一个Model和它对应,这个Model有什么用?
- 怎么判断socketclient与socketserver中断了?
- 急聘系统设计人员一名(兼职)
- (JMF) how to adjust the capturing volume(microphone)?
- 请问JAVA类似MFC CFileDialog的类是哪个?
- 如何用获取一个图片文件的长度、高度数值??
MimeUtility.encodeText(fds.getName())
通用的mail client应该可以处理的
用他就能得到这个中文附件名字了,:
/*
@从BodyPart中提取使用ISO-8859-1编吗的文件名
@因为BodyPart.getFilename()过程已经对文件名作了一次编码,有时不能直接使用
*/
public static String getISOFileName(Part body){
//设置一个标志,判断文件名从Content-Disposition中获取还是从Content-Type中获取
boolean flag=true;
if(body==null){
return null;
}
String[] cdis;
try{
cdis=body.getHeader("Content-Disposition");
}
catch(Exception e){
return null;
}
if(cdis==null){
flag=false;
}
if(!flag){
try{
cdis=body.getHeader("Content-Type");
}
catch(Exception e){
return null;
}
}
if(cdis==null){
return null;
}
if(cdis[0]==null){
return null;
}
//从Content-Disposition中获取文件名
if(flag){
int pos=cdis[0].indexOf("filename=");
if(pos<0){
return null;
}
//如果文件名带引号
if(cdis[0].charAt(cdis[0].length()-1)=='"'){
return cdis[0].substring(pos+10,cdis[0].length()-1);
}
return cdis[0].substring(pos+9,cdis[0].length());
}
else{
int pos=cdis[0].indexOf("name=");
if(pos<0){
return null;
}
//如果文件名带引号
if(cdis[0].charAt(cdis[0].length()-1)=='"'){
return cdis[0].substring(pos+6,cdis[0].length()-1);
}
return cdis[0].substring(pos+5,cdis[0].length());
}
}
如果有不明白的在给我短信,上面的方法是我做javamail时候做的。很好用的
我给你的方法能处理上面的所有形式。
filename=new String(filename.getBytes("gb2312"),"iso-8859-1");
试试这个代码!
String[] mail=null;
int messageNumber=this.getMsgNumber(messageID);
if(messageNumber>0)
{
Folder folder;
this.Connect();
try{
folder = store.getDefaultFolder();
folder = folder.getFolder(url.getFile());
if(folder.exists())
{
folder.open(Folder.READ_WRITE);
if(folder.getMessageCount()>0)
{
Message msg = folder.getMessage(messageNumber);
boolean attachment=false;
int attachmentNum=0;
String[] attachmentFiles=null;
Object content=msg.getContent();
if(content instanceof Multipart)
{
Multipart multipart=(Multipart)content;
attachmentFiles=new String[multipart.getCount()];
for(int j=0;j<multipart.getCount();++j)
{
if(multipart.getBodyPart(j).getFileName()!=null)
{
attachmentFiles[attachmentNum]=MimeUtility.decodeText(multipart.getBodyPart(j).getFileName());
attachment=true;
}
else
attachmentFiles[attachmentNum]=null;
attachmentNum++;
}
}
Address[] cc=null;
Address[] bcc=null;
String[] priority;
if(!attachment)
{
mail=new String[10];
if(!msg.isSet(Flags.Flag.SEEN))
{
mail[0]="1";//新邮件
msg.setFlag(Flags.Flag.SEEN,true);
}
mail[1]=msg.getFrom()[0].toString();//发件人
mail[2]=msg.getRecipients(Message.RecipientType.TO)[0].toString();//收件人
cc=msg.getRecipients(Message.RecipientType.CC);
mail[3]=null;
if(cc!=null)
{
for(int i=0;i<cc.length;i++)
if(mail[3]==null)
mail[3]=cc[i].toString();
else
mail[3]=mail[3]+";"+cc[i].toString();
}
if(convert)//转化为适合浏览器显示的格式
{
mail[4]=this.ConvertText(this.SubjectDisplayFormat(msg.getSubject()));//主题
mail[5]=this.ConvertText(this.getContent(msg));//正文
}
else
{
mail[4]=this.SubjectDisplayFormat(msg.getSubject());//主题
mail[5]=this.getContent(msg);//正文
}
mail[6]=dateformat.format(msg.getSentDate()!=null?msg.getSentDate():msg.getReceivedDate());//时间
mail[7]=this.sizeFormat(msg.getSize());//大小
mail[8]="0";//附件
priority=msg.getHeader("X-priority");
mail[9]=priority==null?null:priority[0];//优先级
}
else
{
mail=new String[10+attachmentNum];
if(!msg.isSet(Flags.Flag.SEEN))
{
mail[0]="1";//新邮件
msg.setFlag(Flags.Flag.SEEN,true);
}
mail[1]=msg.getFrom()[0].toString();//发件人
mail[2]=msg.getRecipients(Message.RecipientType.TO)[0].toString();//收件人
cc=msg.getRecipients(Message.RecipientType.CC);
mail[3]=null;
if(cc!=null)
{
for(int i=0;i<cc.length;i++)
if(mail[3]==null)
mail[3]=cc[i].toString();
else
mail[3]=mail[3]+";"+cc[i].toString();
}
if(convert)//转化为适合浏览器显示的格式
{
mail[4]=this.ConvertText(this.SubjectDisplayFormat(msg.getSubject()));//主题
mail[5]=this.ConvertText(this.getContent(msg));//正文
}
else
{
mail[4]=this.SubjectDisplayFormat(msg.getSubject());//主题
mail[5]=this.getContent(msg);//正文
}
mail[6]=dateformat.format(msg.getSentDate()!=null?msg.getSentDate():msg.getReceivedDate());//时间
mail[7]=this.sizeFormat(msg.getSize());//大小
mail[8]="1";//附件
priority=msg.getHeader("X-priority");
mail[9]=priority==null?null:priority[0];//优先级
for(int f=0;f<attachmentNum;f++)
mail[10+f]=attachmentFiles[f];
}
}
folder.close(true);
}
}catch(Exception e){System.err.println("RecieveMails.RecieveMail(): "+e.toString());}
}
return mail;
}
private String getContent(Part p){
String content=null;
try{ Object o = p.getContent();
if (o instanceof String)
{
content=(String)o;
}
else if (o instanceof Multipart)
{
Multipart mp = (Multipart)o;
content=getContent(mp.getBodyPart(0)); }
else if (o instanceof Message)
{
content=getContent((Part)o);
}
else if (o instanceof InputStream)
{
InputStream is = (InputStream)o;
int c;
while ((c = is.read()) != -1)
System.out.write(c);
}
}catch(Exception e){System.err.println("RecieveMails.getContent(): "+e.toString());}
return content;
} public void getAttachmentFile(String messageID,int partNum,HttpServletResponse res) throws IOException { Part part = null;
int msgNum=this.getMsgNumber(messageID);
if(msgNum>0&&partNum>0)
{
try {
boolean connect=true;
connect=this.Connect();
if(connect)
{
Folder folder = store.getDefaultFolder();
folder = folder.getFolder(url.getFile());
folder.open(Folder.READ_WRITE);
Message msg = folder.getMessage(msgNum);
Multipart mp = (Multipart)msg.getContent();
part = mp.getBodyPart(partNum);
ServletOutputStream out=res.getOutputStream();
String sct = part.getContentType();
ContentType ct = new ContentType(sct);
res.setContentType(ct.getBaseType());
String filename=MimeUtility.decodeText(ct.getParameter("name"));
filename=new String(filename.getBytes("gb2312"),"iso-8859-1");
res.setHeader("Content-Disposition","attachment;filename=\""+filename+"\"");
InputStream is = part.getInputStream();
int i;
while ((i = is.read()) != -1)
out.write(i);
out.flush();
out.close();
folder.close(true);
}
} catch(MessagingException e){System.out.println(e.toString());}
}
}
非Unicode邮件,目前大多采用base64方式编码例如: 我用OUTLOOK发一封邮件,编码方式为BASE64
附件名字为:name="=?gb2312?B?xL/Q6NKqzeq1xMrCx+kuZG9j?=" 通过BASE64解码后为:目需要完的事情.doc
附件的格式是:
begin XXX 文件名
(附件内容)
end其它的没人试过!
请大家多多讨论!
你的那段代码没有进行任何解码处理,怎么可以正常处理附件名字呢?
你所说的发附件名字时自动编码的是和Mail Server相关的吗?
对于邮件程序来说,应该做到“发信是严谨,收信是宽容”
所以我认为发信是应当把不是mail safe的字符进行编码