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

Помогите разобраться с проблемой получения ссылки из письма


(Eugeniylennik) #1

Здравствуйте!

Проведя много времени в поиске решения своей проблемы так и не нашел решения. В общем проблема следующая:
Есть веб приложение, где можно отправлять приглашения к работе над проектами, т.е стандартная форма заполнения данных включая почту куда будет отправлено письмо. И вот стоит задача покрыть авто тестами этот функционал. Изначально думал делать это все на selenium’e после отправки приглашения открывать новый инстанст браузера, заходить на почтовый сервис куда будет отправлено приглашение и там производить манипуляции по поиску и открытию письма и нажатию на кнопку инвайта. Понял что это немного туговатый процесс и нашел решение для своей задачи это использовать библиотеку JavaMail для получения писем. Т.е коннектимся к почтовому сервису в данном примере я использую Gmail и получаем от туда все письма.

import java.util.Properties;

public class PropertiesEmail {

String host = "imap.gmail.com";
String user = "userEmail";
String password = "password";
int port = 993;

public Properties setServerProperties(){
    Properties properties = new Properties();
    properties.put("mail.imap.host", host);
    properties.put("mail.imap.port", port);
    properties.put("mail.imap.starttls.enable", "true");
    properties.put("mail.store.protocol", "imaps");
    return properties;
}

}

import javax.mail.*;
import javax.mail.search.FlagTerm;
import java.util.Properties;

public class CheckUnreadEmail {

public static void checkUnreadEmail(){

    try{

        //Create object email properties
        PropertiesEmail propertiesEmail = new PropertiesEmail();

        //Set email server properties
        Properties props = propertiesEmail.setServerProperties();

        Session session = Session.getDefaultInstance(props);

        Store store = session.getStore();

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

        //Create the folder object and open it
        Folder folder = store.getFolder("INBOX");
        folder.open(Folder.READ_WRITE);

        //Total unread messages
        System.out.println("Total messages: " + folder.getMessageCount());
        System.out.println("Unread messages: " + folder.getUnreadMessageCount());


        //Create variable for search unread message
        FlagTerm flag = new FlagTerm(new Flags(Flags.Flag.SEEN), false);

        //Retrieve all messages
        //Message [] messages = folder.getMessages();

        //Retrieve unread messages from the folder INBOX
        Message [] unreadMessage = folder.search(flag);

        for (int i = 0, n = unreadMessage.length; i < n; i++){
            Message message = unreadMessage[i];
            System.out.println("--------------");
            System.out.println("Subject: " + message.getSubject());
        }

        //folder.setFlags(unreadMessage, new Flags(Flags.Flag.SEEN), true);

        //close the store and folder objects
        folder.close(false);
        store.close();

    }catch(Exception e){
        e.printStackTrace();
    }

}

}

Имеется несколько вопросов:

  1. Как дождаться появления письма на почте? (т.к после отправки приглашения письмо приходит не сразу)
  2. Как распарсить полученное письма и вытащить от туда ссылку на инвайт?

(rmerkushin) #2

Поставьте какой нибудь mailcatcher или любую другую заглушку для почты. На Python smtp заглушка пишется в пару строк. Можно заставить Ее сохранять сообщения хоть в txt хоть в json или xml
P.S.: посмотрите на https://github.com/mailhog/MailHog/blob/master/README.md


(Sergey Korol) #3

Работать с реальными почтовыми клиентами не рекомендовал бы. Как уже отметили выше, проще поднять фейковый smtp для тестовых целей.

К слову, вот REST client под MailCatcher. Правда он писался еще на Java 7, так что feel free пропатчить его под восьмерку. :wink: