我写了一个接收邮件的方法,主要是接收附件,但怎么调也调不通,请给位看看!谢谢了!完整代码如下:public boolean RecevMail(String from,String to ,String adderss,String user,String password,String pop3serv){
        boolean isrecev=true;
        try{
            Properties props = System.getProperties();
            Authenticator auth;
            props.setProperty("mail.pop.host", pop3serv);
            props.setProperty("mail.pop.auth", "true");            Session GetMailSession = Session.getDefaultInstance(props, null);            GetMailSession.setDebug(false);            Store store = GetMailSession.getStore("pop3");
            store.connect(pop3serv,user,password);
            Folder folder=store.getFolder("INBOX");
            folder.open(Folder.READ_WRITE);
            Message[] message=folder.getMessages();
            for(int i=0;i<message.length;i++){
                String fromPerson=((InternetAddress)message[i].getFrom()[0]).getPersonal();
                String fromAddress=((InternetAddress)message[i].getFrom()[0]).getAddress();
                String outSubject=message[i].getSubject();                Part MessagePart=message[i];
                Object outContent=MessagePart.getContent();                if(outContent instanceof Multipart){
                    MessagePart=((Multipart)outContent).getBodyPart(0);                    Multipart mp=(Multipart)message[i].getContent();
                   
                   for(int j=0;j<mp.getCount();j++){
                        Part part=mp.getBodyPart(j);
                        String disposition=part.getDisposition();
                        if((disposition!=null)&&((disposition.equals(part.ATTACHMENT))||(disposition.equals(part.INLINE)))){
                         
         FileOutputStream fostm=new FileOutputStream("d:\\testmail\\"+part.getFileName());
                            int chunk=part.getSize();
                            //inpstm.
                            byte[] buf=new byte[chunk];
                            InputStream inpstream=part.getInputStream();
                            inpstream.read(buf);
                            fostm.write(buf,0,chunk);
                            fostm.flush();
                            fostm.close();
                            inpstream.close();                        }
                    }
                }
               // message[i].setFlag(Flag.DELETED,true);
            }
            folder.close(true);
            store.close();
        }catch(Exception ex){
            ex.printStackTrace();
            System.out.println(ex.getMessage());
            isrecev=false;
        }        return isrecev;
    }
报错:java.lang.NullPointerException: charsetName谢谢各位来看的同志!

