【问题标题】:could not access all 'gmail' messages using pop3 in java无法在 java 中使用 pop3 访问所有“gmail”消息
【发布时间】:2014-04-10 09:34:36
【问题描述】:

Java 中的我的邮件接收程序 我在我的 java 程序中使用 ma​​il.1.4.jaractivation jar

我遵循了 5 个步骤来使用 JavaMail API 接收电子邮件。 他们是:
获取会话对象
创建 POP3 存储对象并与弹出服务器连接
创建文件夹对象并打开它
从数组中的文件夹中检索消息并打印它
关闭存储和文件夹对象

这是我的代码:

public class receive_Email {

    public static void main(String[] args) {
        String host="pop.gmail.com";
        String mailStorType="pop3";
        String Username="***********@gmail.com";
        String Password="*******";

        receiveMail(host, mailStorType, Username, Password);
    }

    // method for Receive email.....!
    public static void receiveMail(String pop3Host,String sotreType,String user,String password){

        ///   1) get session object

        Properties props=new Properties();
            props.put("mail.pop3.host", pop3Host );
        Session sessEmail=Session.getDefaultInstance(props);

        // 2) create pop3 store object and connect with pop server
        try {
            POP3Store emailStore=(POP3Store)sessEmail.getStore(sotreType);
            emailStore.connect(user,password);

        // 3) create Folder object and open it
            Folder emailFolder=emailStore.getFolder("INBOX");
            emailFolder.open(Folder.READ_ONLY);

        //  4) Retrieve the messages in the folder and display it   
            Message[] messages=emailFolder.getMessages();
            int i=0;
            for(Message m : messages){
                System.out.println("------------------------------------------------");
                System.out.println("Email Number : "+m.getMessageNumber());
                System.out.println("Subject : "+m.getSubject());
                System.out.println("From : "+m.getFrom());
                try {
                    System.out.println("Subject : "+m.getContent().toString());
                } catch (IOException e) {
                    System.out.println("No messages are available.............!");
                        e.printStackTrace();
                }

            } // end for loop 

            // 5) Close the Folder and email store
            emailFolder.close(false);
            emailStore.close();

        } catch (NoSuchProviderException e) {
            e.printStackTrace();
        } catch (MessagingException e) {
            e.printStackTrace();
        }

    }
}

我得到的例外是:

javax.mail.MessagingException: Connect failed;
  nested exception is:
    java.net.ConnectException: Connection timed out: connect
    at com.sun.mail.pop3.POP3Store.protocolConnect(POP3Store.java:148)
    at javax.mail.Service.connect(Service.java:275)
    at javax.mail.Service.connect(Service.java:156)
    at javax.mail.Service.connect(Service.java:176)
    at com.mwh.DBConnect.receive_Email.receiveMail(receive_Email.java:37)
    at com.mwh.DBConnect.receive_Email.main(receive_Email.java:22)
    Caused by: java.net.ConnectException: Connection timed out: connect
.....
..

任何摆脱此异常的建议...在此先感谢....

【问题讨论】:

标签: java email


【解决方案1】:

我很确定 GMail 只接受 SSL 连接。试试下面的代码:

import com.sun.mail.pop3.POP3Store;

import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.Session;
import java.io.IOException;
import java.util.Properties;

public class receive_Email {

  public static void main(String[] args) {
    String host="pop.gmail.com";
    int port=995;
    String mailStorType="pop3";
    String Username="***********@gmail.com";
    String Password="*******";

    receiveMail(host, port, mailStorType, Username, Password);
  }

