连续电子邮件服务器使用JAVA Mail API连接

时间:2011-11-25 07:29:48

标签: smtp javamail massmail mail-server

我们打算开发一种服务,它始终保持连接到电子邮件服务器,这样无论何时用户触发邮件,它都会通过使用连接发送而不是获得新邮件连接并发送邮件。 是否有可能我们始终使用JAVA Mail API保持与电子邮件服务器的连接? 请帮助我。

3 个答案:

答案 0 :(得分:3)

当您连接到SMTP服务器时(使用javax.mail API时),您使用套接字连接(请参阅SMTPTransport and Transport classes的src)。套接字允许您连接到远程服务器,并且该连接保持打开状态,直到明确关闭。这意味着理论上你可以创建一个连接并重用它。

但是,许多SMTP服务器非常邪恶,会终止连接if you are using it "too slow"if you try to resuse your SMTP session to often。 (我为你查了postfix个设置。)

Java Mail API允许您创建连接并随时关闭它。水木清华。像这样:

        Transport transport = session.getTransport("smtp");
        transport.connect();
        transport.sendMessage(msg, addressArray);
        // you can do transport.close(); later

但是,由于SMTP服务器的实际情况,您不能只执行一次connect()而忘记它。最多,您可以做的是通过重新连接来正确处理强制断开连接。 Java Mail API中有一个通知机制来执行此操作(请查看notifyConnectionListeners方法的用法)

答案 1 :(得分:1)

  

但是,由于SMTP服务器的实际情况,您不能只是   执行connect()一次并忘记它。最多,你可以做的是   通过重新连接来正确处理强制断开连接。

同意!

实际上,您可以使用以下逻辑重用JavaMail SMTP连接:

Transport transport = null;
MimeMessage message = null;

Properties prop = new Properties();
// load all smtp properties

Session session = Session.getDefaultInstance(prop, null);
transport = session.getTransport("smtp");

for (EachMail eachMail : list) {
    if (!transport.isConnected()) {
        if (port != null && port.length() > 0) {
            transport.connect(host, Integer.parseInt(port), "<username>", "<password>");
        } else {
            transport.connect(host, "<username>", "<password>");
        }
    }

    // set all mail attributes from eachMail object
    message.saveChanges();
    transport.sendMessage(message, message.getAllRecipients());
}

像魅力一样工作。干杯!

答案 2 :(得分:1)

如果你想要一个永远在线的连接,你应该在发送方法之外创建你的传输,但是为了避免发送时的激活(SMTPSendFailedException 421超时数据客户端)你应该检查传输是否已连接,如果没有连接它发送:

 if (!transport.isConnected())//make sure the connection is alive
            transport.connect();
 transport.sendMessage(message, message.getAllRecipients());