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

解决方案 »

  1.   

    我是每一次发送开一个线程去完成,transport.connect(server, username, password)和transport.close()是成套使用的,是反复的connect,但也反复的close。所以不存在“再去connect已经连接上的服务”
      

  2.   


    每一次开一个线程,这样可能会有前一个线程未关闭连接,后一个线程又重连的情况吧?另外,每发一个弄个线程,发一个万,要弄一万个线程?用线程池也好过这种方式吧,而且connect也只需要连接一次,要那么多次connect,再close干嘛。
      

  3.   

    受教了,你说的线程池,和共享一个已连接的connect我会尝试下,并现场做个全方位对比。
    你说的另一个线程重新连的问题,我原先是会等待这个线程结束后,才会开启另一线程,后来就碰到了我提的这个问题,导致应用停在那不执行了(我发现的时候,已经停在那6个多小时了)。后来我就调整了策略,我会等待这个线程1分钟的时间,如果它还没结束,我才会重启另一线程。(为了你好理解,我补充下,我是同一组开启5-10个线程分别连接不同的服务器进行发送,我会等待这组线程全部执行完,再开启下一组)
      

  4.   

    个人觉得也不一定要用这么多线程去做。循环发送不行吗?比如:
        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();
      

  5.   

    Thread.sleep(100);//防止发的太,sleep一小会。
      

  6.   

    很感谢brightyq这么耐心的给我指点,我还会尝试一些其它方案(包括你提的建议),不过这个问题的根本原因能找到吗,不然不管用什么方案,我都当心这个问题会一直存在,虽然它只是偶尔出现,虽然当它出现时,我也可以绕过它,但它终究是一个问题摆在那
      

  7.   

    根本原因是什么,我也只是猜测。
    有只能是楼主采用多线程的方式,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);