如何更改 JavaMail 端口

2022-09-02 03:23:11

我正在使用JavaMail编写一个小型Java应用程序,该应用程序向用户发送自动电子邮件。他们可以在(目前)两个端口之间进行选择:25和587。可以通过 GUI 上的单选按钮选择端口。

我添加了一个测试按钮,允许用户测试电子邮件设置(包括端口)。但是,由于某种原因,一旦用户尝试发送测试电子邮件,就无法更改端口。Javamail 将始终使用原始测试电子邮件的端口。

示例:用户尝试在端口 25 上发送电子邮件,而 JavaMail 表示无法在端口 25 上连接(例如,SMTP 主机使用另一个端口)。用户单击端口 587,并尝试发送新电子邮件。JavaMail再次抛出一个错误,说它无法在端口25上连接。

我有点被为什么难住了。每次发送新的测试电子邮件时,都会创建一个全新的 SendMailUsingAuthentication 对象。在该类中,属性始终重置为正确的端口。每当我调试时,据我所知,所有变量都是正确的,并与正确的端口相关联。运输内部是否有我错过的东西?

在前端 GUI 中:

private void testButtonActionPerformed(java.awt.event.ActionEvent evt) {                                           

    int port = port25RadioButton.isSelected() ? PORT_25 : PORT_587;
    notifier = new SendMailUsingAuthentication(hostNameTextField.getText(),
            userTextField.getText(), getPassword(), emailTextField.getText().split(","),port);


    Thread wait = new Thread(new Runnable() {

        public void run() {
            try {
                changeStatusText("Sending test email...");
                notifier.postTestMail();
                changeStatusText("Test email sent.");
            } catch (AddressException ex) {
                changeStatusText("Error.  Invalid email address name.");
            } catch (MessagingException ex) {
                changeStatusText("SMTP host connection refused.");
                System.err.println(ex.getMessage());
            } catch (Exception ex) {
                System.err.println(ex);
            }
        }
    });

    wait.start();
}

在电子邮件发件人类中:

public void postTestMail() throws MessagingException, AddressException{
    String[] testReciever = new String[1];
    testReciever[0] = emailList[0];
    postMail(testReciever, "Test email.", "Your email settings are successfully set up.", emailFromAddress);
}

private void postMail(String recipients[], String subject,
        String message, String from) throws MessagingException, AddressException {

    //Set the host smtp address
    Properties props = new Properties();
    props.put("mail.smtp.port", smtpPort);
    props.put("mail.smtp.host", smtpHostName);
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.starttls.enable", true);
    Authenticator auth = new SMTPAuthenticator();
    Session session = Session.getDefaultInstance(props, auth);
    session.setDebug(false);

    // create a message
    Message msg = new MimeMessage(session);

    // set the from and to address
    InternetAddress addressFrom = new InternetAddress(from);
    msg.setFrom(addressFrom);

    InternetAddress[] addressTo = new InternetAddress[recipients.length];
    for (int i = 0; i < recipients.length; i++) {
        addressTo[i] = new InternetAddress(recipients[i]);
    }
    msg.setRecipients(Message.RecipientType.TO, addressTo);

    // Setting the Subject and Content Type
    msg.setSubject(subject);
    msg.setContent(message, "text/plain");
    Transport.send(msg);
}

答案 1

发生这种情况是因为您正在使用它getDefaultInstance()

获取默认会话对象。如果尚未设置默认值,则会创建一个新的 Session 对象并将其安装为默认值。

并且该参数“仅在创建新的 Session 对象时使用”。Properties

因此,第一次调用它时使用指定的端口。之后,已经创建了,随后调用将返回相同的会话,并忽略更改的属性。getDefaultInstanceSessiongetDefaultInstance

尝试使用 而不是 ,每次都会使用提供的属性创建新的 。Session.getInstance()getDefaultInstance()Session

非常仔细地阅读javadocs是值得的。


答案 2

提示给其他仍然有问题的人,我们使用的是Session.getInstance,端口仍然默认为25。

事实证明,我们将 prop 值设置为 a,当它需要是字符串时Long

它没有错误,警告或记录,只是默认为25。


推荐