Подключиться к локальному почтовому ящику POP3 Java

Я пытаюсь подключиться к локально размещенному почтовому ящику POP3 и отображать электронные письма в почтовом ящике, но все равно получаю сообщение об ошибке:

Исключение в потоке "main" javax.mail.MessagingException: Ошибка подключения; вложенное исключение:
java.net.ConnectException: в соединении отказано
на com.sun.mail.pop3.POP3Store.protocolConnect (POP3Store.java:209)
на javax.mail.Service.connect (Service .java: 295)
на javax.mail.Service.connect (Service.java:176)
на com.kami.utils.MailClient.checkInbox (MailClient.java:33)
на com.kami .Main.main (Main.java:38)

Мой класс выглядит так:

public class MailClient {
    private String host;
    private String username;
    private String password;
    private String provider;
    protected Session session;

    public MailClient() {
        Properties props = new Properties();

        this.host = "localhost";
        this.username = "unix-user";
        this.password = "unix-password";
        this.provider = "pop3";

        this.session = Session.getDefaultInstance(props, null);
    }

    public void checkInbox() throws MessagingException, IOException {
        Store store = session.getStore(provider);
        store.connect(host, username, password); //This is line 33
        Folder inbox = store.getFolder("inbox");
        inbox.open(Folder.READ_ONLY);
        Message[] messages = inbox.getMessages();

        for(Message message : messages){
            System.out.println(message.getReceivedDate());
            System.out.println(message.getSubject());
        }

        inbox.close(true);
        store.close();
    }
}

Это локальный почтовый сервер, использующий Dovecot IMAP / POP3 Server версии 2.2.9 и Postfix Mail Server Postfix версии 2.11.0.


person Shepard    schedule 29.02.2016    source источник
comment
AFAIK реализация java pop3 предназначена для подключенных почтовых ящиков. Вы пытаетесь подключить уже загруженный почтовый ящик pop3?   -  person Xvolks    schedule 29.02.2016
comment
Подключаюсь к тому, который размещен локально, например, я могу отправлять с него электронную почту следующим образом: props.put("mail.smtp.host", "localhost");   -  person Shepard    schedule 29.02.2016
comment
Локальное размещение меня сбивает с толку. У вас есть почтовый сервер, работающий на вашем Linux-компьютере (запущена служба pop3 / pop3s)?   -  person Xvolks    schedule 29.02.2016
comment
Правильно, Dovecot IMAP / POP3 Server версии 2.2.9 и Postfix Mail Server Postfix версии 2.11.0   -  person Shepard    schedule 29.02.2016
comment
В этом случае ответ Ханса Пу имеет смысл. Поэтому проверьте свой код, если IP-адрес и порт верны.   -  person Xvolks    schedule 29.02.2016


Ответы (2)


Первый порт telnet 110 на вашем компьютере, чтобы проверить, работает ли там служба. На моем ноутбуке у меня не работает сервер pop3, и вот результат:

hans@andes:~$ telnet localhost 110
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused

Если соединение установлено успешно, следуйте протоколу аутентификации pop3 с вашими собственными данными:

hans@andes:~$ telnet mail.foo.com 110
Trying X.X.X.X...
Connected to mail.foo.com.
Escape character is '^]'.
+OK mail.foo.com POP3 server ready
user fooUser
+OK hello fooUser, please enter your password
pass fooPassword
+OK server ready

В вашем случае telnet localhost; также обратите внимание, что вы должны вводить только команды: telnet, user и pass. Остальное - это ответ сервера.

Если все это работает, проблема в вашей конфигурации java, проверьте документацию и примеры из библиотеки.

