Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Не получается достать пароль из письма JavaMail

java
Теги: #<Tag:0x00007f7b624473e0>

(Влада Нижельская) #1

На сайте есть возможность сброса пароля. Хочу написать, с помощью которого будет будет сохраняться новый пароль из письма в переменную, которая будет использоваться в тесте редактирования пароля. Использую 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");
    }
}

Содержимое письма с типом multipart/RELATED преобразовать в строку
(Vasiliy Rakshin) #2

Так вам текст сообщения вообще известен? Попробуйте просто найти подстроку определённую, например "ваш новый пароль: " ну и после неё и идёт пароль. Понятно что это будет, возможно, с тегами там лишними, ну вырежете их, главное в этом всём ключевые слова найдите. Но лучше же в БД слазить за новым паролем.


(Влада Нижельская) #3

Дело в том, что я не заню как написать паттерн чтобы вытащить пароль. Я только начинаю пробовать автоматизировать на 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:&nbsp;</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:&nbsp;</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&reg; 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>

(Vasiliy Rakshin) #4

ГетКонтент даёт строку, дальше можно её так обработать:

String answ = lalal.GetContent();
String pass = answ.substring(answ.indexOf(">Password:&nbsp;</strong>")).split(";\">")[2].substring(0, 8);


(Влада Нижельская) #5

Спасибо огромное!


(Ruslan Semerenko) #6

Если регулярным выражением, то можно как-то так
(?s)Password.*?>([^<\s]+)<


(Vatslau) #7

на 1 раз норм но,
Jsoup для таких задач обычно юзают


(Vasiliy Rakshin) #8

Сээр. Вы либо распишите более подробно реализацию с jsoup, либо воздерживайтесь от пустого сотрясания воздуха.


(Сергей Кузьмин) #9

@babyroot , @Vlada_Nizhelskaya вы не могли бы показать raw payload to extract good stuff пожалуйста.


(Vasiliy Rakshin) #10

Господа, все мы можем много чего полезного, красивого, написать. Но давайте всё-таки отталкиваться от простоты и быстроты решения. На мой взгляд, всё-таки достаточно того, что я написал. Какие ваши соображения могут быть в этом плане? Я понимаю, что пароль может быть другой длины, или тест измениться, но и другие решения тогда тоже придётся править. Но тут же вся затея начинающего человека получить быстро пароль, а вы хотите городить кучу кода ради того чтобы загрузить ещё больше человека. Не забываем и про то что наше время стоит денег для работодателя, и я бы посмотрел как вы обоснуете затраты, предположим, в 30 минут, против моих 5 минут. Если вы всё-таки хотите научить и меня как делают правильно и надёжно, я выше написал, давайте реализацию на jsoup, текст сообщения выше представлен.


(Сергей Кузьмин) #11

простите слона неприметил :frowning:


(Сергей Кузьмин) #12

вот

doc.select(
				String.format("body table span > strong:contains(%s)", "Password:"));
		assertEquals(1, passwordNodes.size());
System.err.println(String.format("Data: %s", passwordNodes.get(0).text()));

получается

mvn test
Data: Password: FOO BAR

полностью


	private static final String data = ""
			+ "<!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:&nbsp;</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:&nbsp;FOO BAR</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&reg; 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>  ";

	@Test(enabled = true)
	public void testJsoupNavigation() {

		org.jsoup.nodes.Document doc = org.jsoup.Jsoup.parse(data);
		org.jsoup.select.Elements passwordNodes = doc.select(
				String.format("body table span > strong:contains(%s)", "Password:"));
		assertEquals(1, passwordNodes.size());
		System.err.println(String.format("Data: %s", passwordNodes.get(0).text()));

	}


получается

mvn test
Data: Password: FOO BAR

(Vasiliy Rakshin) #13

Так это не тот пароль же. Он в следующем элементе.


(Сергей Кузьмин) #14

ну это ужe сосвем просто

System.err.println(String.format("Data: %s", passwordNodes.get(0).parent().parent().nextElementSibling().text()));

дает

Data: vt22Lzwb

(Vatslau) #15

Велкам)

package tests

import org.junit.jupiter.api.Test
import org.jsoup.Jsoup
import junit.framework.Assert.assertEquals
import java.io.File


class HtmlParsing {

    @Test
    fun testParseCreateResponseOk() {
        val input = File("C:\\template.html")
        val doc = Jsoup.parse(input, "UTF-8", "http://example.com/")
        val result = doc.select("tr:contains(Password:)>td>span").get(1).text()
        assertEquals(result, "vt22Lzwb")
        print(result)
    }
}

(Mr Ds Low) #16

У меня тут возникла практически схожая задача: аутентификация через письмо.
Выполняется такими же методами, что описаны выше, но насколько проще/эффективнее было бы проводить такую операцию средствами api? И целесообразно ли в рамках теста?


(Vasiliy Rakshin) #17

Вы определитесь - сначала вы написали, задача - аутентификация через письмо. Выполняйте тогда эту задачу ))) А если вам надо просто быстро получить новый пароль или проверить что новый пароль есть и т.п., то это лучше делать сразу через БД/api.


(Vatslau) #18

Чем более модульныее тесты тем лучше

  • UI нажать кнопку - проверить что запрос ушёл
  • BD отправить АПИ запрос проверить запись
  • АПИ отправить запрос - проверить письмо
  • Cоздать запись в базе - проверить подходит ли линка с этим кодом-хешем

Нажать конпку - проверить письмо
самый ИМХО не надёжный тест, который не проверяет всю цепочку а только вход и выход