Я получаю это случайное исключение при циклическом просмотре сообщений моего почтового сервера (это hMailServer в локальной сети):
javax.mail.MessagingException: Failed to load IMAP envelope
at com.sun.mail.imap.IMAPMessage.loadEnvelope(IMAPMessage.java:1532)
at com.sun.mail.imap.IMAPMessage.getSubject(IMAPMessage.java:441)
это происходит, когда я зацикливаю массив Message[]
с сервера
Объем (этой части) программы Java довольно прост:
Я уже пробовал это известное исправление: https://javaee.github.io/javamail/FAQ#imapserverbug (оба описанных метода)
moveFromFolderTo()
— это место, где я применяю исправление:
public static Message moveFromFolderTo(Message mail, String sourceFolder, String DestinationFolder) {
try {
//this is the javaMailFAQ fix
MimeMessage tmp = new MimeMessage((MimeMessage) mail);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
tmp.writeTo(bos);
bos.close();
SharedByteArrayInputStream bis = new SharedByteArrayInputStream(bos.toByteArray());
MimeMessage cmsg = new MimeMessage(session, bis);
//this is the javaMailFAQ fix
List<Message> tempList = new ArrayList<>();
tempList.add(cmsg);
Message[] tempMessageArray = tempList.toArray(new Message[tempList.size()]);
Folder srcFolder = store.getFolder(sourceFolder);
srcFolder.open(Folder.READ_WRITE);
Folder destFolder = store.getFolder(DestinationFolder);
destFolder.appendMessages(tempMessageArray);
mail.setFlag(Flags.Flag.DELETED, true);
srcFolder.close(true);
return cmsg;
полученный Message
является простейшим циклом for:
Message messages[] = inboxFolder.getMessages();
но не работает, случайное сообщение вылетает; журнал mailServer в какой-то момент не помогает:
//for-loop start, Messages[] alredy fetched
A8 FETCH 2 (ENVELOPE INTERNALDATE RFC822.SIZE)
A8 OK FETCH completed
javax.mail.MessagingException: Failed to load IMAP envelope
at com.sun.mail.imap.IMAPMessage.loadEnvelope(IMAPMessage.java:1532)
любая помощь?
Сделал еще один тест без исправления JavaMail-FAQ, похоже, что почтовый сервер и клиенты «не синхронизированы»:
Mails in folder: 6 //mails from getMessages.length
cycle-step : 1
mailSubject: test4
cycle-step : 2
mailSubject: test
moveToWorking ex:java.lang.IndexOutOfBoundsException: 2 > 1
moveToWorking ex:java.lang.NullPointerException
cycle-step : 3
mailSubject: test4
moveToWorking ex:java.lang.IndexOutOfBoundsException: 3 > 2
moveToWorking ex:java.lang.NullPointerException
cycle-step :4
//after some mail the usual Exception
javax.mail.MessagingException: Failed to load IMAP envelope
at com.sun.mail.imap.IMAPMessage.loadEnvelope(IMAPMessage.java:1532)
at com.sun.mail.imap.IMAPMessage.getSubject(IMAPMessage.java:441)
at com.horsa.antidatacap.main.Main.main(Main.java:31)
но учтите, что из Thunderbird я вижу только 4 письма в своем почтовом ящике
полный журнал отладки (session.setDebug(true);
) для этого случая:
DEBUG: setDebug: JavaMail version 1.6.2
DEBUG: getProvider() returning javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle]
DEBUG IMAPS: mail.imap.fetchsize: 16384
DEBUG IMAPS: mail.imap.ignorebodystructuresize: false
DEBUG IMAPS: mail.imap.statuscachetimeout: 1000
DEBUG IMAPS: mail.imap.appendbuffersize: -1
DEBUG IMAPS: mail.imap.minidletime: 10
DEBUG IMAPS: enable STARTTLS
DEBUG IMAPS: closeFoldersOnStoreFailure
DEBUG IMAPS: trying to connect to host "192.168.75.131", port 993, isSSL true
* OK IMAPrev1
A0 CAPABILITY
* CAPABILITY IMAP4 IMAP4rev1 CHILDREN IDLE QUOTA SORT ACL NAMESPACE RIGHTS=texk
A0 OK CAPABILITY completed
DEBUG IMAPS: protocolConnect login, host=192.168.75.131, [email protected], password=<non-null>
DEBUG IMAPS: mechanism PLAIN not supported by server
DEBUG IMAPS: mechanism LOGIN not supported by server
DEBUG IMAPS: mechanism NTLM not supported by server
DEBUG IMAPS: mechanism XOAUTH2 disabled by property: mail.imaps.auth.xoauth2.disable
DEBUG IMAPS: LOGIN command trace suppressed
DEBUG IMAPS: LOGIN command result: A1 OK LOGIN completed
A2 CAPABILITY
* CAPABILITY IMAP4 IMAP4rev1 CHILDREN IDLE QUOTA SORT ACL NAMESPACE RIGHTS=texk
A2 OK CAPABILITY completed
DEBUG IMAPS: connection available -- size: 1
A3 SELECT SourceFolder
* 4 EXISTS
* 2 RECENT
* FLAGS (\Deleted \Seen \Draft \Answered \Flagged)
* OK [UIDVALIDITY 1561546646] current uidvalidity
* OK [UIDNEXT 83] next uid
* OK [PERMANENTFLAGS (\Deleted \Seen \Draft \Answered \Flagged)] limited
A3 OK [READ-WRITE] SELECT completed
Mails in folder: 4 //mails from getMessages.length
cycle-step : 1
A4 FETCH 1 (FLAGS)
* 1 FETCH (FLAGS (\Seen))
A4 OK FETCH completed
A5 FETCH 1 (ENVELOPE INTERNALDATE RFC822.SIZE)
* 1 FETCH (RFC822.SIZE 625 INTERNALDATE "28-Jun-2019 12:57:18 +0200" ENVELOPE ("Fri, 28 Jun 2019 12:57:18 +0200" "email1" (("Surname, name" NIL "sender" "host.net")) (("Surname, name" NIL "sender" "host.net")) (("Surname, name" NIL "sender" "host.net")) (("[email protected]" NIL "destiMail" "host.net")) NIL NIL NIL "<[email protected]>"))
A5 OK FETCH completed
A6 FETCH 1 (BODY[]<0.16384>)
* 1 FETCH (BODY[]<0> {625}
Return-Path: [email protected]
Received: from [192.168.75.96] (******.*********.net [192.168.75.96])
by INFINITYHR with ESMTPA
; Fri, 28 Jun 2019 12:56:08 +0200
To: [email protected]
From: "Surname, name" <[email protected]>
Subject: email1
Message-ID: <[email protected]>
Date: Fri, 28 Jun 2019 12:57:18 +0200
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101
Thunderbird/60.7.2
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Transfer-Encoding: 7bit
Content-Language: en-US
)
A6 OK FETCH completed
DEBUG IMAPS: no connections in the pool, creating a new one
* OK IMAPrev1
B0 CAPABILITY
* CAPABILITY IMAP4 IMAP4rev1 CHILDREN IDLE QUOTA SORT ACL NAMESPACE RIGHTS=texk
B0 OK CAPABILITY completed
DEBUG IMAPS: mechanism PLAIN not supported by server
DEBUG IMAPS: mechanism LOGIN not supported by server
DEBUG IMAPS: mechanism NTLM not supported by server
DEBUG IMAPS: mechanism XOAUTH2 disabled by property: mail.imaps.auth.xoauth2.disable
DEBUG IMAPS: LOGIN command trace suppressed
DEBUG IMAPS: LOGIN command result: B1 OK LOGIN completed
B2 CAPABILITY
* CAPABILITY IMAP4 IMAP4rev1 CHILDREN IDLE QUOTA SORT ACL NAMESPACE RIGHTS=texk
B2 OK CAPABILITY completed
B3 SELECT SourceFolder
* 4 EXISTS
* 2 RECENT
* FLAGS (\Deleted \Seen \Draft \Answered \Flagged)
* OK [UIDVALIDITY 1561546646] current uidvalidity
* OK [UIDNEXT 83] next uid
* OK [PERMANENTFLAGS (\Deleted \Seen \Draft \Answered \Flagged)] limited
B3 OK [READ-WRITE] SELECT completed
DEBUG IMAPS: no connections in the pool, creating a new one
* OK IMAPrev1
C0 CAPABILITY
* CAPABILITY IMAP4 IMAP4rev1 CHILDREN IDLE QUOTA SORT ACL NAMESPACE RIGHTS=texk
C0 OK CAPABILITY completed
DEBUG IMAPS: mechanism PLAIN not supported by server
DEBUG IMAPS: mechanism LOGIN not supported by server
DEBUG IMAPS: mechanism NTLM not supported by server
DEBUG IMAPS: mechanism XOAUTH2 disabled by property: mail.imaps.auth.xoauth2.disable
DEBUG IMAPS: LOGIN command trace suppressed
DEBUG IMAPS: LOGIN command result: C1 OK LOGIN completed
C2 CAPABILITY
* CAPABILITY IMAP4 IMAP4rev1 CHILDREN IDLE QUOTA SORT ACL NAMESPACE RIGHTS=texk
C2 OK CAPABILITY completed
C3 SELECT tempFolder
* 2 EXISTS
* 0 RECENT
* FLAGS (\Deleted \Seen \Draft \Answered \Flagged)
* OK [UIDVALIDITY 1561724024] current uidvalidity
* OK [UIDNEXT 28] next uid
* OK [PERMANENTFLAGS (\Deleted \Seen \Draft \Answered \Flagged)] limited
C3 OK [READ-WRITE] SELECT completed
B4 COPY 1 tempFolder
B4 OK COPY completed
A7 STORE 1 +FLAGS (\Deleted)
* 1 FETCH (FLAGS (\Deleted \Seen) UID 78)
A7 OK STORE completed
B5 CLOSE
* 1 FETCH (FLAGS (\Deleted \Seen) UID 78)
B5 OK CLOSE completed
DEBUG IMAPS: added an Authenticated connection -- size: 1
DEBUG IMAP: pool is full, not adding an Authenticated connection
C4 CLOSE
* 3 EXISTS
* 3 RECENT
C4 OK CLOSE completed
C5 LOGOUT
* BYE Have a nice day
C5 OK Logout completed
cycle-step : 2
A8 FETCH 2 (FLAGS)
* 2 FETCH (FLAGS (\Seen))
A8 OK FETCH completed
A9 FETCH 2 (ENVELOPE INTERNALDATE RFC822.SIZE)
* 2 FETCH (RFC822.SIZE 627 INTERNALDATE "28-Jun-2019 12:57:30 +0200" ENVELOPE ("Fri, 28 Jun 2019 12:57:30 +0200" "email3" (("Surname, name" NIL "sender" "host.net")) (("Surname, name" NIL "sender" "host.net")) (("Surname, name" NIL "sender" "host.net")) (("[email protected]" NIL "destiMail" "host.net")) NIL NIL NIL "<[email protected]>"))
A9 OK FETCH completed
A10 FETCH 2 (BODY[]<0.16384>)
* 2 FETCH (BODY[]<0> {627}
Return-Path: [email protected]
Received: from [192.168.75.96] (******.*********.net [192.168.75.96])
by INFINITYHR with ESMTPA
; Fri, 28 Jun 2019 12:56:21 +0200
To: [email protected]
From: "Surname, name" <[email protected]>
Subject: email3
Message-ID: <[email protected]>
Date: Fri, 28 Jun 2019 12:57:30 +0200
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101
Thunderbird/60.7.2
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Transfer-Encoding: 7bit
Content-Language: en-US
)
A10 OK FETCH completed
DEBUG IMAPS: connection available -- size: 1
B6 SELECT SourceFolder
* 3 EXISTS
* 0 RECENT
* FLAGS (\Deleted \Seen \Draft \Answered \Flagged)
* OK [UIDVALIDITY 1561546646] current uidvalidity
* OK [UIDNEXT 83] next uid
* OK [PERMANENTFLAGS (\Deleted \Seen \Draft \Answered \Flagged)] limited
B6 OK [READ-WRITE] SELECT completed
DEBUG IMAPS: no connections in the pool, creating a new one
* OK IMAPrev1
D0 CAPABILITY
* CAPABILITY IMAP4 IMAP4rev1 CHILDREN IDLE QUOTA SORT ACL NAMESPACE RIGHTS=texk
D0 OK CAPABILITY completed
DEBUG IMAPS: mechanism PLAIN not supported by server
DEBUG IMAPS: mechanism LOGIN not supported by server
DEBUG IMAPS: mechanism NTLM not supported by server
DEBUG IMAPS: mechanism XOAUTH2 disabled by property: mail.imaps.auth.xoauth2.disable
DEBUG IMAPS: LOGIN command trace suppressed
DEBUG IMAPS: LOGIN command result: D1 OK LOGIN completed
D2 CAPABILITY
* CAPABILITY IMAP4 IMAP4rev1 CHILDREN IDLE QUOTA SORT ACL NAMESPACE RIGHTS=texk
D2 OK CAPABILITY completed
D3 SELECT tempFolder
* 2 EXISTS
* 0 RECENT
* FLAGS (\Deleted \Seen \Draft \Answered \Flagged)
* OK [UIDVALIDITY 1561724024] current uidvalidity
* OK [UIDNEXT 29] next uid
* OK [PERMANENTFLAGS (\Deleted \Seen \Draft \Answered \Flagged)] limited
D3 OK [READ-WRITE] SELECT completed
B7 COPY 2 tempFolder
B7 OK COPY completed
A11 STORE 2 +FLAGS (\Deleted)
* 2 FETCH (FLAGS (\Deleted \Seen) UID 81)
A11 OK STORE completed
B8 CLOSE
* 2 FETCH (FLAGS (\Deleted \Seen) UID 81)
B8 OK CLOSE completed
DEBUG IMAPS: added an Authenticated connection -- size: 1
DEBUG IMAP: pool is full, not adding an Authenticated connection
D4 CLOSE
* 3 EXISTS
* 3 RECENT
D4 OK CLOSE completed
D5 LOGOUT
* BYE Have a nice day
D5 OK Logout completed
cycle-step : 3
A12 FETCH 3 (FLAGS)
A12 OK FETCH completed
A13 FETCH 3 (ENVELOPE INTERNALDATE RFC822.SIZE)
A13 OK FETCH completed
moveToWorking ex:javax.mail.MessagingException: Failed to load IMAP envelope
javax.mail.MessagingException: Failed to load IMAP envelope
at com.sun.mail.imap.IMAPMessage.loadEnvelope(IMAPMessage.java:1532)
cycle-step : 4
A14 FETCH 4 (FLAGS)
at com.sun.mail.imap.IMAPMessage.getSize(IMAPMessage.java:511)
at javax.mail.internet.MimeMessage.<init>(MimeMessage.java:245)
at com.horsa.antidatacap.utilities.MailHandler.moveFromFolderTo(MailHandler.java:100)
at com.horsa.antidatacap.main.Main.main(Main.java:31)
A14 OK FETCH completed
A15 FETCH 4 (ENVELOPE INTERNALDATE RFC822.SIZE)
A15 OK FETCH completed
moveToWorking ex:javax.mail.MessagingException: Failed to load IMAP envelope
javax.mail.MessagingException: Failed to load IMAP envelope
at com.sun.mail.imap.IMAPMessage.loadEnvelope(IMAPMessage.java:1532)
at com.sun.mail.imap.IMAPMessage.getSize(IMAPMessage.java:511)
at javax.mail.internet.MimeMessage.<init>(MimeMessage.java:245)
at com.horsa.antidatacap.utilities.MailHandler.moveFromFolderTo(MailHandler.java:100)
at com.horsa.antidatacap.main.Main.main(Main.java:31)
fine
DEBUG IMAPS: IMAPStore cleanup, force false
DEBUG IMAPS: close folder
DEBUG IMAP: pool is full, not adding an Authenticated connection
A16 LOGOUT
* BYE Have a nice day
A16 OK Logout completed
B9 LOGOUT
* BYE Have a nice day
B9 OK Logout completed
DEBUG IMAPS: IMAPStore cleanup done
Нет, этот почтовый сервер находится в нашей локальной сети и используется только для разработки/тестирования, в то время я единственный, кто работает над ним; но иногда с Thunderbird выглядит так, что количество писем, полученных клиентом или JavaMail, меньше/больше (пример: я вижу 3 письма от Thunderbird, но получаю 4 письма из папки inboxFolder.getMessages();) в других случаях это похоже на почтовый сервер на самом деле не очищайте сообщения с флагом DELETE
Попробуйте разделить цикл, чтобы сначала цикл извлекал данные. Затем другой цикл удаляет (и удаляет). Если это работает, проблема заключалась в том, что почтовый ящик изменялся, например. Thunderbird выпустил удаление, и вы ожидали, что что-то останется без изменений.
сделал еще один тест, отредактировал основной поток
@arnt уже разделен, я делаю .getMessages() снаружи, а затем зацикливаю Message[], в этом цикле есть метод moveFromFolderTo
Какой почтовый сервер вы используете? Можете ли вы опубликовать весь вывод отладки JavaMail? Используется ли Thunderbird для доступа к почтовому ящику во время работы вашей программы?
я использую hMailServer, и Thunderbird не используется при выполнении программы; отредактирован основной поток с полным журналом. может быть, это java-программа, которая приводит сервер в это противоречивое состояние? похоже, что сервер переходит в это состояние только после первого исключения. Спасибо за помощь!
По крайней мере, пришлось сменить почтовый сервер, я наконец-то заставил его работать с Apache James; может быть, немного сложнее, чем hMailServer, но, безусловно, более стабильный.
Похоже, ваш почтовый сервер не может предоставить запрошенную информацию для сообщения. Вероятно, это ошибка почтового сервера. Несколько приложений обращаются к почтовому ящику одновременно?