2012-01-07 8 views
13

JavaMailを使用して小さなJavaアプリケーションを作成しています。このJavaMailを使用すると、ユーザーに自動メールが送信されます。彼らは2つのポート(今のところ)25と587の間で選択できます。ポートはGUIのラジオボタンで選択できます。JavaMailポートを変更するには

テストボタンを追加して、ユーザーがメール設定(ポートを含む)をテストできるようにしました。ただし、何らかの理由で、ユーザーがテスト電子メールを送信しようとすると、ポートを変更することはできません。 Javamailは、元のテスト電子メールのポートを常に使用します。

例:ユーザーはポート25で電子メールを送信しようとしますが、JavaMailはポート25で接続できないとします(たとえば、SMTPホストは別のポートを使用します)。ユーザーはポート587をクリックし、新しい電子メールを送信しようとします。 JavaMailはポート25に接続できないというエラーを返します。

私はなぜかそんなに困っています。新しいテスト電子メールが送信されるたびに、まったく新しいSendMailUsingAuthenticationオブジェクトが作成されます。そのクラス内では、プロパティは常に適切なポートにリセットされます。私が見る限り、デバッグするたびに、すべての変数は正しいものであり、正しいポートに関連付けられています。私は行方不明のトランスポートの中に何か起こっていますか?電子メールの送信者クラスで

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

:フロントエンドGUIで

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

答えて

22

あなたはsaysgetDefaultInstance()使用しているので、これが起こる:デフォルトを取得

をセッションオブジェクト。デフォルトがまだ設定されていない場合は、新しいSessionオブジェクトが作成され、デフォルトとしてインストールされます。

そして、Properties引数は、「新しいセッションオブジェクトが作成された場合にのみ使用されます」ということです。

最初にgetDefaultInstanceを呼び出すと、指定したポートが使用されます。その後、Sessionは既に作成されており、その後のgetDefaultInstanceの呼び出しは同じセッションを返し、変更されたプロパティを無視します。

getDefaultInstance()の代わりにSession.getInstance()を使用してください。指定されたプロパティを使用して毎回新しいSessionが作成されます。

非常に注意深くjavadocsを読むことになります。

2

は、私が「Transport.send(MSG)は」文句を言わない、アカウントにあなたのプロパティで提供されている接続の詳細を取ることだと思います。デフォルトで定義されている接続が使用されます。

Javaのドキュメントは送信注作成し、独自の接続を管理する静的メソッドである」

言う。**このメソッドを呼び出すために使用される任意のトランスポートインスタンスに関連付けられている任意の接続は無視され、使用されていません。このメソッドは、Transport.send(msg);の形式でのみ呼び出す必要があり、インスタンス変数を使用して呼び出すことはできません。"**

代わりに、Transport.connect(smtphost、smtpport、user、password)を試してみましたが、かなりうまく動作します。

関連する問題