Суть задачи.
Нужно организовать проверку успешности доставки активационных ссылок на разные почтовики при автоматической регистрации юзеров на некоем сайте.
Для проверки почты использую java класс JavaMail
Для этого в проекте создал класс Mail.java:
package com.core;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Store;
public class Mail {
private String activationLink = null; // Ссылка на активацию нового юзера
public String ReceiveLastEmailWithActivationLink(String email, String passwordForEmail, String host, String provider) throws Exception {
Properties props = new Properties();
Session session = Session.getDefaultInstance(props, new MailAuth(email, passwordForEmail));
Store store = session.getStore(provider);
store.connect(host, null, null);
Folder inbox = store.getFolder("INBOX");
if (inbox == null) {
System.out.println("No INBOX");
System.exit(1);
}
inbox.open(Folder.READ_ONLY);
Message[] messages = inbox.getMessages(); //Получение всех сообщений в папке "Входящие"
for (int i = 0; i < messages.length; i++) {
String subject = messages[i].getSubject().toString().toLowerCase().trim(); //Получение темы письма
String letterConfirmationSubject = "подтверждение регистрации на сайте"; //Тема письма которое содержит активационную ссылку
//Выбор нужного письма
if (!subject.equals(letterConfirmationSubject)) {
System.err.println("Сообщение пропущено, т.к. не является активационным письмом.......");
continue;
}
System.out.println("Сообщение принято к обработке");
Object contentMessage = messages[i].getContent();
String content = contentMessage.toString();
//Проверка наличия активационной ссылки в теле письма
CharSequence searchPhrase = "http://www.someSite.ua/user/confirm/";
if (content.contains(searchPhrase)) {
System.out.println("ОК.Письмо содержит активационную ссылку.");
} else {
System.err.println("!!!===SHIT!Письмо не содержит активационную ссылку===!!!");
continue;
}
int indexOf = content.lastIndexOf("http://www.someSite.ua/user/confirm/");
int lastIndexOf = content.lastIndexOf("--");
//Получение из тела письма активационной ссылки
this.activationLink = content.substring(indexOf, lastIndexOf).trim();
}
inbox.close(false);
store.close();
return activationLink;
}
/*-------------------------------------------------------------------------------------------------------*/
class MailAuth extends Authenticator {
private String email; //Инициализируем поле в котором хранится значение емейла
private String password; // Инициализируем поле в котором хранится значение пароля
MailAuth(String email, String password) {
this.email = email;
this.password = password;
}
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(email, password);
}
}
}
Получаю емейл так:
/*------------------------------------------------------------------------------------------------------------
Получем почту с заданного почтовика
------------------------------------------------------------------------------------------------------------*/
public void checkActivationLink(String email, String passwordForEmail, String host_email, String provider, String stepNumberAndShortDescription) throws Exception {
Mail Mail = new Mail();
String activationLink = Mail.ReceiveLastEmailWithActivationLink(email, passwordForEmail, host_email, provider);
Assert.assertTrue(!activationLink.isEmpty());
this.setUp(stepNumberAndShortDescription);
selenium.setContext("activationLink= " + activationLink);
System.out.println("activationLink= " + activationLink);
//Проверка наличия на странице активации нового юзера сообщения об успешной активации нового юзера
My.openTry(activationLink, selenium);
Assert.assertTrue(selenium.isElementPresent("//div[@class='message success txtC']"));
selenium.setContext("Письмо со ссылкой на активацию успешно получено. Юзер активирован.");
}
/*------------------------------------------------------------------------------------------------------------
Получение почты для бигмировского юзера
------------------------------------------------------------------------------------------------------------*/
@Test(alwaysRun = true)
public void checkBigMir() throws Exception {
String email = V.emailUserBigMir;
String passwordForEmail = V.passwordForEmailUserBigMir;
String host_email = V.host_emailUserBigMir;
String provider = V.providerUserBigMir;
String stepNumberAndShortDescription = "Проверка доставки письма бигмировскому юзеру";
this.checkActivationLink(email, passwordForEmail, host_email, provider, stepNumberAndShortDescription);
}
Так вот.
Данный код отлично работает, письмо об активации успешно получаю.
Но!
Хочу зарегистрировать пачкой 10 юзеров, например, а потом проверить доставку активационной ссылки десятерым юзерам.
И вот, когда происходит вызов метода ReceiveLastEmailWithActivationLink - то во второй раз(третий, четвертый, и т.д.) соединение инициализируется не с новым набором данных, а с теми данными, которыми вначале был проинициализирован класс MailAuth.
Заметил, что:
class MailAuth extends Authenticator {
private String email;
private String password;
!!! При каждом последующем вызове метода MailAuth поля класса email и password принимают новые значения !!!
MailAuth(String email, String password) {
this.email = email;
this.password = password;
!!! При каждом последующем вызове метода MailAuth переменные email и password принимают новые значения !!!
}
public PasswordAuthentication getPasswordAuthentication() {
!!! А вот здесь email и password ВСЕГДА хранят СТАРЫЕ значения !!!
return new PasswordAuthentication(email, password);
}
}
}
Вопрос:
Почему переменные метода getPasswordAuthentication() email и password при каждом следующем вызове метода MailAuth продолжают хранить старые значения?

