mbp.setFileName(new String(fds.getName().getBytes("gb2312"),"iso8859-1"));

解决方案 »

  1.   

    mbp.setFileName(new String(fds.getName().getBytes("ISO8859_1"),"gb2312")));
      

  2.   

    编码
    MimeUtility.encodeText(fds.getName())
    通用的mail client应该可以处理的
      

  3.   

    中文名是用BASE64方式编码,你可以用BASE64Decoder类解码,解码之前把两头的标志位去掉!
      

  4.   

    我给你一个方法:
    用他就能得到这个中文附件名字了,:
    /*
            @从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时候做的。很好用的
      

  5.   

    上面他们给的方法相比你已经试过了,都不能完全解决,不心你可以用sina和163的信箱试试,他们是处理不了的。我给你的方法是完全可以的,他们给你的也仅仅能处理附件是attacth的形式的,假如附件为inline形式,就处理不了,sina的附件形式为inline的,你可以试试。
    我给你的方法能处理上面的所有形式。
      

  6.   

    String filename=MimeUtility.decodeText(ct.getParameter("name"));
    filename=new String(filename.getBytes("gb2312"),"iso-8859-1");
    试试这个代码!
      

  7.   

    public String[] RecieveMail(String messageID,boolean convert){
    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());}
    }
        }
      

  8.   

    如果你收到的邮件是以unicode方式发送的,那么它采用的附件名字是没有经过编码的,附件的正文是通过UUEncode方式编码!
    非Unicode邮件,目前大多采用base64方式编码例如: 我用OUTLOOK发一封邮件,编码方式为BASE64
           
           附件名字为:name="=?gb2312?B?xL/Q6NKqzeq1xMrCx+kuZG9j?="       通过BASE64解码后为:目需要完的事情.doc 
      

  9.   

    我不知道邮件的格式有几种,目前我试过的:中文操作系统下的编码方式有:UUEncode和BASE64两种;在英文WINDOWS下发送的邮件是以UUEncode方式编码的!
          附件的格式是:
                        begin XXX 文件名
                        (附件内容)
                        end其它的没人试过!
    请大家多多讨论!
      

  10.   

    wjmmml(笑着悲伤) 兄
    你的那段代码没有进行任何解码处理,怎么可以正常处理附件名字呢?
    你所说的发附件名字时自动编码的是和Mail Server相关的吗?
    对于邮件程序来说,应该做到“发信是严谨,收信是宽容”
    所以我认为发信是应当把不是mail safe的字符进行编码