В предыдущей главе мы узнали, как проверять электронную почту. Теперь давайте посмотрим, как получить каждое письмо и прочитать его содержимое. Давайте напишем Java-класс FetchingEmail, который будет читать следующие типы электронных писем:
-
Простая электронная почта
-
Электронная почта с приложением
-
Электронная почта со встроенным изображением
Простая электронная почта
Электронная почта с приложением
Электронная почта со встроенным изображением
Основные шаги в коде приведены ниже:
-
Получить объект Session.
-
Создайте объект магазина POP3 и подключитесь к магазину.
-
Создайте объект Папка и откройте соответствующую папку в вашем почтовом ящике.
-
Получать сообщения.
-
Закройте папку и сохраните объекты соответственно.
Получить объект Session.
Создайте объект магазина POP3 и подключитесь к магазину.
Создайте объект Папка и откройте соответствующую папку в вашем почтовом ящике.
Получать сообщения.
Закройте папку и сохраните объекты соответственно.
Создать класс Java
Создайте Java. Создайте файл класса Java FetchingEmail , содержимое которого приведено ниже:
package com.tutorialspoint; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Date; import java.util.Properties; import javax.mail.Address; import javax.mail.Folder; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.NoSuchProviderException; import javax.mail.Part; import javax.mail.Session; import javax.mail.Store; public class FetchingEmail { public static void fetch(String pop3Host, String storeType, String user, String password) { try { // create properties field Properties properties = new Properties(); properties.put("mail.store.protocol", "pop3"); properties.put("mail.pop3.host", pop3Host); properties.put("mail.pop3.port", "995"); properties.put("mail.pop3.starttls.enable", "true"); Session emailSession = Session.getDefaultInstance(properties); // emailSession.setDebug(true); // create the POP3 store object and connect with the pop server Store store = emailSession.getStore("pop3s"); store.connect(pop3Host, user, password); // create the folder object and open it Folder emailFolder = store.getFolder("INBOX"); emailFolder.open(Folder.READ_ONLY); BufferedReader reader = new BufferedReader(new InputStreamReader( System.in)); // retrieve the messages from the folder in an array and print it Message[] messages = emailFolder.getMessages(); System.out.println("messages.length---" + messages.length); for (int i = 0; i < messages.length; i++) { Message message = messages[i]; System.out.println("---------------------------------"); writePart(message); String line = reader.readLine(); if ("YES".equals(line)) { message.writeTo(System.out); } else if ("QUIT".equals(line)) { break; } } // close the store and folder objects emailFolder.close(false); store.close(); } catch (NoSuchProviderException e) { e.printStackTrace(); } catch (MessagingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { String host = "pop.gmail.com";// change accordingly String mailStoreType = "pop3"; String username = "[email protected]";// change accordingly String password = "*****";// change accordingly //Call method fetch fetch(host, mailStoreType, username, password); } /* * This method checks for content-type * based on which, it processes and * fetches the content of the message */ public static void writePart(Part p) throws Exception { if (p instanceof Message) //Call methos writeEnvelope writeEnvelope((Message) p); System.out.println("----------------------------"); System.out.println("CONTENT-TYPE: " + p.getContentType()); //check if the content is plain text if (p.isMimeType("text/plain")) { System.out.println("This is plain text"); System.out.println("---------------------------"); System.out.println((String) p.getContent()); } //check if the content has attachment else if (p.isMimeType("multipart/*")) { System.out.println("This is a Multipart"); System.out.println("---------------------------"); Multipart mp = (Multipart) p.getContent(); int count = mp.getCount(); for (int i = 0; i < count; i++) writePart(mp.getBodyPart(i)); } //check if the content is a nested message else if (p.isMimeType("message/rfc822")) { System.out.println("This is a Nested Message"); System.out.println("---------------------------"); writePart((Part) p.getContent()); } //check if the content is an inline image else if (p.isMimeType("image/jpeg")) { System.out.println("--------> image/jpeg"); Object o = p.getContent(); InputStream x = (InputStream) o; // Construct the required byte array System.out.println("x.length = " + x.available()); while ((i = (int) ((InputStream) x).available()) > 0) { int result = (int) (((InputStream) x).read(bArray)); if (result == -1) int i = 0; byte[] bArray = new byte[x.available()]; break; } FileOutputStream f2 = new FileOutputStream("/tmp/image.jpg"); f2.write(bArray); } else if (p.getContentType().contains("image/")) { System.out.println("content type" + p.getContentType()); File f = new File("image" + new Date().getTime() + ".jpg"); DataOutputStream output = new DataOutputStream( new BufferedOutputStream(new FileOutputStream(f))); com.sun.mail.util.BASE64DecoderStream test = (com.sun.mail.util.BASE64DecoderStream) p .getContent(); byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = test.read(buffer)) != -1) { output.write(buffer, 0, bytesRead); } } else { Object o = p.getContent(); if (o instanceof String) { System.out.println("This is a string"); System.out.println("---------------------------"); System.out.println((String) o); } else if (o instanceof InputStream) { System.out.println("This is just an input stream"); System.out.println("---------------------------"); InputStream is = (InputStream) o; is = (InputStream) o; int c; while ((c = is.read()) != -1) System.out.write(c); } else { System.out.println("This is an unknown type"); System.out.println("---------------------------"); System.out.println(o.toString()); } } } /* * This method would print FROM,TO and SUBJECT of the message */ public static void writeEnvelope(Message m) throws Exception { System.out.println("This is the message envelope"); System.out.println("---------------------------"); Address[] a; // FROM if ((a = m.getFrom()) != null) { for (int j = 0; j < a.length; j++) System.out.println("FROM: " + a[j].toString()); } // TO if ((a = m.getRecipients(Message.RecipientType.TO)) != null) { for (int j = 0; j < a.length; j++) System.out.println("TO: " + a[j].toString()); } // SUBJECT if (m.getSubject() != null) System.out.println("SUBJECT: " + m.getSubject()); } }
Вы можете включить отладку, раскомментировав оператор emailSession.setDebug (true);
Скомпилируйте и запустите
Теперь, когда наш класс готов, давайте скомпилируем вышеуказанный класс. Я сохранил класс FetchingEmail.java в каталог: / home / manisha / JavaMailAPIExercise . Нам понадобятся jars javax.mail.jar и активации.jar в пути к классам. Выполните приведенную ниже команду, чтобы скомпилировать класс (оба файла jar находятся в каталоге / home / manisha /) из командной строки:
javac -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: FetchingEmail.java
Теперь, когда класс скомпилирован, выполните следующую команду:
java -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: FetchingEmail
Проверить вывод
Вы должны увидеть следующее сообщение в командной консоли:
messages.length---3 --------------------------------- This is the message envelope --------------------------- FROM: XYZ <xyz@gmail.com> TO: ABC <abc@gmail.com> SUBJECT: Simple Message ---------------------------- CONTENT-TYPE: multipart/alternative; boundary=047d7b343d6ad3e4ea04e8ec6579 This is a Multipart --------------------------- ---------------------------- CONTENT-TYPE: text/plain; charset=ISO-8859-1 This is plain text --------------------------- Hi am a simple message string.... -- Regards xyz This is the message envelope --------------------------- FROM: XYZ <xyz@gmail.com> TO: ABC <abc@gmail.com> SUBJECT: Attachement ---------------------------- CONTENT-TYPE: multipart/mixed; boundary=047d7b343d6a99180904e8ec6751 This is a Multipart --------------------------- ---------------------------- CONTENT-TYPE: text/plain; charset=ISO-8859-1 This is plain text --------------------------- Hi I've an attachment.Please check -- Regards XYZ ---------------------------- CONTENT-TYPE: application/octet-stream; name=sample_attachement This is just an input stream --------------------------- Submit your Tutorials, White Papers and Articles into our Tutorials Directory. This is a tutorials database where we are keeping all the tutorials shared by the internet community for the benefit of others. This is the message envelope --------------------------- FROM: XYZ <[email protected]> TO: ABC <[email protected]> SUBJECT: Inline Image ---------------------------- CONTENT-TYPE: multipart/related; boundary=f46d04182582be803504e8ece94b This is a Multipart --------------------------- ---------------------------- CONTENT-TYPE: text/plain; charset=ISO-8859-1 This is plain text --------------------------- Hi I've an inline image [image: Inline image 3] -- Regards XYZ ---------------------------- CONTENT-TYPE: image/png; name="javamail-mini-logo.png" content typeimage/png; name="javamail-mini-logo.png"
Здесь вы можете видеть, что в нашем почтовом ящике есть три письма. Сначала простое письмо с сообщением «Привет, я простая строка сообщения ….». Второе письмо имеет вложение. Содержимое вложения также напечатано, как показано выше. Третье письмо имеет встроенное изображение.