Receive email using POP3

POP3 supports simple download-and-delete requirements for access to remote mailboxes.

Java Mail comes with Provider implementations for POP3 and IMAP, and the secure versions of those as POP3S and IMAPS.

This Howto connects to a server using the POP3S (Secure, encrypted POP3) to download messages with or without attachments and save them into files.

import java.io.*;
import java.util.*;
import javax.mail.*;

import javax.mail.internet.MimeBodyPart;

public class ReceiveMailPOP3 {
  private static final String HOST = "pop.gmail.com";
  private static final String USERNAME = "myemail@gmail.com";
  private static final String PASSWORD = "******";

  public static void doit() throws MessagingException, IOException {
    Folder folder = null;
    Store store = null;
    try {
      Properties props = new Properties();
      props.put("mail.store.protocol", "pop3s"); // Google uses POP3S not POP3
      Session session = Session.getDefaultInstance(props);
      // session.setDebug(true);
      store = session.getStore();
      store.connect(HOST, USERNAME, PASSWORD);
      folder = store.getDefaultFolder().getFolder("INBOX");
      folder.open(Folder.READ_ONLY);
      Message[] messages = folder.getMessages();
      System.out.println("No of Messages : " + folder.getMessageCount());
      System.out.println("No of Unread Messages : " + folder.getUnreadMessageCount());
      for (int i=0; i < messages.length; ++i) {
        System.out.println("MESSAGE #" + (i + 1) + ":");
        Message msg = messages[i];
        String from = "unknown";
        if (msg.getReplyTo().length >= 1) {
          from = msg.getReplyTo()[0].toString();
        }
        else if (msg.getFrom().length >= 1) {
          from = msg.getFrom()[0].toString();
        }
        String subject = msg.getSubject();
        System.out.println("Saving ... " + subject +" " + from);
        // you may want to replace the spaces with "_"
        // the files will be saved into the TEMP directory
        String filename = "c:/temp/" +  subject;
        saveParts(msg.getContent(), filename);
      }
    }
    finally {
      if (folder != null) { folder.close(true); }
      if (store != null) { store.close(); }
    }
  }

  public static void saveParts(Object content, String filename)
  throws IOException, MessagingException
  {
    OutputStream out = null;
    InputStream in = null;
    try {
      if (content instanceof Multipart) {
        Multipart multi = ((Multipart)content);
        int parts = multi.getCount();
        for (int j=0; j < parts; ++j) {
          MimeBodyPart part = (MimeBodyPart)multi.getBodyPart(j);
          if (part.getContent() instanceof Multipart) {
            // part-within-a-part, do some recursion...
            saveParts(part.getContent(), filename);
          }
          else {
            String extension = "";
            if (part.isMimeType("text/html")) {
              extension = "html";
            }
            else {
              if (part.isMimeType("text/plain")) {
                extension = "txt";
              }
              else {
                //  Try to get the name of the attachment
                extension = part.getDataHandler().getName();
              }
              filename = filename + "." + extension;
              System.out.println("... " + filename);
              out = new FileOutputStream(new File(filename));
              in = part.getInputStream();
              int k;
              while ((k = in.read()) != -1) {
                out.write(k);
              }
            }
          }
        }
      }
    }
    finally {
      if (in != null) { in.close(); }
      if (out != null) { out.flush(); out.close(); }
    }
  }

  public static void main(String args[]) throws Exception {
    ReceiveMailPOP3.doit();
  }
}

Done! Happy Coding!

Related posts:

How to Read HTTP Headers in Spring REST Controllers
Java Program to Use Dynamic Programming to Solve Approximate String Matching
Spring REST with a Zuul Proxy
Reversing a Linked List in Java
Predicate trong Java 8
Introduction to Spring Cloud OpenFeign
Java Program to Apply Above-Below-on Test to Find the Position of a Point with respect to a Line
Toán tử instanceof trong java
A Quick Guide to Using Keycloak with Spring Boot
Java Program to Implement LinkedBlockingDeque API
Hướng dẫn Java Design Pattern – Singleton
Java Program to Implement Quick Sort Using Randomization
Giới thiệu Google Guice – Aspect Oriented Programming (AOP)
Prevent Brute Force Authentication Attempts with Spring Security
Guide to Apache Commons CircularFifoQueue
Introduction to Project Reactor Bus
Serverless Functions with Spring Cloud Function
Validate email address exists or not by Java Code
Java Program to Implement Heap’s Algorithm for Permutation of N Numbers
Java Program to Delete a Particular Node in a Tree Without Using Recursion
Java Program to Check whether Graph is Biconnected
What is Thread-Safety and How to Achieve it?
Java Program to Implement Meldable Heap
Java Program to Implement Pollard Rho Algorithm
Spring Boot - Enabling HTTPS
Tìm hiểu về xác thực và phân quyền trong ứng dụng
Lớp Arrarys trong Java (Arrays Utility Class)
Quick Guide to java.lang.System
Generating Random Dates in Java
Introduction to Spring Data JDBC
Spring Cloud AWS – Messaging Support
Java Program to Find the Minimum value of Binary Search Tree