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

Содержимое письма с типом multipart/RELATED преобразовать в строку

java
testng
Теги: #<Tag:0x00007f7b7054e528> #<Tag:0x00007f7b7054e3e8>

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

Всем привет. Подскажите, как преобразовать тело письма в стркоу для дальнейшего парсинга, если getContentType выдает

multipart/RELATED;
boundary="=swift_v4_1537887900_699eef32ec246c2aac8bf9cdd37225fb="

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");
            }
        }
        /*String content = (String) email.getContent();
        pass = content.substring(content.indexOf("Password:") + 1, content.indexOf("</td>"));
        System.out.println(pass);*/

Вот код получения письма


(Vasiliy Rakshin) #2

Что-то подобное. Надо использовать Multipart.

        StringBuilder mail_mess = new StringBuilder();
	if (message.getContentType().toLowerCase().contains("multipart/")) {
            Multipart mp = (Multipart) message.getContent();
            for (int i=0; i<mp.getCount(); i++){
                Part part = mp.getBodyPart(i);               
                if (part.getContentType().toLowerCase().contains("text/") 
                        && !part.getContentType().toLowerCase().contains("/calendar")) {                    
                    mail_mess.append( (String) part.getContent() );
                }
            }
        }

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

https://coderanch.com/t/619788/java/parser-choose-MIME-multipart-mixed


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

Почему на таком содержимом:

<table width="100%" cellpadding="0" cellspacing="0">
                                            <tr>
                                                <td align="center" height="103" ><a href="https://www.codemyconcept.com/" target="_blank"><img src="cid:16b17ed277eb6fd6a131fcce542a012e@www.codemyconcept.com" border="0" style="vertical-align:top;" width="188" height="47" alt="codemyconcept" /></a></td>
                                            </tr>
                                        </table>
                                    <!--[if gte mso 9]>
                                </v:textbox>
                            </v:rect>
                        <![endif]-->
                    </td>
                </tr>
                <tr>
                    <td class="frame" bgcolor="#ffffff" style="padding:40px 60px 34px;">
                        <table width="100%" cellpadding="0" cellspacing="0">
                            <tr>
                                <td style="padding:0 0 24px; font:14px/24px Verdana, Geneva, sans-serif; color:#333;">
                                        <b>Hello!</b>
    <br />
    A request to reset your password has been made.
                                </td>
                            </tr>
                            <tr>
                                <td class="frame" style="border-radius:14px; border:2px solid #c2d2de; padding:23px 27px 26px;">
                                    <table width="100%" cellpadding="0" cellspacing="0">
                                            <tr>
        <td style="font:14px/24px Verdana, Geneva, sans-serif; color:#333;">Password: e22wwGy5</td>
    </tr>
    <tr>
        <td style="font:14px/24px Verdana, Geneva, sans-serif; color:#3399cc;"><a href="https://www.codemyconcept.com/login" target="_blank" style="text-decoration:none; color:#3399cc;">https://www.codemyconcept.com/login</a></td>
    </tr>
                                    </table>
                                </td>
                            </tr>
                            <tr>
                                <td style="padding:23px 0 14px; border-bottom:2px solid #c2d2de; font:14px/24px Verdana, Geneva, sans-serif; color:#333;">
                                    If you should have problems with the password provided above,<br />please feel free to contact us at <span style="font:14px/24px Verdana, Geneva, sans-serif; text-decoration:none; color:#3399cc;">hello@codemyconcept.com</span> and we will assist you right away!
                                </td>
                            </tr>
                            <tr>

Не отрабатывает

pass = mail_mess.substring(mail_mess.indexOf("Password: "), mail_mess.indexOf("</td>"));
System.out.println(pass);

и не возвращает подстроку пароля?


(Vasiliy Rakshin) #5

Тег </td> ищется для всей строки mail_mess, по этому, лучше разделить на 2 шага - первый взять субстринг начиная с Пассворда, ворой шаг - от того что получилось на первом шаге - искать /td.


#6

может лучше использовать специальные инструменты для работы с html? Например jsoup


(Vasiliy Rakshin) #7

Это обсуждалось тут Не получается достать пароль из письма JavaMail
Влада, просто топиком ошиблась.


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

Да я просто в работе со строками плаваю пока, но вы дали мне хорошую наводку. Вообщем, реализовала так:

String str1 = mail_mess.substring(mail_mess.indexOf("Password: "));
        String str2 = str1.substring(0, str1.indexOf("</td>"));
        String pass = str2.split(" ")[1].substring(0,8);
        System.out.println(pass);

Я теперь поняла, что изначально нужно было во всем mail_mess отсечь лишнее и уже работать со строкой понятной