个人觉得也不一定要用这么多线程去做。循环发送不行吗?比如: 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();
根本原因是什么,我也只是猜测。 有只能是楼主采用多线程的方式,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("[email protected]")); msg.setSubject("test javamail"); msg.setRecipients(RecipientType.TO, InternetAddress.parse("[email protected],[email protected],[email protected]"));//可添加多个接收地址 Transport.send(msg);
每一次开一个线程,这样可能会有前一个线程未关闭连接,后一个线程又重连的情况吧?另外,每发一个弄个线程,发一个万,要弄一万个线程?用线程池也好过这种方式吧,而且connect也只需要连接一次,要那么多次connect,再close干嘛。
你说的另一个线程重新连的问题,我原先是会等待这个线程结束后,才会开启另一线程,后来就碰到了我提的这个问题,导致应用停在那不执行了(我发现的时候,已经停在那6个多小时了)。后来我就调整了策略,我会等待这个线程1分钟的时间,如果它还没结束,我才会重启另一线程。(为了你好理解,我补充下,我是同一组开启5-10个线程分别连接不同的服务器进行发送,我会等待这组线程全部执行完,再开启下一组)
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();
有只能是楼主采用多线程的方式,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("[email protected]"));
msg.setSubject("test javamail");
msg.setRecipients(RecipientType.TO,
InternetAddress.parse("[email protected],[email protected],[email protected]"));//可添加多个接收地址
Transport.send(msg);