用Javamail发送邮件时,在transport.connect时停住了,整个线程就死在这不往下执行了

zxhcloth 2012-08-03 02:31:45
这个问题不是经常出现,平均发几千封邮件会出现一次,就是在
transport.connect(server, username, password)时出现的;

后来将其dump出来,如下所示,我还是找不出具体的原因,请哪位大牛帮忙分析下,不胜感激!

名称: Thread-23279
状态: RUNNABLE
阻塞总数:0 等待总数: 0

堆栈追踪:
java.net.SocketInputStream.socketRead0(Native Method)
java.net.SocketInputStream.read(SocketInputStream.java:129)
com.sun.mail.util.TraceInputStream.read(TraceInputStream.java:110)
java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
java.io.BufferedInputStream.read(BufferedInputStream.java:237)
- 已锁定 java.io.BufferedInputStream@6a48eb
com.sun.mail.util.LineInputStream.readLine(LineInputStream.java:89)
com.sun.mail.smtp.SMTPTransport.readServerResponse(SMTPTransport.java:2188)
com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1699)
com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1120)
- 已锁定 com.sun.mail.smtp.SMTPTransport@f849dc
com.jmail.mail.SendMail.send(SendMail.java:88)
com.jmail.SendThread.run(SendThread.java:61)
java.lang.Thread.run(Thread.java:662)
...全文
1660 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
长弓77 2014-09-03
  • 打赏
  • 举报
回复
请问楼主解决了吗?遇到同样问题的好蛋疼,前来求助
迷茫之欲 2014-04-19
  • 打赏
  • 举报
回复
静态以后还是会出现,郁闷啊
迷茫之欲 2014-04-18
  • 打赏
  • 举报
回复
能加qq吗707793110这是我qq
迷茫之欲 2014-04-18
  • 打赏
  • 举报
回复
你好,楼主,你这个问题到最后是怎么解决的呢,能指教一下吗,我现在也遇到这个问题了
zxhcloth 2012-08-06
  • 打赏
  • 举报
回复
再一次表示感谢,具体原因我在实践中再找找,我结贴了。
brightyq 2012-08-03
  • 打赏
  • 举报
回复
根本原因是什么,我也只是猜测。
有只能是楼主采用多线程的方式,connect造成的问题,javamail api, connect方法有这么一句:

It is an error to connect to an already connected service.

另外网络、邮件服务器也都可能出现问题,就是我们用IE打开自己的邮箱,去发一封邮件,也可能出现发送失败的情况,更何况楼主一直不停的发。所以一次很顺的发送大批量邮件,中间出现问题也应该是正常情况(具体我也没测试过)。

不过刚才有一个帖子让我想起,发送的时候,可以一次发送多个人,就好像用邮箱发邮件时,也可以抄送一样。

Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress("from@163.com"));
msg.setSubject("test javamail");
msg.setRecipients(RecipientType.TO,
InternetAddress.parse("user1@163.com,user2@163.com,user3@163.com"));//可添加多个接收地址
Transport.send(msg);


zxhcloth 2012-08-03
  • 打赏
  • 举报
回复
很感谢brightyq这么耐心的给我指点,我还会尝试一些其它方案(包括你提的建议),不过这个问题的根本原因能找到吗,不然不管用什么方案,我都当心这个问题会一直存在,虽然它只是偶尔出现,虽然当它出现时,我也可以绕过它,但它终究是一个问题摆在那
brightyq 2012-08-03
  • 打赏
  • 举报
回复
Thread.sleep(100);//防止发的太,sleep一小会。
brightyq 2012-08-03
  • 打赏
  • 举报
回复
个人觉得也不一定要用这么多线程去做。循环发送不行吗?比如:


MimeMessage msg = new MimeMessage(session);

Transport t = session.getTransport("smtp");

...........

t.connect();

for (int i = 0; .....) {
t.sendMessage(msg, new Address[] { recipients[i] });
Thread.sleep(100);//防止发的太多,sleep一小会。
}

t.close();
zxhcloth 2012-08-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
嗯。。。
每一次开一个线程,这样可能会有前一个线程未关闭连接,后一个线程又重连的情况吧?

另外,每发一个弄个线程,发一个万,要弄一万个线程?用线程池也好过这种方式吧,而且connect也只需要连接一次,要那么多次connect,再close干嘛。
[/Quote]
受教了,你说的线程池,和共享一个已连接的connect我会尝试下,并现场做个全方位对比。
你说的另一个线程重新连的问题,我原先是会等待这个线程结束后,才会开启另一线程,后来就碰到了我提的这个问题,导致应用停在那不执行了(我发现的时候,已经停在那6个多小时了)。后来我就调整了策略,我会等待这个线程1分钟的时间,如果它还没结束,我才会重启另一线程。(为了你好理解,我补充下,我是同一组开启5-10个线程分别连接不同的服务器进行发送,我会等待这组线程全部执行完,再开启下一组)
brightyq 2012-08-03
  • 打赏
  • 举报
回复
嗯。。。
每一次开一个线程,这样可能会有前一个线程未关闭连接,后一个线程又重连的情况吧?

另外,每发一个弄个线程,发一个万,要弄一万个线程?用线程池也好过这种方式吧,而且connect也只需要连接一次,要那么多次connect,再close干嘛。
zxhcloth 2012-08-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
transport.connect(server, username, password)

这一句有反复执行吗?
如果连接上了服务器,则不需要再执行这行了,再去connect已经连接上的服务,有可能会引发问题。这一句执行一次就好。当连接继开时再去重连。
[/Quote]
我是每一次发送开一个线程去完成,transport.connect(server, username, password)

和transport.close()是成套使用的,是反复的connect,但也反复的close。所以不存在“再去connect已经连接上的服务”
brightyq 2012-08-03
  • 打赏
  • 举报
回复
transport.connect(server, username, password)

这一句有反复执行吗?
如果连接上了服务器,则不需要再执行这行了,再去connect已经连接上的服务,有可能会引发问题。这一句执行一次就好。当连接继开时再去重连。
zxhcloth 2012-08-03
  • 打赏
  • 举报
回复
额的神呐,拒绝掉也不要停在那啊,它给我个错误也行,我现在就是想要它往下继续执行,哪怕提示错误也没关系。
老紫竹 2012-08-03
  • 打赏
  • 举报
回复
很有可能,自己搭建个服务器,自己测试吧。
brightyq 2012-08-03
  • 打赏
  • 举报
回复
不要一直不停的发,这样可能会邮件服务器那边拒绝掉。尤其是公共的那些邮件服务器。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