JavaMail - 获取电子邮件

  • 简述

    在上一章中,我们学习了如何查看电子邮件。现在让我们看看如何获取每封电子邮件并阅读其内容。让我们写一个Java类FetchingEmail 它将读取以下类型的电子邮件:
    • 简单的电子邮件
    • 带附件的电子邮件
    • 带有内嵌图片的电子邮件
    代码中遵循的基本步骤如下:
    • 获取会话对象。
    • 创建 POP3 商店对象并连接到商店。
    • 创建 Folder 对象并在您的邮箱中打开相应的文件夹。
    • 检索消息。
    • 分别关闭文件夹和存储对象。
  • 创建 Java 类

    创建一个java类文件 FetchingEmail,内容如下:
    
    
    package com.jc2182;
    
    
    
    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. 我们需要类路径中的 jars javax.mail.jaractivation.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 <xyz@gmail.com>
    
    TO: ABC <abc@gmail.com>
    
    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"
    
    
    在这里您可以看到我们的邮箱中有三封电子邮件。首先是一封带有消息的简单邮件“你好,是一个简单的消息字符串......”。第二封邮件有附件。附件的内容也如上所示打印。第三封邮件有一个内嵌图像。