На сайте есть возможность сброса пароля. Хочу написать, с помощью которого будет будет сохраняться новый пароль из письма в переменную, которая будет использоваться в тесте редактирования пароля. Использую JavaMail.
Авторизация к ящику проходит, находит непрочитанное письмо с определенной темой, с помощью getContent() отображает тело сообщения в виде text/html, но не могу понять как зайти в письмо и спарсить оттуда пароль.
import javax.mail.*;
import javax.mail.search.SubjectTerm;
import java.util.Properties;
public class Mail {
//public static String pass = null;
public Message getEmail(String emailID, String password, String subjectToBeSearched) throws Exception {
Properties props = System.getProperties();
props.setProperty("mail.store.protocol", "imaps");
Session session = Session.getDefaultInstance(props, null);
Store store = session.getStore("imaps");
store.connect("imap.gmail.com", emailID, password);
Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_WRITE);
Message[] messages = null;
boolean mailFound = false;
Message email = null;
for (int i = 0; i < 30; i++) {
messages = folder.search(new SubjectTerm(subjectToBeSearched), folder.getMessages());
if (messages.length == 0) {
Thread.sleep(10000);
}
}
for (Message mail : messages) {
if (!mail.isSet(Flags.Flag.SEEN)) {
email = mail;
mailFound = true;
System.out.println("Mail is found");
}
}
System.out.println(email.getContent());
if (!mailFound) {
throw new Exception("Could not found Email");
}
return email;
}
}
Вызываю в юнит-тесте
import org.junit.Test;
public class MailTest {
@Test
public void getEmail() throws Exception {
Mail mail = new Mail();
mail.getEmail("test@gmail.com","1111,"Password reset");
}
}
Так вам текст сообщения вообще известен? Попробуйте просто найти подстроку определённую, например "ваш новый пароль: " ну и после неё и идёт пароль. Понятно что это будет, возможно, с тегами там лишними, ну вырежете их, главное в этом всём ключевые слова найдите. Но лучше же в БД слазить за новым паролем.
Дело в том, что я не заню как написать паттерн чтобы вытащить пароль. Я только начинаю пробовать автоматизировать на java и возникла необходимость поработать с JavaMail чтобы довести тест с ресетом до конца.
Вот какой текст сообщения я получаю через GetContent()
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>PSD2HTML</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<style type="text/css">
.ExternalClass{display:block !important;}
* {
-webkit-text-size-adjust:none;
-webkit-text-resize:100%;
text-resize:100%;
}
</style>
</head>
<body style="margin:0; padding:0;" bgcolor="#ededeb" link="#0086da">
<style type="text/css">
* {
-webkit-text-size-adjust:none;
-webkit-text-resize:100%;
text-resize:100%;
}
</style>
<table width="100%" cellspacing="0" cellpadding="0" bgcolor="#ededeb">
<!--[if IE]>
<tr>
<td align="center">
<table width="609" cellpadding="0" cellspacing="0" border="0" align="center">
<![endif]-->
<!--[if mso]>
<tr>
<td align="center">
<table width="609" cellpadding="0" cellspacing="0" border="0" align="center">
<![endif]-->
<tr>
<td align="center" style="padding-top:47px; padding-bottom:46px; padding-left:5px; padding-right:5px;">
<div style="max-width:599px; margin:0 auto;">
<table width="100%" cellpadding="0" cellspacing="0" align="center" bgcolor="#ffffff" style="border-bottom:1px solid #cdd1d2; margin:0 auto;">
<tr><td colspan="3" height="27" style="line-height:0; font-size:0;"></td></tr>
<tr>
<td width="8%"></td>
<td width="84%">
<table width="100%" cellpadding="0" cellspacing="0">
<tr>
<td style="font:14px Arial, Helvetica, sans-serif; line-height:17px; color:#4c515a;">Hello, </td>
</tr>
<tr><td height="10" style="line-height:0; font-size:0;"></td></tr>
<tr>
<td style="font:14px Arial, Helvetica, sans-serif; line-height:17px; color:#4c515a;"><div style="line-height:10px; width:100%;"><span style="line-height:17px;">We have reset your password. Your login information with the new password is below.</span></div></td>
</tr>
<tr><td height="14" style="line-height:0; font-size:0;"></td></tr>
</table>
</td>
<td width="8%"></td>
</tr>
<tr>
<td colspan="3" bgcolor="#f9f9f9">
<table width="100%" cellpadding="0" cellspacing="0" bgcolor="#f9f9f9">
<tr><td colspan="3" height="16" style="line-height:0; font-size:0;"></td></tr>
<tr>
<td width="8%"></td>
<td width="84%">
<table width="100%" cellpadding="0" cellspacing="0">
<tr>
<td width="78" style="font:14px Arial, Helvetica, sans-serif; line-height:10px; color:#4c515a; text-align:right;"><span style="line-height:17px;"><strong style="color:#000;">Login: </strong></span></td>
<td style="font:14px Arial, Helvetica, sans-serif; line-height:10px; color:#4c515a;"><span style="line-height:17px;">vlada2.aleksandrova@p2h.com</span></td>
</tr>
<tr>
<td width="78" style="font:14px Arial, Helvetica, sans-serif; line-height:10px; color:#4c515a; text-align:right;"><span style="line-height:17px;"><strong style="color:#000;">Password: </strong> </span></td>
<td style="font:14px Arial, Helvetica, sans-serif; line-height:10px; color:#4c515a;"><span style="line-height:17px;">vt22Lzwb</span></td>
</tr>
</table>
</td>
<td width="8%"></td>
</tr>
<tr><td colspan="3" height="14" style="line-height:0; font-size:0;"></td></tr>
</table>
</td>
</tr>
<tr>
<td width="8%"></td>
<td width="84%">
<table width="100%" cellpadding="0" cellspacing="0" style="border-collapse:collapse;">
<tr><td height="15" style="line-height:0; font-size:0;"></td></tr>
<tr>
<td style="font:14px Arial, Helvetica, sans-serif; line-height:17px; color:#4c515a; word-spacing:-1px;"><div style="line-height:10px; width:100%;"><span style="line-height:17px;">You can change your password any time by logging in to <a style="text-decoration:underline; color:#0086da;" href="http://p2h.com/login.html">http://p2h.com/login.html</a>.
</span></div></td>
</tr>
<tr><td height="10" style="line-height:0; font-size:0;"></td></tr>
<tr>
<td style="font:14px Arial, Helvetica, sans-serif; line-height:18px; color:#4c515a;">Yours, <br />The team of PSD2HTML® pros</td>
</tr>
<tr><td height="14" style="line-height:0; font-size:0; border-bottom:2px solid #d6dadc;"></td></tr>
<tr><td height="14" style="line-height:0; font-size:0;"></td></tr>
<tr>
<td style="font:12px Arial, Helvetica, sans-serif; line-height:18px; color:#aeb6ba; padding-bottom:24px;"><div style="line-height:10px; width:100%;"><span style="line-height:18px;">Please do not reply to this email. This mailbox is not monitored and you will not receive a response. For assistance, log in to your account and post your message there.</span></div></td>
</tr>
</table>
</td>
<td width="8%"></td>
</tr>
</table>
</div>
</td>
</tr>
<!--[if mso]></table>
</td>
</tr><![endif]-->
<!--[if IE]></table>
</td>
</tr>
</table>
</td>
</tr><![endif]-->
</table>
</body>
</html>
Господа, все мы можем много чего полезного, красивого, написать. Но давайте всё-таки отталкиваться от простоты и быстроты решения. На мой взгляд, всё-таки достаточно того, что я написал. Какие ваши соображения могут быть в этом плане? Я понимаю, что пароль может быть другой длины, или тест измениться, но и другие решения тогда тоже придётся править. Но тут же вся затея начинающего человека получить быстро пароль, а вы хотите городить кучу кода ради того чтобы загрузить ещё больше человека. Не забываем и про то что наше время стоит денег для работодателя, и я бы посмотрел как вы обоснуете затраты, предположим, в 30 минут, против моих 5 минут. Если вы всё-таки хотите научить и меня как делают правильно и надёжно, я выше написал, давайте реализацию на jsoup, текст сообщения выше представлен.
У меня тут возникла практически схожая задача: аутентификация через письмо.
Выполняется такими же методами, что описаны выше, но насколько проще/эффективнее было бы проводить такую операцию средствами api? И целесообразно ли в рамках теста?
Вы определитесь - сначала вы написали, задача - аутентификация через письмо. Выполняйте тогда эту задачу ))) А если вам надо просто быстро получить новый пароль или проверить что новый пароль есть и т.п., то это лучше делать сразу через БД/api.