Получение и подтверждение почты при помощи Java Mail

Решил написать о том, как я заавтотестил получение и подтверждение почты при помощи библиотеки Java Mail. Наверняка многим пригодится.

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

Помогли мне для этот следующие ссылки:

Получение почты при помощи JavaMail

Где я стырил реализацию, как вообще получать нужное мне письмо при помощи javamail, с любого почтовика

Как использовать JavaMail  —  где я стырил реализацию, как мне распарсить письмо, если оно html-ое, ну и потом соответственно вытащить мне нужную ссылку для подтверждения.

Спасибо авторам.

О структуре своих автотестов я писал тут. Писать про это здесь не буду. Для работы с библиотекой Java Mail, необходимо  по ссылке http://www.oracle.com/technetwork/java/javamail/index-138643.html скачать jar-ники pop3.jar и mail.jar так как нам нужно  только принимать почту используя Java Mail.

/**

* @param user почтовый логин ([email protected])

* @param password пароль от почтового логина

* @param sbj заголовок письма, по которому будем искать письмо

* @return распарсенный текст нужного письма

*/

public String getNewMailTest(String user, String password, String subjectFind) throws MessagingException, IOException, InterruptedException {

String link = null;

Properties props = System.getProperties();

Session session = Session.getDefaultInstance(props);

 

/*Здесь я домен почтового аккаунта подставляю  в хост. [email protected] = pop.inbox.ru */

String host=null;

Pattern regex = Pattern.compile(«\\@\\w+\\.»);

Matcher matcher = regex.matcher(user);

if (matcher.find()) {

host = matcher.group().replaceAll(«\\@», «»).replaceAll(«\\.», «»);

} else {

Assert.fail();

}

host = «pop.»+host+».ru»;

/*конекчусь в почтовик*/

Store store = session.getStore(«pop3»);

store.connect(host, 110, user, password);

Folder folder = store.getFolder(«INBOX»);

folder.open(Folder.READ_ONLY);

 

Message[] messages = folder.getMessages();

 

// Получить каталог

for (int i = 0; i < messages.length; i++) {

String subject = messages[i].getSubject().toString().toLowerCase().trim(); //Получение темы письма

subjectFind = subjectFind.toLowerCase().trim();

 

//Выбор нужного письма

if (!subject.equals(subjectFind)) {

System.err.println(«Сообщение пропущено, т.к. не является активационным письмом…….»);

continue;

}

 

/*Парсю нужное мне письмо, метод getMessageFullInfo описан ниже*/

link =  getMessageFullInfo(messages[i]);

/*Чищу за собой удалю нужное мне письмо*/

messages[i].setFlag(Flag.DELETED, true);

folder.close(false);

 

store.close();

return link;

}

return link;

}

 

Далее описаны методы, которые парсят html письмо.

public String getMessageFullInfo(Message msg) throws IOException, MessagingException{

String sBody = null;

try {

Multipart multipart = (Multipart) msg.getContent();

for (int x = 0; x < multipart.getCount(); x++) {

BodyPart bodyPart = multipart.getBodyPart(x);

String sMultiBody=getText(bodyPart);

sBody=sBody+sMultiBody;

}

return sBody;

}

catch (ClassCastException e) {

sBody=(String) msg.getContent();

return sBody;

}

}

 

private static String getText(Part p) throws MessagingException, IOException {

if (p.isMimeType(«text/*»)) {

String s = (String) p.getContent();

return s;

}

if (p.isMimeType(«APPLICATION/OCTET-STREAM»)) {

System.out.println(«Mail have some attachment : «);

DataHandler handler = p.getDataHandler();

return «file name : » + handler.getName();

}

if (p.isMimeType(«multipart/alternative»)) {

// prefer html text over plain text

Multipart mp = (Multipart) p.getContent();

ArrayList<String> strOut = new ArrayList<String>();

String text = null;

for (int i = 0; i < mp.getCount(); i++) {

Part bp = mp.getBodyPart(i);

if (bp.isMimeType(«text/plain»)) {

if (text == null) text = getText(bp);

strOut.add(text);

} else if (bp.isMimeType(«text/html»)) {

String s = getText(bp);

if (s != null) strOut.add(s);

} else {

strOut.add(getText(bp));

}

}

return strOut.toString();

} else if (p.isMimeType(«multipart/*»)) {

Multipart mp = (Multipart) p.getContent();

for (int i = 0; i < mp.getCount(); i++) {

String s = getText(mp.getBodyPart(i));

if (s != null) return s;

}

}

return null;

}

 

 

Ну и сам автотест выглядит так:

/*Авторизуемся под [email protected] 123, достаем письмо с нужным заголовком, распарсиваем его из html в текст*/

String subject = «Нужный нам заголовок»;

String link =  app.getMailHelper().getNewMailTest(«[email protected]», «123», subject);

 

/*Достаем из письма нужную нам активационную ссылку */

String confirmationLink = app.getMailHelper().getConfirmationLink(link);

 

Метод getConfirmationLink() у меня выглядит так:

 

/*Регуляркой достаю нужную мне ссылку*/

public String getConfirmationLink(String text) {

String domenStr = getDomen();

Pattern regex = Pattern.compile(«http://(www\\.)?site.ru»+domenStr+»\\/tips\\/\\?[\\w+\\=\\&]+»);

Matcher matcher = regex.matcher(text);

if (matcher.find()) {

return matcher.group();

} else {

return «»;

}

}

 

Ну вот и все.

Понравилась статья? Поделиться с друзьями:
Комментарии: 3
  1. repon

    Привет. на текущий момент с gmail будет работать?

  2. Андерс

    «На многих сайтах регистрация происходит путем получения письма и перехода по активационной ссылке»
    По такому вступлению я подумал, пост про то, как сгенерить эту ссылку и послать её пользователю. Но оказывается, он про то, как автоматически читать такие письма (которые нам прислал кто-то другой) и переходить по этим ссылкам. Кому нужно делать это автоматически? Ботоводам, которые сотню аккаунтов в день регают?

    1. Олег (автор)

      Даже не знаю, кажется ботоводы это совсем не про тестирование)

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.