SMTP JavaMail:使用线程获取SMTPTransport Not Connected错误

时间:2015-05-09 19:41:45

标签: java multithreading email smtp javamail

我正在尝试使用JavaMail API。我尝试使用相同的传输对象发送多封电子邮件,以避免重新验证。

transport = mailSession.getTransport("smtp");
transport.connect(host, mail.getSenderAddress(), password);
for (int i = 1; i <= 10; i++) {
    transport.sendMessage(mailMessage, mailMessage.getAllRecipients());
}

这很好用,我可以发送10封电子邮件。 现在我想使用线程同时发送所有这些电子邮件。 所以我创建了一个使用transport.sendMessage()发送邮件的新类。

class MailSender implements Runnable {

    Transport transport;
    MimeMessage mailMessage;

    public MailSender(Transport transport, MimeMessage mailMessage) {
        this.transport = transport;
        this.mailMessage = mailMessage;
    }

    public void run() {
        try {
            transport.sendMessage(mailMessage,
                    mailMessage.getAllRecipients());
        } catch (MessagingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

我正在创建10个不同的主题,如:

transport = mailSession.getTransport("smtp");
transport.connect(host, mail.getSenderAddress(), password);
for (int i = 1; i <= 10; i++) {
    new Thread(new MailSender(transport, mailMessage)).start();
}

但是当我这样做时,我不断得到以下异常:

Exception in thread "Thread-2" java.lang.IllegalStateException: Not connected
at com.sun.mail.smtp.SMTPTransport.checkConnected(SMTPTransport.java:2252)
at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1074)
at com.rubberduck.mymail.MyMailHelper$MailSender.run(MyMailHelper.java:128)
at java.lang.Thread.run(Thread.java:745)

我在for循环之前调用connect,那怎么抱怨它没有连接?

1 个答案:

答案 0 :(得分:0)

启用JavaMail Session debugging以更好地了解正在发生的事情。很可能您的线程错误,或者服务器因某种原因丢弃了连接。

但是使用线程在单个连接上发送消息确实没有意义,因为所有工作在到达连接时都是单线程的。在连接上一次只能发送一条消息。这就是SMTP的工作方式。如果要并行发送多条消息,则需要多个连接。