read

Не так давно, в рамках одного тестового задания мне потребовалось организовать автоматизированную проверку для UI электронной почты.

Одна из основных проблем заключалась в том, как собственно наполнить ящик нужным мне количеством данных(писем) для дальнейшего использования в тестах.

Варианты были разной степени глупости:

  • создавать их через UI
  • отправлять самому себе опять же через UI
  • отправлять себе по SMTP

Но всё это неправильно по разным очевидным причинам, одна самая важная из которых: слишком много лишних действий и непредсказуемость результата.

Моё итоговое решение основывается на последнем пункте списка глупостей, только мы будет не отправлять себе письма через SMTP, а создавать их через IMAP.

Для этого нам потребуется пакет JavaMai.

Если наш проект собирается через Maven, то в pom.xml добавляем следующие зависимости:

<dependencies>

<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>

<dependency>
<groupId>javax.mail</groupId>
<artifactId>javax.mail-api</artifactId>
<version>1.5.2</version>
</dependency>

</dependencies>

После этого можно работать с JavaMail.

Для начала задаем настройки соединения:

    Properties props = new Properties(); 
    props.setProperty("mail.store.protocol", "imaps"); 
    props.setProperty("mail.imaps.host", "imap.example.com"); //imap server adress
    props.setProperty("mail.imaps.port", "993"); // imap server port

Теперь собственно соединяемся:

        Session session = Session.getInstance(props, null);
        Store store = session.getStore();
        store.connect("mylogin@example.com", "mypassword"); //set login/pass here

Далее можно непосредственно работать с папками и почтой.

Допустим берем “Входящие”:

Folder inbox = store.getFolder("Inbox");

Для работы с папкой требуется открыть её с нужным флагом (на чтение и запись):

inbox.open(Folder.READ_WRITE);

Допустим нам надо сначала очистить папку. Но нельзя просто взять и удалить письмо, для этого каждому письму нужно выставить флаг DELETED и тогда сервер произведет удаление.

Для удаления всех писем в папке folder можно использовать метод принимающий на вход нужну папку и делающий всю работу:

 /**
 * Delete all mail in folder
 * @param folder folder to clean
 */
public static void deleteAllMailIn(Folder folder){
    try {
        folder.open(Folder.READ_WRITE);
        Message[] messageList = folder.getMessages();
        for (Message m : messageList) {
            m.setFlag(Flags.Flag.DELETED, true);
        }
        folder.close(true);
    } catch (MessagingException e) {
        e.printStackTrace();
    }
}

Очистив входящие можно приступить к нужному наполнению.

Для этого создадит сообщение, используя session который был выше:

MimeMessage testMessage = new MimeMessage(session);
testMessage.setFrom(new InternetAddress("test@test.ru")); //FROM adress
testMessage.addRecipient(Message.RecipientType.TO, new InternetAddress("test@test.ru")); //TO adress
String emailBody = "Test email"; //Some message text
testMessage.setContent(emailBody, "text/html");
testMessage.setSubject("This is test message"); //Subject

Собственно теперь нужно поместить это сообщение в папку “Inbox”. Для этого существует метод appendMessages().

Принцип использования такой же как и при удалении: сначала открываем папку, выставляем для нее доступ, потом добавляем туда сообщение.

Пример:

inbox.open(Folder.READ_WRITE);
inbox.appendMessages(new Message[]{testMessage});

На этом всё.

Готовый класс целиком:

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;

public class Mailer {

public static void main(String[] args) {
    cleanInboxAndGenerateTestMailForUser("me@test.com", "mypassword");
}

public static void cleanInboxAndGenerateTestMailForUser(String login, String password){

    Properties props = new Properties();
    props.setProperty("mail.store.protocol", "imaps");
    props.setProperty("mail.imaps.host", "imap.example.com");
    props.setProperty("mail.imaps.port", "993");

    try {
        Session session = Session.getInstance(props, null);
        Store store = session.getStore();
        store.connect(login, password);
        Folder inbox = store.getFolder("Inbox"); //Get Inbox folder
        deleteAllMailIn(inbox); //Delete all mail in folder

        inbox.open(Folder.READ_WRITE);
        MimeMessage testMessage = new MimeMessage(session); //Create test message
        testMessage.setFrom(new InternetAddress("test@test.ru")); //set FROM adress
        testMessage.addRecipient(Message.RecipientType.TO, new InternetAddress("test@example.com")); //set TO adress

        String emailBody = "Test email"; //set TEXT
        testMessage.setContent(emailBody, "text/html");
        testMessage.setSubject("This is test message"); //set SUBJECT
        
        inbox.appendMessages(new Message[]{testMessage}); //add message to folder

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

/**
 * Delete all mail in folder
 * @param folder folder to clean
 */
public static void deleteAllMailIn(Folder folder){
    try {
        folder.open(Folder.READ_WRITE);
        Message[] messageList = folder.getMessages();
        for (Message m : messageList) {
            m.setFlag(Flags.Flag.DELETED, true);
        }
        folder.close(true);
    } catch (MessagingException e) {
        e.printStackTrace();
    }
}
}
Blog Logo

Keiga


Published

Image

Imagine Any Title Here

Personal notes about video games and other stuff

Back to Overview