如何更改JavaMail端口 [英] How to change JavaMail port

查看:115
本文介绍了如何更改JavaMail端口的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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


线程wait = new Thread(new Runnable(){

public void run(){
try {
changeStatusText(发送测试电子邮件...);
notifier.postTestMail();
changeStatusText(发送测试邮件);
} catch(AddressException ex){
changeStatusText );
} 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,测试电子邮件,您的电子邮件设置成功设置,emailFromAddress);
}

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

//设置主机smtp地址
属性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);
验证器auth = new SMTPAuthenticator();
会话session = Session.getDefaultInstance(props,auth);
session.setDebug(false);

//创建消息
消息msg = new MimeMessage(session);

//设置地址
InternetAddress addressFrom = new InternetAddress(from);
msg.setFrom(addressFrom);

InternetAddress [] addressTo = new InternetAddress [recipients.length]; (int i = 0; i< recipients.length; i ++){
addressTo [i] = new InternetAddress(recipients [i]);

}
msg.setRecipients(Message.RecipientType.TO,addressTo);

//设置主题和内容类型
msg.setSubject(subject);
msg.setContent(message,text / plain);
Transport.send(msg);
}


解决方案

使用 getDefaultInstance()其中


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


而且属性参数仅在创建新的Session对象时使用。



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



尝试使用 Session.getInstance()而不是 getDefaultInstance() / code>,每次使用附带的属性创建一个新的会话



它支付仔细阅读javadocs。


I'm writing a small Java app using JavaMail that sends the user an automated email. They can choose between (for now) two ports: 25 and 587. The port can be selected via a radio button on the GUI.

I added a test button to allow the user to test the email settings (including port). However, for some reason, once the user tries to send a test email, the port can't be changed. Javamail will always use the port of the original test email.

Example: User tries to send an email on port 25 and JavaMail says it can not connect on port 25 (for example, the SMTP host uses another port). User clicks port 587, and tries to send a new email. JavaMail throws an error saying it can not connect on port 25, again.

I'm kind of stumped as to why. Every time a new test email is sent an entirely new SendMailUsingAuthentication object is created. Within that class the properties are always reset to the proper port. Whenever I debug, as far as I can see, all variables are correct and associated with the correct port. Is there something going on inside of Transport that I'm missing?

In the front end 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();
}

In the email sender class:

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);
}

解决方案

This happens because you're using getDefaultInstance() which 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.

And that the Properties argument is "used only if a new Session object is created."

So the first time you invoke getDefaultInstance it uses your specified port. After that, the Session has already been created, and subsequent calls to getDefaultInstance will return that same session, and ignore the changed properties.

Try using Session.getInstance() instead of getDefaultInstance(), which creates a new Session each time, using the supplied properties.

It pays to read the javadocs very carefully.

这篇关于如何更改JavaMail端口的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