t.me/atinfo_chat Telegram группа по автоматизации тестирования

Как использовать JavaMail

Проблема.

апример есть обычная форма из 3 инпут-полей:

-email

-тема

-сообщение

 

Заполняешь эти 3 поля, а потом жмешь кнопку "Отправить" и на указанный email приходит сообщение.

Вопрос, как взять текст этого сообщения, не заходя на почту ?

Слышал, что для этого используют JavaMail. У кого-нибудь м.б. есть примеры кода для почты типо @mail.ru и т.п. ?

Использую WebDriver + Junit

 

как вариант

http://www.roseindia.net/software-tutorials/detail/24068

 

и самый популярный

http://bit.ly/PGIQUu

 

з.ы. для этого не нужен ни WD, Ни Junit - надо просто javamail api

1 Симпатия

Привет,

Немогу это назвать проблемой, т.к после того как я разобрался с ним - проблем больше не ощущал... Моя задача состояла в том чтоб взять сабджект и тело письма, проверить на совпадение... 

После нескольких часов поиска в интернете сделал следующий код.

 

Пример как забрать письма с inbox по отправителю и прочитаности:

 public Message[] getMessages(String sFrom, Boolean bSEEN) {

  Message[] messages = null;
 
  try {
   if (!Gmail.folder.isOpen()){
    Gmail.folder.open(Folder.READ_ONLY);
   }
  
   SearchTerm totalTerm = new FromStringTerm(sFrom);
  
   if (bSEEN!=null){
    FlagTerm flagSeen = new FlagTerm(new Flags(Flag.SEEN), bSEEN);
    totalTerm = new AndTerm(flagSeen, totalTerm);
   }
  
   messages = folder.search(totalTerm);
  
  } catch (MessagingException e) {
   e.printStackTrace();
  }

  return messages;
}

Пример как парсить письмо:

public String getMessageFullInfo(Message msg) throws IOException, MessagingException{
String from = InternetAddress.toString(msg.getFrom());
String sBody = null;
if (from != null) {
System.out.println("From: " + from);
}

String replyTo = InternetAddress.toString(msg.getReplyTo());
if (replyTo != null) {
System.out.println("Reply-to: " + replyTo);
}
String to = InternetAddress.toString(msg
.getRecipients(Message.RecipientType.TO));
if (to != null) {
System.out.println("To: " + to);
}

String subject = msg.getSubject();
if (subject != null) {
System.out.println("Subject: " + subject);
}
Date sent = msg.getSentDate();
if (sent != null) {
System.out.println("Sent: " + sent);
}

System.out.println();
System.out.println("Message : ");

try {
Multipart multipart = (Multipart) msg.getContent();
for (int x = 0; x < multipart.getCount(); x++) {
BodyPart bodyPart = multipart.getBodyPart(x);
String sMultiBody=getText(bodyPart);
sBody=sBody+sMultiBody;
}
return sBody;
} catch (ClassCastException e) {
sBody=(String) msg.getContent();
System.out.println(sBody);
return sBody;
}
}

 

 

Пример как парсить письма с несколькими блоками (multiparts):

 private static String getText(Part p) throws MessagingException,

   IOException {
  if (p.isMimeType("text/*")) {
   String s = (String) p.getContent();
   Gmail.textIsHtml = p.isMimeType("text/html");
   return s;
  }
  if (p.isMimeType("APPLICATION/OCTET-STREAM")) {
   System.out.println("Mail have some attachment : ");
   DataHandler handler = p.getDataHandler();
   return "file name : " + handler.getName();
  }

  if (p.isMimeType("multipart/alternative")) {
   // prefer html text over plain text
   Multipart mp = (Multipart) p.getContent();
   ArrayList<String> strOut = new ArrayList<String>();
  
   String text = null;
   for (int i = 0; i < mp.getCount(); i++) {
    Part bp = mp.getBodyPart(i);
    if (bp.isMimeType("text/plain")) {
     if (text == null)
      text = getText(bp);
     strOut.add(text);
    } else if (bp.isMimeType("text/html")) {
     String s = getText(bp);
     if (s != null)
      strOut.add(s);
    } else {
     strOut.add(getText(bp));
    }
   }
   return strOut.toString();
  } else if (p.isMimeType("multipart/*")) {
   Multipart mp = (Multipart) p.getContent();

   for (int i = 0; i < mp.getCount(); i++) {
    String s = getText(mp.getBodyPart(i));
    if (s != null)
     return s;

   }
  }

  return null;
}

 

Удачи!

1 Симпатия

а http://lmgtfy.com это прикольно! :)

1 Симпатия

Привет!

Разбираю эту же тему.

Столкнулся с проблемой, Java mail не хочет конектится к Gmail хосту.

 

