开发手册 欢迎您!
软件开发者资料库

JavaMail API - 获取电子邮件

JavaMail API获取电子邮件 - 学习JavaMail API编程以及如何使用嵌入式电子邮件应用程序开发Java应用程序。在这里,您将学习JavaMail环境设置,核心类,发送简单电子邮件,附件,HTML,内嵌图像,检查电子邮件,获取电子邮件,身份验证,回复电子邮件,转发电子邮件,删除电子邮件,Gmail SMTP服务器,文件夹管理,配额管理,退回邮件,SMTP服务器,IMAP服务器,POP3服务器。

在上一章中,我们学习了如何查看电子邮件.现在让我们看看如何获取每封电子邮件并阅读其内容.让我们编写一个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: XYZ TO: 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"

在这里,您可以看到我们的邮箱中有三封电子邮件.首先是一条简单的邮件,上面写着"你好是一个简单的消息字符串......".第二封邮件有附件.附件的内容也如上所示打印.第三封邮件有一个内联图片.