3

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

4

3 回答 3

4

当您连接到 SMTP 服务器时(也使用javax.mailAPI 时),您使用套接字连接(请参阅SMTPTransport 和 Transport 类的 src )。套接字允许您连接到远程服务器,并且该连接保持打开状态,直到显式关闭。这意味着理论上您可以创建一个连接并让他们重用它。

但是,许多 SMTP 服务器非常邪恶,如果您使用它“太慢”或者如果您尝试重新使用您的 SMTP 会话来经常性,它们会终止连接。(我为您查找了后缀设置。)

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

于 2011-11-25T10:25:02.447 回答
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());
}

奇迹般有效。干杯!

于 2015-06-19T07:59:11.883 回答
1

如果您想要一个始终在线的连接,您应该在发送方法之外创建您的传输,但为了避免发送时出现异常(SMTPSendFailedException 421 超时数据客户端),您应该检查传输是否已连接,如果未连接,则在发送之前再次连接:

 if (!transport.isConnected())//make sure the connection is alive
            transport.connect();
 transport.sendMessage(message, message.getAllRecipients());
于 2017-07-10T09:34:19.800 回答