MimeMessage.writeTo(OutputStream) 挂起

我正在尝试通读邮箱中的邮件,但是在将邮件内容解析为 MimeMessage 的过程中,某些特定邮件使进程挂起,它没有显示任何错误消息,日志显示程序在 MimeMessage.writeTo 步骤停止(OutputStream), 下面是实际代码


for (int n = message.length; i < n; i++)

            {Log25.write("IMAPaccess", "getMessages", "start convert");

                MimeMessage msg = (MimeMessage)message[i];

                Log25.write("IMAPaccess", "getMessages", "A");

                ByteArrayOutputStream bos = new ByteArrayOutputStream();

                Log25.write("IMAPaccess", "getMessages", "B");

                msg.writeTo(bos);

                Log25.write("IMAPaccess", "getMessages", "C");

                bos.close();

                Log25.write("IMAPaccess", "getMessages", "start create bis");

                SharedByteArrayInputStream bis = new SharedByteArrayInputStream(bos.toByteArray());

                MimeMessage cmsg = new MimeMessage(session, bis);

                bis.close();


....

下面是日志信息,它没有显示任何异常,但挂在“B”处,即“msg.writeTo(bos);”步骤中 在日志中


Mon Sep 10 09:44:41 UTC 2018    IMAPaccess      getMessages     36:     [Ljavax.mail.internet.InternetAddress;@d522e24d null

Mon Sep 10 09:44:41 UTC 2018    IMAPaccess      getMessages     36: From address length         1

Mon Sep 10 09:44:41 UTC 2018    IMAPaccess      getMessages     36: From address        INFORMATION <info@funds.com>

Mon Sep 10 09:44:41 UTC 2018    IMAPaccess      getMessages     complete for loop j

Mon Sep 10 09:44:41 UTC 2018    IMAPaccess      getMessages     start convert

Mon Sep 10 09:44:41 UTC 2018    IMAPaccess      getMessages     A

Mon Sep 10 09:44:41 UTC 2018    IMAPaccess      getMessages     B

Mon Sep 10 09:44:41 UTC 2018    IMAPaccess      getMessages     C

Mon Sep 10 09:44:41 UTC 2018    IMAPaccess      getMessages     start create bis

Mon Sep 10 09:44:41 UTC 2018    IMAPaccess      getMessages     start cmsg to mimeMessage

Mon Sep 10 09:44:41 UTC 2018    IMAPaccess      getMessages     content type: text/html;^M



森林海
浏览 150回答 1
1回答

暮色呼如

最终我放弃了转换消息类型,如果它在转换中挂起我直接让for循环跳过并继续,这样一些消息就被省略了。我认为这无关紧要,因为我发现只有垃圾邮件才能使程序挂起。下面是代码for (int n = message.length; i < n; i++)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Log25.write("IMAPaccess", "getMessages", "start convert");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MimeMessage msg = (MimeMessage)message[i];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ByteArrayOutputStream bos = new ByteArrayOutputStream();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // MJN1 has some SPAM email cannot be converted, so use thread to do the conversion&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; final Runnable stuffToDo = new Thread() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void run() {&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Log25.write("IMAPaccess", "run", "write to MimeMessage");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; msg.writeTo(bos);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Log25.write("IMAPaccess", "run", "wrote to MimeMessage");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } catch (IOException | MessagingException e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Log25.write("IMAPaccess", "run", (new StringBuilder()).append("error = ").append(e.getMessage()).toString());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; };&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; final ExecutorService executor = Executors.newSingleThreadExecutor();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; final Future future = executor.submit(stuffToDo);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; executor.shutdown(); // This does not cancel the already-scheduled task.&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // start the conversion and if the process hangs, the loop should skip and continue&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; future.get(1, TimeUnit.SECONDS);&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; catch (InterruptedException ie) {&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Log25.write("IMAPaccess", "getMessages", (new StringBuilder()).append("error = ").append(ie.getMessage()).toString());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; catch (ExecutionException ee) {&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Log25.write("IMAPaccess", "getMessages", (new StringBuilder()).append("error = ").append(ee.getMessage()).toString());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; catch (TimeoutException te) {&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Log25.write("IMAPaccess", "getMessages", (new StringBuilder()).append("error = ").append(te.getMessage()).toString());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; catch(Exception e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Log25.write("IMAPaccess", "getMessages", (new StringBuilder()).append("error = ").append(e.getMessage()).toString());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!executor.isTerminated())&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; executor.shutdownNow();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bos.close();我使用线程和执行程序来使挂起循环继续,这不是一件容易的事。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java