最近遇到一个问题:使用JavaMail收取邮件在系统运行一定时间后,无法成功.
出错信息是这样的:
java 代码
- DEBUG [DefaultQuartzScheduler_Worker-2] (?:?) - session instance initiated
- DEBUG [DefaultQuartzScheduler_Worker-2] (?:?) - session store set
- INFO [DefaultQuartzScheduler_Worker-7] (?:?) - Recieving Ticket Emails...
- DEBUG [DefaultQuartzScheduler_Worker-7] (?:?) - session instance initiated
- DEBUG [DefaultQuartzScheduler_Worker-7] (?:?) - session set debug
- DEBUG [DefaultQuartzScheduler_Worker-7] (?:?) - session store set
- ERROR [DefaultQuartzScheduler_Worker-7] (?:?) - Connection could not be established.
- ERROR [DefaultQuartzScheduler_Worker-7] (?:?) - An exception is created. System Message: javax.mail.MessagingException: Connect failed;
- nested exception is:
- java.net.ConnectException: Connection refused
- at com.sun.mail.pop3.POP3Store.protocolConnect(POP3Store.java:148)
- at javax.mail.Service.connect(Service.java:275)
- at com.akazam.directview.mail.protocols.Pop3.connect(Unknown Source)
- at com.akazam.directview.mail.protocols.Pop3.connect(Unknown Source)
- at com.akazam.directview.ticket.troubleticket.email.TicketEmailAPI.getEmail(Unknown Source)
- at com.akazam.directview.ticket.troubleticket.job.TicketCheckEmailJob.execute(Unknown Source)
- at org.quartz.core.JobRunShell.run(JobRunShell.java:203)
- at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:520)
- Caused by: java.net.ConnectException: Connection refused
- at java.net.PlainSocketImpl.socketConnect(Native Method)
- at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
- at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
- at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
- at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
- at java.net.Socket.connect(Socket.java:507)
- at com.sun.net.ssl.internal.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:546)
- at com.sun.net.ssl.internal.ssl.BaseSSLSocketImpl.connect(BaseSSLSocketImpl.java:141)
- at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:232)
- at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:163)
- at com.sun.mail.pop3.Protocol.<init></init>(Protocol.java:81)
- at com.sun.mail.pop3.POP3Store.getPort(POP3Store.java:201)
- at com.sun.mail.pop3.POP3Store.protocolConnect(POP3Store.java:144)
- ... 7 more
-
- INFO [DefaultQuartzScheduler_Worker-7] (?:?) - Error occurred while checking new emails:
发现这个问题,真的很奇怪,
测试环境中:使用了一个需要SSL验证邮件服务器(LINUX上运行的SendMail),没有问题
正式运行环境:是一个不需要SSL验证的邮件服务器( Microsoft Exchange Server 2003 POP3 server version 6.5.7638.1),系统运行一段时间后出现问题,每次重启后能正常工作,但是好景不长。
很奇怪,邮件接收程序是根据配置文件自动判断是否使用SSL连接。补上昨天没有写完的。
============================================================================================
今天是解决这个问题的最后期限,呵呵,压力出成绩,找到连接失败的原因了,环境变量在系统运行过程中被改了,导致POP3连接出错,具体如下(但是怎么被改的,还不清楚):
telnet到邮件服务器,用户名密码都没有问题,看来只有程序问题了。
创建MailSession时用到Properties props = System.getProperties();把这个打印出来的时候发现错误了,本来不应该使用SSL验证的,却出现了验证信息不应该出现这个,所以现在在每次POP3链接的时候如果不需要SSL链接都remove这些属性,问题没有了。
java 代码
- mail.pop3.socketFactory.port=2008,
- mail.pop3.socketFactory.fallback=false
Why?那边的程序改动了System.getProperties();还是比较奇怪,进一步的观察中。
=========================================后记===================================================
这个问题终于得到圆满的解决:终于知道谁改动了System.getProperties();原来在同一个Tomcat中还运行了另外一个系统,那个系统使用的邮件服务器是采用SSL验证发送接收邮件的,而且15分钟会收取一次邮件,由于程序写的不够严谨,就出现以上的错误,改进了程序后,两个系统终于可以并存于一个容器中。同时也知道了上面那个系统为什么重启后能在一定时间内正常运行,哈哈,而且知道了一定时间其实很短,最多15分钟。