  // method for Receive email.....!
  public static void receiveMail(String pop3Host, int port, String sotreType,String user,String password){

    ///   1) get session object

    Properties props = new Properties();
    props.put("mail.pop3.ssl.enable", "true"); // Use SSL
    Session sessEmail = Session.getInstance(props);

    // 2) create pop3 store object and connect with pop server
    try {
      POP3Store emailStore = (POP3Store) sessEmail.getStore(sotreType);
      emailStore.connect(pop3Host, port, user, password);

      // 3) create Folder object and open it
      Folder emailFolder=emailStore.getFolder("INBOX");
      emailFolder.open(Folder.READ_ONLY);

      //  4) Retrieve the messages in the folder and display it   
      Message[] messages=emailFolder.getMessages();

      for(Message m : messages){
        System.out.println("------------------------------------------------");
        System.out.println("Email Number : "+m.getMessageNumber());
        System.out.println("Subject : "+m.getSubject());
        System.out.println("From : "+m.getFrom());
        try {
          System.out.println("Subject : "+m.getContent().toString());
        } catch (IOException e) {
          System.out.println("No messages are available.............!");
          e.printStackTrace();
        }

      } // end for loop 

      // 5) Close the Folder and email store
      emailFolder.close(false);
      emailStore.close();

    } catch (NoSuchProviderException e) {
      e.printStackTrace();
    } catch (MessagingException e) {
      e.printStackTrace();
    }

  }
}

【讨论】:

  • 对不起,我得到了这个异常:java.net.ConnectException: Connection timed out: connect,这行是可疑的:emailStore.connect(pop3Host, user,密码); 谢谢...
  • 尝试设置端口,将emailStore.connect(pop3Host, user, password);改为emailStore.connect(pop3Host, 995, user, password);,问题依旧是无法建立与服务器的连接。
  • 我编辑了我的代码并对其进行了测试。这对我来说可以。当您仍然遇到连接错误时,您的网络可能存在问题。可能是阻止 POP3 的防火墙或代理。
  • 我遇到了这个异常:javax.mail.AuthenticationFailedException: EOF on socket at com.sun.mail.pop3.POP3Store.protocolConnect(POP3Store.java:146) at javax .mail.Service.connect(Service.java:275) atcom.mwh.DBConnect.receive_Email.receiveMail(receive_Email.java:40) at com.mwh.DBConnect.receive_Email.main(receive_Email.java:22)
  • 代码对我有用,所以我真的不知道问题出在哪里。也许尽量不要使用 POP3Store 实现,而是使用 javax.mail.Store。所以把POP3Store emailStore = (POP3Store) sessEmail.getStore(sotreType);改成Store emailStore = sessEmail.getStore(sotreType);
【解决方案2】:

我得到了我需要的答案,感谢用户 user1232141 的重播。 我从这个参考 stactoverflow 得到了解决方案:reding all new mails
这是对我有用的代码:

public static void receiveEmail(String pop3Host, String storeType,final String user, final String password) {  
              try {  
               //1) get the session object  
               Properties props = new Properties();  
               props.put("mail.pop3.host", "pop.gmail.com");
               
               props.put("mail.pop3.ssl.enable", "true"); // Use SSL
               
               props.put("mail.pop3.user", user);

               props.put("mail.pop3.socketFactory", 995);

               props.put("mail.pop3.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

               props.put("mail.pop3.port", 995);
               
               Session session = Session.getDefaultInstance(props, new Authenticator() {
                   @Override
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(user, password);

                    }
                });  
                 
               //2) create the POP3 store object and connect with the pop server  
               Store emailStore = (Store) session.getStore(storeType);  
               emailStore.connect("pop.gmail.com",995,user, password);  
              
               //3) create the folder object and open it  
               Folder emailFolder = emailStore.getFolder("INBOX");  
               emailFolder.open(Folder.READ_ONLY);  
              
               //4) retrieve the messages from the folder in an array and print it  
               Message[] messages = emailFolder.getMessages();  
               for (int i = 0; i < messages.length; i++) {  
                Message message = messages[i];  
                System.out.println("---------------------------------");  
                System.out.println("Email Number " + (i + 1));  
                System.out.println("Subject: " + message.getSubject());  
                System.out.println("From: " + message.getFrom()[0]);  
                System.out.println("Text: " + message.getContent().toString());  
               }  
              
               //5) close the store and folder objects  
               emailFolder.close(false);  
               emailStore.close();  
              
              } catch (MessagingException e) {e.printStackTrace();}  
              catch (IOException e) {e.printStackTrace();}  
             }  
    

如您所见,我编辑了提供的方法 receiveEmail(..){....} 并得到了答案,
感谢 srackoverflow 用户 @wael 您的问题帮助我找到了所需的解决方案...谢谢大家...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 2017-04-04
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    相关资源
    最近更新 更多