在上一章中,我们学习了如何查看电子邮件.现在让我们看看如何获取每封电子邮件并阅读其内容.让我们编写一个Java类 FetchingEmail ,它将读取以下类型的电子邮件:
简单的电子邮件
带附件的电子邮件
带内联图片的电子邮件
代码中遵循的基本步骤如下:
获取会话对象.
创建POP3商店对象并连接到商店.
创建文件夹对象并在邮箱中打开相应的文件夹.
检索邮件.
分别关闭文件夹和商店对象.
创建Java类
创建java创建java类文件 FetchingEmail ,其内容如下:
package com .it1352; 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 = "abc@gmail.com";// 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 .我们需要类路径中的jar javax.mail.jar 和 activation.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: XYZTO: ABC SUBJECT: Simple Message----------------------------CONTENT-TYPE: multipart/alternative; boundary=047d7b343d6ad3e4ea04e8ec6579This is a Multipart-------------------------------------------------------CONTENT-TYPE: text/plain; charset=ISO-8859-1This is plain text---------------------------Hi am a simple message string....-- RegardsxyzThis is the message envelope---------------------------FROM: XYZ TO: ABC SUBJECT: Attachement----------------------------CONTENT-TYPE: multipart/mixed; boundary=047d7b343d6a99180904e8ec6751This is a Multipart-------------------------------------------------------CONTENT-TYPE: text/plain; charset=ISO-8859-1This is plain text---------------------------Hi I've an attachment.Please check-- RegardsXYZ----------------------------CONTENT-TYPE: application/octet-stream; name=sample_attachementThis 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 TO: ABC SUBJECT: Inline Image----------------------------CONTENT-TYPE: multipart/related; boundary=f46d04182582be803504e8ece94bThis is a Multipart-------------------------------------------------------CONTENT-TYPE: text/plain; charset=ISO-8859-1This is plain text---------------------------Hi I've an inline image[image: Inline image 3]-- RegardsXYZ----------------------------CONTENT-TYPE: image/png; name="javamail-mini-logo.png"content typeimage/png; name="javamail-mini-logo.png"
在这里,您可以看到我们的邮箱中有三封电子邮件.首先是一条简单的邮件,上面写着"你好是一个简单的消息字符串......".第二封邮件有附件.附件的内容也如上所示打印.第三封邮件有一个内联图片.