解决方案 »

  1.   

    以前写过,但是时间太长了,早就忘光了。
    但是我觉得你可以对异常捕获一下,然后打印一下堆栈信息,这样至少能看出在程序的什么地方发生了错误。然后再分析为什么发生这样的错误,是不是传入的参数正确等等。你这里是发生了空指针,那就可以找找什么地方用到charsetName了,是不是没对它进行初始化等等。要学着自己调试程序。
      

  2.   

    要不时的 System.out.println 打印程序状态
      

  3.   


    给你个代码
    void  jButton6_actionPerformed(ActionEvent  e)  {  
           try  
             {//该程序为接受带有附件的邮件的代码  
                 Properties  props  =  System.getProperties();    
                 Authenticator  auth  =  new  Email_Autherticator();      
                 props.put("mail.smtp.host",host);  
                 props.put("mail.smtp.auth","true");  
                 Session  session  =  Session.getDefaultInstance(props,auth);  //建立session  
                 Store  store  =  session.getStore("pop3");  
                 store.connect(host,username,password);  
     
           //After  connecting  to  the  Store,you  can  get  a  Folder,which  must  be  opened  before  you  can  read  messages  from  it:  
                 Folder  folder  =  store.getFolder("INBOX");  
                 folder.open(Folder.READ_WRITE);  
                 Message  message[]  =  folder.getMessages();  
     
                 for  (int  i=0,n=message.length;i<n;i++)//可能有多个邮件,所以用循环  
                     {  
                           //获得邮件的部分信息,如头部信息,送信人的署名,送信人的邮件地址  
                           String  out_from_person  =  ((InternetAddress)message[i].getFrom()[0]).getPersonal();  
                           String  out_from_address  =  ((InternetAddress)message[i].getFrom()[0]).getAddress();  
                           System.out.println("From:"+out_from_person+"\t");  
                           System.out.println("Address:"+out_from_address+"\t");  
                           String  out_subject  =  message[i].getSubject();  
                           System.out.println("Subject:"+out_subject+"\t");  
     
                           //以下代码用来获取邮件的主体信息  
                           Part  messagePart  =  message[i];  
                           Object  out_content  =  messagePart.getContent();  
                           if  (out_content  instanceof  Multipart)  
                               {  
                                     messagePart  =  ((Multipart)out_content).getBodyPart(0);  
                                     System.out.println("[  Multipart  Message  ]");  
                               }  
                           String  out_content_type  =  messagePart.getContentType();  
                           System.out.println("CONTENT:"+out_content_type);  
     
                           if  (out_content_type.startsWith("text/plain")    &brvbar;  &brvbar;  out_content_type.startsWith("text/html"))  
                               {  
                                       InputStream  ipstm  =  messagePart.getInputStream();  
                                       BufferedReader  bufreader  =  new  BufferedReader(new  InputStreamReader(ipstm));  
                                       String  thisLine  =  bufreader.readLine();  
                                       while  (thisLine  !=  null)  
                                           {  
                                                   System.out.println("thisLine:  "+thisLine);  
                                                   thisLine  =  bufreader.readLine();  
                                           }  
                               }  
                           //获取附件  
                           Multipart  mp  =  (Multipart)message[i].getContent();  
                           for  (int  j=0,m=mp.getCount();j<m;j++)  
                               {  
                                     System.out.println("***"+m+"***");  
                                     Part  part  =  mp.getBodyPart(j);  
                                     String  disposition  =  part.getDisposition();  
                                     if  ((disposition  !=  null)  &&  ((disposition.equals(part.ATTACHMENT))    &brvbar;  &brvbar;  (disposition.equals(part.INLINE))))  
                                         {  
     
                                         //以下代码将获得的附件保存到当前目录下,以part.getFileName()为文件名,也既是附件的名称。  
                                                 File  filename  =  new  File(part.getFileName());  
                                                 for  (int  k=0;filename.exists();k++)  
                                                     {  
                                                               filename  =  new  File(part.getFileName()+k);  
                                                     }  
                                                 FileOutputStream  myFileoutputstream  =  new  FileOutputStream(filename);  
                                                 int  chunk  =  part.getSize();//获得附件的大小,不一定很准确。  
     
                                                 byte  []  buffer  =  new  byte[chunk];  
                                                 InputStream  instream  =  part.getInputStream();  
                                                 instream.read(buffer,0,chunk);  
                                                 myFileoutputstream.write(buffer,0,chunk);  
                                                 instream.close();  
                                                 myFileoutputstream.close();  
                                         }  
                               }  
                           System.out.println("------------------------------------------------------------");  
                           message[i].setFlag(Flags.Flag.DELETED,true);  
                     }  
                 folder.close(true);  
                 store.close();//关闭  
             }  
           catch(Exception  ej2)  
             {  
                   System.out.println(ej2);  
             }  
       }  
      

  4.   

    估计是  String fromPerson=((InternetAddress)message[i].getFrom()[0]).getPersonal();
    取名字时,字符集有问题.
      

  5.   

    首先谢谢各位的关注!这里我澄清一下各位提到的疑惑:charsetName,这个参数我根本就没定义过,是系统报出来的,这也是我捕获到的唯一异常!这个函数已经够完整了,如果没什么问题的话,肯定可以执行通的还有我用sohu的pop3.sohu.com,可以通过认证,但用网易的pop3.126.com和pop3.163.com都不能通过验证,我填写的地址,用户名,密码都无误,都是我自己的邮箱!这是什么原因啊?是不是网易的pop邮箱地址不是这样写的?请给为多多指教!谢谢!
      

  6.   

    我也在搞接收邮件的程序,刚好也在调附件这部分,出错,cannot resolve symbol:getFileName,我想问一下是不是应该import一个类啊,那getFileName是属于什么类呢
      

  7.   

    上面的朋友,你这么说我们也不清楚,到底是什么对象的getfilename,你把代码贴出来看一下!
      

  8.   

    我都是用163的,可以接收,是pop3.163.com没有错
      

  9.   

    请问jsjwql,你那段代码需要用到哪些类啊
      

  10.   

    import javax.mail.*;
    import javax.mail.internet.*;
    import java.util.*;
    import java.io.*;
    import javax.mail.internet.MimeMessage;/**
    * 带口令验证的邮件接收类.
    */
    public class Receive1{/**
    * Main 方法
    */
        public static void main(String args[]){
            try{
              String popServer="pop3.163.com";
              String popUser= null;
              String popPassword= null;
              receive(popServer, popUser, popPassword);
            }
            catch (Exception ex){
              System.out.println("Usage: java com.lotontech.mail.Authenticator.Receive" +" popServer popUser popPassword");
            }
            System.exit(0);
        }
        public static void receive(String popServer, String popUser , String popPassword){
            Store store=null;
            Folder folder=null;
            try{
              Properties props = System.getProperties();
              Session session = Session.getDefaultInstance(props, new MailAuthenticator());
              store = session.getStore("pop3");
              store.connect(popServer, null, null);
              folder = store.getDefaultFolder();
              if (folder == null) throw new Exception("No default folder");
              folder = folder.getFolder("INBOX");
              if (folder == null) throw new Exception("No POP3 INBOX");
              folder.open(Folder.READ_ONLY);
              Message[] msgs = folder.getMessages();
              for (int msgNum = 0; msgNum < msgs.length; msgNum++)
              {
                 printMessage(msgs[msgNum]);
              }
            }
            catch (Exception ex){
              ex.printStackTrace();
            }
            finally{
              try{
                if (folder!=null) folder.close(false);
                if (store!=null) store.close();
              }
              catch (Exception ex2) {ex2.printStackTrace();}
            }
        }
    /**
    * "printMessage()" 打印方法.
    */
        public static void printMessage(Message message){
            try{
              String from=((InternetAddress)message.getFrom()[0]).getPersonal();
              if (from==null) from=((InternetAddress)message.getFrom()[0]).getAddress();
              System.out.println("FROM: "+from);
              String subject=message.getSubject();
              System.out.println("SUBJECT: "+subject);
              Part messagePart=message;
              Object content=messagePart.getContent();
              if (content instanceof Multipart)
              {
                messagePart=((Multipart)content).getBodyPart(0);
                System.out.println("这封邮件有附件 ]");
             //获取附件
            Multipart  mp  =  (Multipart)message.getContent();  
           for  (int  j=0,m=mp.getCount();j<m;j++)  
                   {  
                       System.out.println("***"+m+"***");  
                       Part  part  =  mp.getBodyPart(j);  
                       String  disposition  =  part.getDisposition();  
                       if  ((disposition  !=  null)  &&  ((disposition.equals(part.ATTACHMENT))    || (disposition.equals(part.INLINE))))        for  (int  k=0;filename.exists();k++)  
                   {  
                     filename  =  new  File(part.getFileName()+k);  
                   }  
             
                }         }
              String contentType=messagePart.getContentType();
              System.out.println("CONTENT:"+contentType);
              if (contentType.startsWith("text/plain") || contentType.startsWith("text/html"))
              {
                InputStream is = messagePart.getInputStream();
                BufferedReader reader=new BufferedReader(new InputStreamReader(is));
                String thisLine=reader.readLine();
                while (thisLine!=null)
                {
                  System.out.println(thisLine);
                  thisLine=reader.readLine();
                }
              }
             
              System.out.println("--------------END------------------");
            }
            catch (Exception ex)
            {
              ex.printStackTrace();
            }
        }
    }
      

  11.   

    smile063,那个getfilename方法可以调用,没有错,只是你的filename 变量没有定义!系统当然不能识别了!看你代码中的情形,filename应该为一个File
      

  12.   

    因为我连续回复超过三次,不能回复了,我12点多给你发了留言了,我想告诉你我编译通过了,可以接收邮件了,但是附件的名称和boundary都是乱码!
      

  13.   

    因为我是刚接触java,很多东西都不太懂,我想问问,
     FileOutputStream  myFileoutputstream  =  new  FileOutputStream(filename);  
    int  chunk  =  part.getSize();//获得附件的大小,不一定很准确。  
     
    byte  []  buffer  =  new  byte[chunk];  
    InputStream  instream  =  part.getInputStream();  
     instream.read(buffer,0,chunk);  
     myFileoutputstream.write(buffer,0,chunk); 
      instream.close();  
    myFileoutputstream.close();  
    这段代码是什么意思啊,为什么我添加后,每接收一封邮件凡是判断为有附件的就出现这样的错误提示:java.lang.NullPointerException....
      

  14.   

    中文邮件乱码问题,用那个MimeUtility.decodetext();搞不定,希望大家指点!
      

  15.   

    经过研究现在中文乱码问题问题终于搞定了,没有及时给大家结贴,很抱歉!那个附件的乱码问题,各个邮件服务器都不一样,它有的是采用gb1232,或gbk,有的是采用的别的编码方式,只要发邮件时将附件标题进行相应的编码转换,接受附件时进行相应的翻转换就可以搞定了!谢谢各位的参与!