Перейти к содержимому

Программирование на C# для тестировщиков
онлайн, начало 14 мая
Первый Онлайн ИНститут Тестировщиков
онлайн, начало 18 мая
SQL для тестировщиков
онлайн, начало 17 мая
Английский для тестировщиков
онлайн, начало 17 мая
Фотография

Получение почты с помощью класса JavaMail


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 12

#1 itesterok

itesterok

    Новый участник

  • Members
  • Pip
  • 9 сообщений
  • ФИО:Тестер

Отправлено 11 апреля 2012 - 14:40

Приветствую.

Суть задачи.
Нужно организовать проверку успешности доставки активационных ссылок на разные почтовики при автоматической регистрации юзеров на некоем сайте.

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

  • 0

#2 D2Phoenix

D2Phoenix

    Постоянный участник

  • Members
  • PipPipPip
  • 200 сообщений
  • ФИО:Чадюк Вадим
  • Город:Гродно


Отправлено 11 апреля 2012 - 14:53

А как вы пытаетесь сделать проверку для 10 юзеров???
В вашем примере этого не видно...
И как бы

public PasswordAuthentication getPasswordAuthentication() { 
                        String email = this.email;
                        String password = this.password;
                        return new PasswordAuthentication(email, password);
}

тоже самое что

public PasswordAuthentication getPasswordAuthentication() {
       return new PasswordAuthentication(email, password);
}

  • 0

#3 itesterok

itesterok

    Новый участник

  • Members
  • Pip
  • 9 сообщений
  • ФИО:Тестер

Отправлено 11 апреля 2012 - 15:05

А как вы пытаетесь сделать проверку для 10 юзеров???
В вашем примере этого не видно...

По аналогии с проверкой бигмировской почты:
/*------------------------------------------------------------------------------------------------------------
Получение почты для бигмировского юзера
------------------------------------------------------------------------------------------------------------*/
	@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);
	}
	

/*------------------------------------------------------------------------------------------------------------
Получение почты для гмейловского юзера
------------------------------------------------------------------------------------------------------------*/
	@Test(alwaysRun = true)
	public void checkGmail() throws Exception {
			
		String email = V.emailUserGmail;
		String passwordForEmail = V.passwordForEmailUserGmail;
		String host_email = V.host_emailUserGmail;
		String provider = V.providerUserGmail;
		
		String stepNumberAndShortDescription = "Проверка доставки письма гмейловскому юзеру";
		
		this.checkActivationLink(email, passwordForEmail, host_email, provider, stepNumberAndShortDescription);
	}	
И так далее. Каждый из этих методов вызывает метод checkActivationLink() только со своим набором значений.

И как бы

public PasswordAuthentication getPasswordAuthentication() { 
                        String email = this.email;
                        String password = this.password;
                        return new PasswordAuthentication(email, password);
}

тоже самое что

public PasswordAuthentication getPasswordAuthentication() {
       return new PasswordAuthentication(email, password);
}


Естественно.
Поправил в примере чтоб не уводило от сути проблемы.
  • 0

#4 D2Phoenix

D2Phoenix

    Постоянный участник

  • Members
  • PipPipPip
  • 200 сообщений
  • ФИО:Чадюк Вадим
  • Город:Гродно


Отправлено 11 апреля 2012 - 15:31

сделайте дебаг и посмотрите на каком моменте неверные данные передаются. Вечером буду дома посмотрю что к чему, если раньше никто ответа не найдёт
Update Перечитал пост) я так понял вы дебагом выяснили где проблема)
  • 0

#5 itesterok

itesterok

    Новый участник

  • Members
  • Pip
  • 9 сообщений
  • ФИО:Тестер

Отправлено 11 апреля 2012 - 21:41

Update Перечитал пост) я так понял вы дебагом выяснили где проблема)


Проблема находится в том, что переменные метода getPasswordAuthentication() email и password при каждом следующем вызове метода 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 продолжают хранить старые значения?" ответ не получен.
  • 0

