如何更改JavaMail端口
我正在使用JavaMail编写一个小型Java应用程序,它向用户发送一封自动电子邮件。他们可以(目前)在两个端口之间选择:25和587。可以通过GUI上的单选按钮选择端口 我添加了一个测试按钮,允许用户测试电子邮件设置(包括端口)。但是,由于某些原因,一旦用户尝试发送测试电子邮件,端口就无法更改。Javamail将始终使用原始测试电子邮件的端口 示例:用户尝试在端口25上发送电子邮件,JavaMail表示无法在端口25上连接(例如,SMTP主机使用另一个端口)。用户单击端口587,并尝试发送新电子邮件。JavaMail再次抛出一个错误,表示无法连接端口25 我有点不明白为什么。每次发送新的测试电子邮件时,都会创建一个全新的SendMailUsingAuthentication对象。在该类中,属性总是重置为正确的端口。无论何时调试,就我所见,所有变量都是正确的,并且与正确的端口相关联。运输车里有什么我不知道的吗 在前端GUI中:如何更改JavaMail端口,java,email,smtp,jakarta-mail,Java,Email,Smtp,Jakarta Mail,我正在使用JavaMail编写一个小型Java应用程序,它向用户发送一封自动电子邮件。他们可以(目前)在两个端口之间选择:25和587。可以通过GUI上的单选按钮选择端口 我添加了一个测试按钮,允许用户测试电子邮件设置(包括端口)。但是,由于某些原因,一旦用户尝试发送测试电子邮件,端口就无法更改。Javamail将始终使用原始测试电子邮件的端口 示例:用户尝试在端口25上发送电子邮件,JavaMail表示无法在端口25上连接(例如,SMTP主机使用另一个端口)。用户单击端口587,并尝试发送新电
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);
}
public void postTestMail()抛出MessagineException,AddressException{
String[]TestReceiver=新字符串[1];
TestReceiver[0]=电子邮件列表[0];
postMail(TestReceiver,“测试电子邮件”,“您的电子邮件设置已成功设置”,“emailFromAddress”);
}
私有无效邮政邮件(字符串收件人[],字符串主题,
字符串消息,字符串来自)引发MessaginException,AddressException{
//设置主机smtp地址
Properties props=新属性();
props.put(“mail.smtp.port”,smtpPort);
put(“mail.smtp.host”,smtpHostName);
props.put(“mail.smtp.auth”,“true”);
put(“mail.smtp.starttls.enable”,true);
Authenticator auth=新的SMTPAuthenticator();
Session Session=Session.getDefaultInstance(props,auth);
session.setDebug(false);
//创建消息
Message msg=新的mimessage(会话);
//设置发件人和收件人地址
InternetAddress addressFrom=新的InternetAddress(from);
msg.setFrom(addressFrom);
InternetAddress[]addressTo=新的InternetAddress[recipients.length];
for(int i=0;i
发生这种情况是因为您正在使用getDefaultInstance()
它:
获取默认会话对象。如果尚未设置默认值,则会创建一个新的会话对象并作为默认值安装
并且Properties
参数“仅在创建新会话对象时使用。”
因此,第一次调用getDefaultInstance
时,它将使用指定的端口。之后,已经创建了会话
,对getDefaultInstance
的后续调用将返回相同的会话,并忽略更改的属性
尝试使用Session.getInstance()
而不是getDefaultInstance()
,每次都使用提供的属性创建一个新的会话
仔细阅读javadocs是值得的。请比较会话类的两种方法:我认为“Transport.send(msg)”不会考虑您在属性中提供的连接细节。它将使用默认定义的连接
java文档说
“请注意,send是一个静态方法,它创建并管理自己的连接。**与用于调用此方法的任何传输实例关联的任何连接都将被忽略且不被使用。此方法只能使用Transport.send(msg);”形式调用,而决不能使用实例变量调用。”**
相反,我尝试了Transport.connect(smtphost、smtpport、user、password),效果非常好 提示对于仍有问题的任何其他人,我们使用的是会话.getInstance
,端口仍默认为25
事实证明,我们将prop值设置为Long
,而它需要是字符串
它没有错误、警告或日志,只是默认值为25。我想对此进行十次更新投票。我最初阅读的是一个道具文件,所有的电子邮件参数都是字符串——我的电子邮件在587端口发送的很好。实现被更改为使用一个对象,该对象将端口指定为int,并且电子邮件停止工作-默认为端口25。使用字符串!!!