【问题标题】:SMTP JavaMail : Getting SMTPTransport Not Connected error with ThreadsSMTP JavaMail:使用线程获取 SMTPTransport Not Connected 错误
【发布时间】:2015-05-10 05:33:56
【问题描述】:

我正在尝试使用 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,那它怎么会抱怨它没有连接呢?

【问题讨论】:

    标签: java multithreading email smtp jakarta-mail


    【解决方案1】:

    打开JavaMail Session debugging 以更好地了解正在发生的事情。很可能是您的线程错误,或者服务器出于某种原因断开了连接。

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

    【讨论】:

    • 哦,好吧。但是当我尝试发送 1000 封邮件时,每次都建立新的连接,过了一段时间它开始为太多的请求抛出异常。我正在使用 Gmail SMTP 服务器。有什么方法可以让我从一个帐户发送多封电子邮件?我想尽快完成。
    • 您不需要每次都建立连接。您可以在每个连接上发送一堆消息,并使用多个连接。如果您使用免费的 Gmail,他们会限制您可以发送多少邮件的频率。如果您有付费帐户,您的服务条款应说明您可以做什么。
    • 是的,我试过了,Gmail SMTP 不允许超过 10-12 个并行连接。感谢您的帮助。
    猜你喜欢
    • 2012-01-15
    • 2018-03-17
    • 1970-01-01
    • 2023-01-27
    • 2017-02-25
    • 2012-11-16
    • 2016-07-19
    • 2013-06-25
    • 1970-01-01
    相关资源
    最近更新 更多