person Hans Poo    schedule 29.02.2016
comment
Просто вопрос об этом, он мне отвечает, но мгновенно закрывает соединение: telnet localhost 110 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Connection closed by foreign host. Это нормально? Я даже не могу проверить пользователей. - person Shepard; 29.02.2016
comment
Что ж, если вы потратите слишком много времени, сервер выдаст тайм-аут и закроет соединение, вы должны немедленно начать вводить, если он продолжает закрывать соединение, посмотрите файл журнала сервера. На моей Linux-машине это работает нормально, терминалы Windows не очень дружелюбны. - person Hans Poo; 29.02.2016
comment
Спасибо за совет по проверке журнала, очевидно, я получаю Error: service(pop3-login): command startup failed, throttling for 2 secs - person Shepard; 29.02.2016
comment
Все сводилось к тому, что мои сертификаты по какой-то причине не совпадали, мне пришлось их регенерировать. Исправлено мгновенное отключение моего POP3-соединения. Спасибо за помощь =] - person Shepard; 29.02.2016

Приведенный ниже метод будет извлекать сообщения из почтового ящика pop (с учетом _Host = localhost, _User = unix-user, _Password = unix-password, _Protocol = "pop3"). Однако вы должны быть уверены в нескольких вещах: 1) «localhost» запускает сервер «pop3», а не сервер «pop3s» (безопасный протокол); 2) сервер "pop3" на "localhost" прослушивает порт по умолчанию 3) "unix-user" имеет почтовый ящик pop3

Судя по вашим наблюдениям, похоже, вы ожидаете, что сможете отправлять почту из учетной записи pop3. Это не то, как это работает, поскольку pop3 - это только способ получать сообщения, а не отправлять их. Для отправки почты вам необходимо установить отдельное соединение с SMTP-сервером.

  public Message[] getMessages(int maxCount)
      throws MessagingException
  {
    // Get a Session object
    Properties props = new Properties();
    Session session = Session.getInstance(props);

    // Get a Store object
    Store store = session.getStore(_protocol);

    // Connect
    store.connect(_host,_user,_password);

    // Open a Folder
    Folder folder = store.getFolder(_mailbox);
    if (folder == null || !folder.exists())
        throw new ApplicationException("Invalid mailbox");

    //Gets up to maxCount messages from the pop box
    folder.open(Folder.READ_WRITE);
    Message[] messages = Monitor.EMPTY_MESSAGE_ARRAY;
    int toMessageIndex=folder.getMessageCount();
    if (toMessageIndex > 0) {
      if (toMessageIndex > maxCount)
        toMessageIndex = maxCount;
      messages = folder.getMessages(1,toMessageIndex);
    }

    // Go through all the new messages and make sure they are loaded. Use the outputStream
    //to force all information to be downloaded.
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    for (int i = 0; i < messages.length && shouldRun(); i++) {
      try {
        //Force the download of all message information
        bos.reset();
        messages[i].writeTo(bos);
        getLog().enter(
          this,
          "[readAndClearInBox] Read message to " + messages[i].getAllRecipients()[0].toString());

      } catch (Exception mex) {
        getLog().error(this, mex, "[readAndClearInBox] Message exception");
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw, true);
        try {
          Monitor.dumpEnvelope(getLog(), pw, messages[i]);
        } catch (Exception ex) {
          getLog().error(this, mex, "[readAndClearInBox] Could only display faulty message.");
        } finally {
          pw.flush();
          getLog().enter(this, "[readAndClearInBox]" + sw.toString());
        }
      } finally {
        //Mark the message for deletion
        messages[i].setFlag(Flags.Flag.DELETED, true);
      }
    }

    //Close folder and expunge all deleted messages, unless the read was aborted
    if (shouldRun()) {
      getLog().enter(this,"Found " + messages.length + " messages; closing inbox.");
      folder.close(true);
      store.close();
      return messages;
    } else {
      getLog().enter(this,"Found " + messages.length + " messages; closing inbox without expunging.");
      folder.close(false);
      store.close();
      _bShouldRun = true;
      return Monitor.EMPTY_MESSAGE_ARRAY;
    }
  }
person pilot7    schedule 29.02.2016