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

Фотография

Получение почты с помощью класса 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


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

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