StackTrace:

 

[code]java.net.ConnectException: Connection timed out: connect 
at com.sun.mail.pop3.POP3Store.protocolConnect(POP3Store.java:210)
 at javax.mail.Service.connect(Service.java:295)
 at javax.mail.Service.connect(Service.java:176)
 at com.epam.cara.core.mail.ReadMail.getMessages(ReadMail.java:34)
 at com.epam.cara.core.mail.ReadMailTest.testReservation(ReadMailTest.java:15)
 Caused by: java.net.ConnectException: Connection timed out:
 connect at java.net.DualStackPlainSocketImpl.connect0(Native Method)
 at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
 at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
 at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
 at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
 at java.net.PlainSocketImpl.connect(Unknown Source)
 at java.net.SocksSocketImpl.connect(Unknown Source)
 at java.net.Socket.connect(Unknown Source)
 at java.net.Socket.connect(Unknown Source)
 at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:319)
 at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:233)
 at com.sun.mail.pop3.Protocol.<init>(Protocol.java:111)
 at com.sun.mail.pop3.POP3Store.getPort(POP3Store.java:261)
 at com.sun.mail.pop3.POP3Store.protocolConnect(POP3Store.java:206) [/code]

 

Код:

 

[code]package com.epam.cara.core.mail;
 
import java.io.*;
import java.util.*;
import javax.mail.*;
import javax.mail.Flags.Flag;
import javax.mail.search.*;
 
public class ReadMail {
 
private String host = "www.gmail.com";
private String user = "test";
private String password = "password"; 
 
 
public Message[] getMessages(String sFrom, Boolean bSEEN) throws MessagingException, IOException {
 
 Message[] messages = null;
 
// Get system properties 
  Properties properties = System.getProperties(); 
 
 // Get the default Session object.
 Session session = Session.getDefaultInstance(properties);
 
 // Get a Store object that implements the specified protocol.
 Store store = session.getStore("pop3");
 
 //Connect to the current host using the specified username and password.
 store.connect(host, user, password);
 
 //Create a Folder object corresponding to the given name.
 Folder folder = store.getFolder("inbox");
 
 // Open the Folder.
 folder.open(Folder.READ_ONLY);
 
 
 try {
  if (!folder.isOpen()){
   folder.open(Folder.READ_ONLY);
  }
 
  SearchTerm totalTerm = new FromStringTerm(sFrom);
 
  if (bSEEN!=null){
   FlagTerm flagSeen = new FlagTerm(new Flags(Flag.SEEN), bSEEN);
   totalTerm = new AndTerm(flagSeen, totalTerm);
  }
 
  messages = folder.search(totalTerm);
 
 } catch (MessagingException e) {
  e.printStackTrace();
 }
 
 
 
 
 
//  Message[] message = folder.getMessages();
 
 // Display message.
 for (int i = 0; i < messages.length; i++) {
 
 System.out.println("------------ Message " + (i + 1) + " ------------");
 
 System.out.println("SentDate : " + messages[i].getSentDate());
 System.out.println("From : " + messages[i].getFrom()[0]);
 System.out.println("Subject : " + messages[i].getSubject());
 System.out.print("Message : ");
 
 InputStream stream = messages[i].getInputStream();
 while (stream.available() != 0) {
 System.out.print((char) stream.read());
 }
 System.out.println();
 }
 
 folder.close(true);
 store.close();
 
 return messages;
}
 }
[/code]

 

 

 

 
 

Можно еще вопрос, откуда берется класс Gmail?

 if (!Gmail.folder.isOpen()){
    Gmail.folder.open(Folder.READ_ONLY);
   }

 

Gmail - это и есть класс в котором находятся все методы.

 

Относительно вашей проблемы - в Gmail нужно включить доступ РОР3, подробнее - http://support.google.com/mail/bin/answer.py?hl=en&answer=13273

 

1 Симпатия

Включил РОР3 в Gmail и все заработало.

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

Vol, спасибо вам большое. Благодаря вашем методам распарсил нужный мне messages[i] и получил весь текст как и хотел. 

1 Симпатия

Подскажите, делаю как в примере выше, получаю вот такое. Много времени потратил, не могу понять в чем причина.

Exception in thread "main" javax.mail.MessagingException: Connect failed;
  nested exception is:
	java.net.ConnectException: Connection timed out: connect
	at com.sun.mail.pop3.POP3Store.protocolConnect(POP3Store.java:148)
	at javax.mail.Service.connect(Service.java:275)
	at javax.mail.Service.connect(Service.java:156)
	at autotest.appLogic.MailChecker.getMessages(MailChecker.java:37)
	at autotest.appLogic.MailChecker.main(MailChecker.java:16)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)