Решил написать о том, как я заавтотестил получение и подтверждение почты при помощи библиотеки 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 «»;
}
}
Ну вот и все.
Привет. на текущий момент с gmail будет работать?
«На многих сайтах регистрация происходит путем получения письма и перехода по активационной ссылке»
По такому вступлению я подумал, пост про то, как сгенерить эту ссылку и послать её пользователю. Но оказывается, он про то, как автоматически читать такие письма (которые нам прислал кто-то другой) и переходить по этим ссылкам. Кому нужно делать это автоматически? Ботоводам, которые сотню аккаунтов в день регают?
Даже не знаю, кажется ботоводы это совсем не про тестирование)