Суть задачи.
Нужно организовать проверку успешности доставки активационных ссылок на разные почтовики при автоматической регистрации юзеров на некоем сайте.
Для проверки почты использую 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 продолжают хранить старые значения?