SMTP JavaMail:使用线程获取 SMTPTransport 未连接错误
SMTP JavaMail : Getting SMTPTransport Not Connected error with Threads
我正在尝试使用 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 封电子邮件。
现在我想使用线程同时发送所有这些电子邮件。
所以我创建了一个新的 class,它使用 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,怎么会提示没有连接?
打开 JavaMail Session debugging 以更好地了解正在发生的事情。很可能你的线程是错误的,或者服务器由于某种原因正在断开连接。
但是使用线程在单个连接上发送消息真的没有意义,因为所有工作在到达连接时都将是单线程的。连接上一次只能发送一条消息。这就是 SMTP 的工作方式。如果您想并行发送多条消息,则需要多个连接。
我正在尝试使用 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 封电子邮件。 现在我想使用线程同时发送所有这些电子邮件。 所以我创建了一个新的 class,它使用 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,怎么会提示没有连接?
打开 JavaMail Session debugging 以更好地了解正在发生的事情。很可能你的线程是错误的,或者服务器由于某种原因正在断开连接。
但是使用线程在单个连接上发送消息真的没有意义,因为所有工作在到达连接时都将是单线程的。连接上一次只能发送一条消息。这就是 SMTP 的工作方式。如果您想并行发送多条消息,则需要多个连接。