#6 D2Phoenix

D2Phoenix

    Постоянный участник

  • Members
  • PipPipPip
  • 200 сообщений
  • ФИО:Чадюк Вадим
  • Город:Гродно


Отправлено 12 апреля 2012 - 07:06

Вот так нужно новую сессию создавать:
Session session = Session.getInstance( props, new MailAuth(email, passwordForEmail) );
а не так:
Session session = Session.getDefaultInstance(props, new MailAuth(email, passwordForEmail));

  • 1

#7 itesterok

itesterok

    Новый участник

  • Members
  • Pip
  • 9 сообщений
  • ФИО:Тестер

Отправлено 12 апреля 2012 - 09:27

Вот так нужно новую сессию создавать:


Спасибо огромнейшее :-)
Всё работает наилучшим образом!
  • 0

#8 prostooleg1

prostooleg1

    Активный участник

  • Members
  • PipPip
  • 94 сообщений
  • Город:Москва


Отправлено 13 марта 2013 - 15:44

Коллеги, у меня сейчас подобная проблема. Мне необходимо получать почту, переходить по ссылке из этой почты и убеждаться что все хорошо. Есть у вас готовая реализация для какого нить почтовика, яндекс, мейл и т д, скиньте плиз если есть пример с конкретным мылом.
  • 0

#9 prostooleg1

prostooleg1

    Активный участник

  • Members
  • PipPip
  • 94 сообщений
  • Город:Москва


Отправлено 14 марта 2013 - 17:18

Вообщем разобрался. itesterok спасибо большое за пример, почти что сделал наподобие как у вас.
  • 0

#10 prostooleg1

prostooleg1

    Активный участник

  • Members
  • PipPip
  • 94 сообщений
  • Город:Москва


Отправлено 15 марта 2013 - 17:42

Черт, строчки:
Object contentMessage = messages[i].getContent();
String content = contentMessage.toString();

на почтах gmail, mail у меня возвращают javax.mail.internet.MimeMultipart@e9733fa, а должен я как я понимаю возвращать все таки текст самого письма. До этих строчек код работает прекрасно, возвращает темы письма, получает нужную мне тему, а вот уже само тело письма возвращает в виде javax.mail.internet.MimeMultipart@e9733fa

Сама строчка Object contentMessage = messages[i].getContent(); возвращает кучу параметров и как оттуда дернуть текст письма, ума не приложу.
http://prntscr.com/wfbs2

Как я понимаю у автора почта на бигмире и возможно там действительно возвращается текст письма, попоробую зарегать почту там.

Пробовал такую штуку
MimeMultipart contentMessage = (MimeMultipart) messages[i].getContent();
String content = contentMessage.toString();
Все то же самое. ,
Коллеги, кто из вас делал принятие почты при помощи javamail с почтовиков mail, yandex, gmail, подскажите плиз.
  • 0

#11 prostooleg1

prostooleg1

    Активный участник

  • Members
  • PipPip
  • 94 сообщений
  • Город:Москва


Отправлено 17 марта 2013 - 09:12

Нашел решение тут. Методом getMessageFullInfo(messages[i]) получил весь текст письма.
  • 0

#12 mipars

mipars

    Новый участник

  • Members
  • Pip
  • 46 сообщений

Отправлено 20 июня 2014 - 14:27

this.setUp(stepNumberAndShortDescription);

 

А что за метод setUP?


  • 0

#13 mipars

mipars

    Новый участник

  • Members
  • Pip
  • 46 сообщений

Отправлено 27 июня 2014 - 11:55

Никто не знает?


  • 0


Selenium 2.0: стартовый уровень
онлайн
Программирование на Java для тестировщиков
онлайн
Автоматизация функционального тестирования
онлайн
Selenium WebDriver: полное руководство
онлайн



Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных

Яндекс.Метрика
Реклама на портале