当前位置: 首页 > 面试题库 >

如何更改JavaMail端口

柴砚文
2023-03-14
问题内容

我正在使用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);
}

问题答案:

这是因为你使用getDefaultInstance()其中说:

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

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

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

尝试使用Session.getInstance()代替getDefaultInstance()Session每次使用提供的属性创建一个新的。

仔细阅读javadocs是值得的。



 类似资料:
  • 问题内容: 例如,如何将其从5858更改为7000? 问题答案: 您可以使用以下选项: 您可以对>> v8的最新节点使用选项 https://nodejs.org/en/docs/inspector/

  • 请问如何更改pentaho 5.1的端口。我使用的是windows 10。现在值为8080但我需要更改,我在网上搜索了信息,他们让我修改一些xml文件,但问题是,他们提到的文件在我的pentaho中不存在。 非常感谢!

  • 我正在尝试运行以下命令将hpi文件打包到目标文件夹中 并观察到下面的错误消息,该消息表示该端口已被使用。我只是试图手动终止端口,但我没有这样做的特权。是否可以通过作为参数-Dhpi传递来自定义端口号。port=xxx类似于这样的吗? 例外: JAVA网BindException:地址已在使用中:在sun处绑定。尼奥。中国网。在sun的bind0(本机方法)。尼奥。中国网。在sun上绑定(Net.j

  • 问题内容: 我有这个命令 并且我需要添加特定的非标准端口32001。该怎么做?我当时在想一些标志之类的东西,但我不知道其语法。 问题答案: 根据此MSDN链接,您将使用。

  • 问题内容: 我使用JBoss utils(JAX-WS兼容)生成了一个web服务客户机,使用Eclipse的“来自wsdl的web服务客户机”。 所以,我提供的唯一东西是指向web服务WSDL的url。 现在,web服务提供者告诉我更改web服务的“客户端端点应用程序访问的url”。 它是什么以及如何改变它? 问题答案: 在IMO中,提供者告诉你更改服务端点(即到web服务的位置),而不是客户端端

  • 问题内容: 如何动态更改JAXWS客户端使用的地址?该客户端是由wsimport生成的。 问题答案: 使用Apache CXF解决了该问题。 仅用两行代码!这是代码段: