收邮件主要有pop3和imap两种协议。两种方式都可用来读取邮件,但是有处理上的区别。

1.pop3是不支持判断邮件是否为已读的,也就是说不能直接从收件箱里面取到未读邮件,需要进行判断处理。

2.imap提供了读取未读邮件功能,可判断该邮件是否为已读或未读。

另外, 收件箱中的每一封邮件对应一个MessageNumber,可通过一个MessageNumber拿到对应邮件。

如:Message message = folder.getMessage(messageNumber);  定时任务每次读邮箱邮件不用全量读取。

pom.xml

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4.7</version>
</dependency>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

一、pop3协议模式下读取

    public class ReadEmail {
        public static final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";

        public static void main(String[] args) throws Exception {
            // 输入你的邮箱用户名和密码
            String emailUsername = "邮件用户名@163.com";
            String emailPassword = "密码";

            // 邮件服务器的属性
            Properties props = new Properties();
            //收件配置
            props.setProperty("mail.pop3.host", "pop.163.com");
            props.setProperty("mail.pop3.socketFactory.class", SSL_FACTORY);
            props.setProperty("mail.pop3.ssl.trust", "*");
            props.setProperty("mail.pop3.socketFactory.fallback", "false");
            props.setProperty("mail.pop3.port", "XXX");
            props.setProperty("mail.pop3.socketFactory.port", "XXX");
            props.setProperty("mail.pop3.auth", "true");
            props.setProperty("mail.store.protocol", "pop3");
            //发送配置
            props.setProperty("mail.smtp.host", "smtp.163.com");
            props.setProperty("mail.smtp.port", "XXX");
            props.setProperty("mail.smtp.auth", "true");

            // 创建邮件会话
            Session emailSession = Session.getInstance(props);

            // 获取邮件存储对象
            Store store = emailSession.getStore();
            store.connect(emailUsername, emailPassword);

            // 获取INBOX文件夹
            Folder emailFolder = store.getFolder("INBOX");
            emailFolder.open(Folder.READ_ONLY);

            // 找到未读邮件
            Message[] messages = emailFolder.getMessages();
            for (Message message : messages) {
                System.out.println("邮件标题:" + message.getSubject());
            }

            // 关闭文件夹和存储对象
            emailFolder.close(false);
            store.close();
        }
    }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.

二、imap协议模式下读取

public static void readMail() {    
           String protocol = "imap";
           Properties props = new Properties();
           props.setProperty("mail.transport.protocol",  protocol); // 使用的协议(JavaMail规范要求)
            props.setProperty("mail.smtp.host", host); // 发件人的邮箱的 SMTP服务器地址
           // 获取连接
            Session session = Session.getInstance(props);
           session.setDebug(false);
           // 获取Store对象
            Store store = session.getStore(protocol);
            store.connect(host, userName, password); 
            IMAPFolder inbox = (IMAPFolder)store.getFolder("INBOX");    
                //如果需要在取得邮件数后将邮件置为已读则这里需要使用READ_WRITE,否则READ_ONLY就可以
            inbox.open(Folder.READ_WRITE);    
        
            // 全部邮件数    
            int messageCount = inbox.getMessageCount();    
            System.out.println(messageCount);  
            //folder.getUnreadMessageCount() 未读取邮件总数
            Message[] messages = inbox.getMessages(folder.getMessageCount()-inbox.getUnreadMessageCount()+1,inbox.getMessageCount());

            List<Message> mesList=new ArrayList<>();
            for (int i = 0; i < messages.length; i++) {    
                Message message = messages[i];    
                System.out.println(message.getSubject());    
                //保存我将要设置为已读的message列表    
                mesList.add(message); 
                 //解析邮件内容
               .......
             }
                //将刚才我获取的邮件设置为已读
             if (mesList.size() > 0) {
                 Message[] savedMailMessage = new Message[mesList.size()];
                 mesList.toArray(savedMailMessage);
                 inbox.setFlags(savedMailMessage, new Flags(Flags.Flag.SEEN),true);
             }


            folder.close(true);    
            store.close();    
        }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.