gpt4 book ai didi

java - 如何更改 JavaMail 端口

转载 作者:太空狗 更新时间:2023-10-29 22:51:32 25 4
gpt4 key购买 nike

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

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

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

我有点困惑为什么。每次发送新的测试电子邮件时,都会创建一个全新的 SendMailUsingAuthentication 对象。在该类中,属性总是重置为正确的端口。每当我调试时,据我所知,所有变量都是正确的并且与正确的端口相关联。 Transport 内部是否发生了我遗漏的事情?

在前端 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() says :

Get the default Session object. If a default has not yet been setup, a new Session object is created and installed as the default.

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

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

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

仔细阅读 javadocs 是值得的。

关于java - 如何更改 JavaMail 端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8771167/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com