JavamailのAuthenticationFailedException異常
2374 ワード
Javamail受信pop 3プロトコルでメールを受信する場合、Authenicationクラスを作成してユーザー検証情報を保存できます.
次にセッションでこのクラスのインスタンスを使用します
これにより、MyAuthenticatorを使用してユーザーの認証情報を保存できます.
単一のスレッドを使用して実行する場合、上記のコードは正しく実行されるかもしれませんが、マルチスレッド環境では、このコードがAuthenticatioinFailedExceptionを引き起こす可能性があります.
なぜならsessionとpropsは独立したインスタンスではなく、マルチスレッドの場合に相互に影響し合い、特に異なるPOP 3サーバを読み出す場合に
この時、2段目のコードをいくつか変更する必要があります.
新プロパティ()およびセッションgetInstance(props,auth)は、各スレッド間のインスタンスが独立していることを保証し、マルチスレッド実行環境でリソースが衝突しないことを保証し、AutheticationFailedExceptionの発生を回避します.
(指摘と補足を歓迎)
public class MyAuthenticator extends Authenticator {
private String strUser;
private String strPswd;
/**
* Initial the authentication parameters.
*
* @param username
* @param password
*/
public MyAuthenticator(String username, String password) {
this.strUser = username;
this.strPswd = password;
}
/**
* @return
*/
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(strUser, strPswd);
}
}
次にセッションでこのクラスのインスタンスを使用します
Properties props = null;
Session session = null;
props = System.getProperties();
props.put("mail.pop3.host", host);
props.put("mail.pop3.auth", "true");
props.put("mail.pop3.port", port);
Authenticator auth = new MyAuthenticator(userName, password);
session = Session.getDefaultInstance(props, auth);
Store store = session.getStore("pop3");
store.connect();
...
これにより、MyAuthenticatorを使用してユーザーの認証情報を保存できます.
単一のスレッドを使用して実行する場合、上記のコードは正しく実行されるかもしれませんが、マルチスレッド環境では、このコードがAuthenticatioinFailedExceptionを引き起こす可能性があります.
なぜならsessionとpropsは独立したインスタンスではなく、マルチスレッドの場合に相互に影響し合い、特に異なるPOP 3サーバを読み出す場合に
この時、2段目のコードをいくつか変更する必要があります.
Properties props = null;
Session session = null;
// props = System.getProperties();
props = new Properties();
props.put("mail.pop3.host", host);
props.put("mail.pop3.auth", "true");
props.put("mail.pop3.port", port);
Authenticator auth = new MyAuthenticator(userName, password);
// session = Session.getDefaultInstance(props, auth);
session = Session.getInstance(props, auth);
Store store = session.getStore("pop3");
store.connect();
...
新プロパティ()およびセッションgetInstance(props,auth)は、各スレッド間のインスタンスが独立していることを保証し、マルチスレッド実行環境でリソースが衝突しないことを保証し、AutheticationFailedExceptionの発生を回避します.
(指摘と補足を歓迎)