javaMail邮件接收解析内容及附件及删除邮件

package com.zzb;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;

/**
 * 使用POP3协议接收邮件
 * 
 */
public class POP3ReceiveMail163 {
    public static void main(String[] args) throws Exception {
        resceive("pop3.163.com", "17621884673@163.com", "zzblsm0422");
    }

    /**
     * 接收邮件
     */
    public static void resceive(String server, String mailAddress, String password) throws Exception {
        // 因为现在使用的是163邮箱 而163的 pop地址是 pop3.163.com 端口是 110
        // 比如使用好未来企业邮箱 就需要换成 好未来邮箱的 pop服务器地址 pop.263.net 和 端口 110
        // 准备连接服务器的会话信息
        Map<String, Object> returnMap = new HashMap<String, Object>();
        Properties props = new Properties();
        props.setProperty("mail.store.protocol", "pop3"); // 使用pop3协议
        props.setProperty("mail.pop3.port", "110"); // 端口
        props.setProperty("mail.pop3.host", server); // pop3服务器
        // props.setProperty("mail.pop3.port", "110"); // 端口
        // props.setProperty("mail.pop3.host", "pop.exmail.qq.com"); //企业级qq邮箱
        // 创建Session实例对象
        Session session = Session.getInstance(props);
        Store store = session.getStore("pop3");
        store.connect(mailAddress, password); // 163邮箱程序登录属于第三方登录所以这里的密码是163给的授权密码而并非普通的登录密码
        // store.connect("*****@*****", "*******");

        // 获得收件箱
        Folder folder = store.getFolder("INBOX");
        /*
         * Folder.READ_ONLY:只读权限 Folder.READ_WRITE:可读可写(可以修改邮件的状态)
         */
        folder.open(Folder.READ_WRITE); // 打开收件箱

        // 由于POP3协议无法获知邮件的状态,所以getUnreadMessageCount得到的是收件箱的邮件总数
        System.out.println("未读邮件数: " + folder.getUnreadMessageCount());

        // 由于POP3协议无法获知邮件的状态,所以下面得到的结果始终都是为0
        System.out.println("删除邮件数: " + folder.getDeletedMessageCount());
        System.out.println("新邮件: " + folder.getNewMessageCount());

        // 获得收件箱中的邮件总数
        System.out.println("邮件总数: " + folder.getMessageCount());

        // 得到收件箱中的所有邮件,并解析
        Message[] messages = folder.getMessages();
        parseMessage(returnMap, messages);
        // 得到收件箱中的所有邮件并且删除邮件
        // deleteMessage(returnMap, messages);
        // 释放资源
        folder.close(true);
        store.close();
    }

    /**
     * 解析邮件
     * 
     * @param messages
     *            要解析的邮件列表
     */
    public static Object parseMessage(Map<String, Object> returnMap, Message... messages) {
        try {
            if (messages == null || messages.length < 1)
                return Constants.makeReturnMap(returnMap, 0, "No mail to be parsed");
            // 解析所有邮件
            for (int i = 0, count = messages.length; i < count; i++) {
                MimeMessage msg = (MimeMessage) messages[i];
                System.out.println("------------------解析第" + msg.getMessageNumber() + "封邮件-------------------- ");

                Map<String, Object> sender = (Map<String, Object>) getFrom(msg);
                System.out.println("主题:" + getSubject(msg));
                System.out.println("发件人: " + sender.get("msg").toString());
                Map<String, Object> receiveAddress = (Map<String, Object>) getReceiveAddress(msg, null);
                System.out.println("收件人:" + receiveAddress.get("To").toString());
                System.out.println("抄送人:" + receiveAddress.get("Cc").toString());
                System.out.println("密送人人:" + receiveAddress.get("Bcc").toString());
                System.out.println("发送时间:" + getSentDate(msg, null));
                System.out.println("是否已读:" + isSeen(msg));
                System.out.println("邮件优先级:" + getPriority(msg));
                System.out.println("是否需要回执:" + isReplySign(msg));
                System.out.println("邮件大小:" + msg.getSize() * 1024 + "kb");
                boolean isContainerAttachment = isContainAttachment(msg);
                System.out.println("是否包含附件:" + isContainerAttachment);
                if (isContainerAttachment) {
                    saveAttachment(msg); // 保存附件
                }
                StringBuffer content = new StringBuffer(30);
                getMailTextContent(msg, content);
                String contents = content.toString().replaceAll("\\s*", "");
                System.out.println("contents:" + contents);
                String subject = getSubject(msg);
                if (subject.contains("Re:")) {
                    String address[] = receiveAddress.get("To").toString().split("<");
                    String addIndex = ("\"" + address[0] + "\"").replaceAll("\\s*", "");
                    System.out.println("有回复的内容:" + contents.substring(0, contents.indexOf(addIndex) - 20));
                } else {
                    System.out.println("没回复的内容:" + contents);
                }

                System.out.println("------------------第" + msg.getMessageNumber() + "封邮件解析结束-------------------- ");
                System.out.println();

            }
            return Constants.makeReturnMap(returnMap, 1, "success operation");
        } catch (Exception e) {
            e.printStackTrace();
            return Constants.makeReturnMap(returnMap, 2, "abnormal operation");
        }

    }

    /**
     * 解析邮件
     * 
     * @param messages
     *            要解析的邮件列表 ,邮件删除
     */
    public static Object deleteMessage(Map<String, Object> returnMap, Message... messages) {
        try {
            if (messages == null || messages.length < 1)
                // throw new MessagingException("未找到要解析的邮件!");
                return Constants.makeReturnMap(returnMap, 0, "No mail to be parsed");
            for (int i = 0, count = messages.length; i < count; i++) {
                Message message = messages[i];
                String subject = message.getSubject();
                // set the DELETE flag to true
                message.setFlag(Flags.Flag.DELETED, true);
            }
            return Constants.makeReturnMap(returnMap, 1, "success operation");
        } catch (Exception e) {
            e.printStackTrace();
            return Constants.makeReturnMap(returnMap, 2, "abnormal operation");
        }
    }

    /**
     * 获得邮件主题
     * 
     * @param msg
     *            邮件内容
     * @return 解码后的邮件主题
     */
    public static String getSubject(MimeMessage msg) throws UnsupportedEncodingException, MessagingException {
        return MimeUtility.decodeText(msg.getSubject());
    }

    /**
     * 获得邮件发件人
     * 
     * @param msg
     *            邮件内容
     * @return 姓名 <Email地址>
     * @throws MessagingException
     * @throws UnsupportedEncodingException
     */
    public static Object getFrom(MimeMessage msg) throws MessagingException, UnsupportedEncodingException {
        HashMap<String, Object> returnMap = new HashMap<String, Object>();
        String from = "";
        Address[] froms = msg.getFrom();
        if (froms.length < 1)
            return Constants.makeReturnMap(returnMap, 5, "no sender");

        InternetAddress address = (InternetAddress) froms[0];
        String person = address.getPersonal();
        if (person != null) {
            person = MimeUtility.decodeText(person) + " ";
        } else {
            person = "";
        }
        from = person + "<" + address.getAddress() + ">";
        return Constants.makeReturnMap(returnMap, 6, from);
    }

    /**
     * 根据收件人类型,获取邮件收件人、抄送和密送地址。如果收件人类型为空,则获得所有的收件人
     * <p>
     * Message.RecipientType.TO 收件人
     * </p>
     * <p>
     * Message.RecipientType.CC 抄送
     * </p>
     * <p>
     * Message.RecipientType.BCC 密送
     * </p>
     * 
     * @param msg
     *            邮件内容
     * @param type
     *            收件人类型
     * @return 收件人1 <邮件地址1>, 收件人2 <邮件地址2>, ...
     * @throws MessagingException
     */
    public static Object getReceiveAddress(MimeMessage msg, Message.RecipientType type) throws Exception {
        HashMap<String, Object> returnMap = new HashMap<String, Object>();
        StringBuffer receiveAddressTo = new StringBuffer();
        StringBuffer receiveAddressCC = new StringBuffer();
        StringBuffer receiveAddressBCC = new StringBuffer();

        // Address[] addresss = null;
        // if (type == null) {
        // addresss = msg.getAllRecipients();
        // } else {
        // addresss = msg.getRecipients(type);
        // }
        // if (addresss == null || addresss.length < 1)
        // return Constants.makeReturnMap(returnMap, 3, "no rectipient");
        // for (Address address : addresss) {
        // InternetAddress internetAddress = (InternetAddress) address;
        // receiveAddress.append(internetAddress.toUnicodeString()).append(",");
        // }
        // receiveAddress.deleteCharAt(receiveAddress.length() - 1); // 删除最后一个逗号

        // 收件人
        Address[] addresssTo = msg.getRecipients(Message.RecipientType.TO);
        if (addresssTo == null || addresssTo.length < 1) {
            return Constants.makeReturnMap(returnMap, 3, "no rectipient");
        }
        returnMap.put("To", returnRecipient(receiveAddressTo, addresssTo));
        // 抄送
        Address[] addresssCc = msg.getRecipients(Message.RecipientType.CC);
        returnMap.put("Cc", returnRecipient(receiveAddressCC, addresssCc));
        // 密送
        Address[] addresssBcc = msg.getRecipients(Message.RecipientType.BCC);
        returnMap.put("Bcc", returnRecipient(receiveAddressBCC, addresssBcc));
        return Constants.makeReturnMap(returnMap, 4, receiveAddressTo.toString());
    }

    public static String returnRecipient(StringBuffer receiveAddressTo, Address[] addresssTo) {
        if (addresssTo != null) {
            for (Address address : addresssTo) {
                InternetAddress internetAddress = (InternetAddress) address;
                receiveAddressTo.append(internetAddress.toUnicodeString()).append(",");
            }
            receiveAddressTo.deleteCharAt(receiveAddressTo.length() - 1); // 删除最后一个逗号
        }
        return receiveAddressTo.toString();
    }

    /**
     * 获得邮件发送时间
     * 
     * @param msg
     *            邮件内容
     * @return yyyy-mm-dd HH:mm:ss
     * @throws MessagingException
     * @throws ParseException
     */
    public static String getSentDate(MimeMessage msg, String pattern) throws MessagingException, ParseException {
        Date receivedDate = msg.getSentDate();
        if (receivedDate == null)
            return "";

        if (pattern == null || "".equals(pattern))
            pattern = "yyyy-MM-dd HH:mm:ss";
        return new SimpleDateFormat(pattern).format(receivedDate);
    }

    /**
     * 判断邮件中是否包含附件
     * 
     * @param msg
     *            邮件内容
     * @return 邮件中存在附件返回true,不存在返回false
     * @throws MessagingException
     * @throws IOException
     */
    public static boolean isContainAttachment(Part part) throws MessagingException, IOException {
        boolean flag = false;
        if (part.isMimeType("multipart/*")) {
            MimeMultipart multipart = (MimeMultipart) part.getContent();
            int partCount = multipart.getCount();
            for (int i = 0; i < partCount; i++) {
                BodyPart bodyPart = multipart.getBodyPart(i);
                String disp = bodyPart.getDisposition();
                if (disp != null && (disp.equalsIgnoreCase(Part.ATTACHMENT) || disp.equalsIgnoreCase(Part.INLINE))) {
                    flag = true;
                } else if (bodyPart.isMimeType("multipart/*")) {
                    flag = isContainAttachment(bodyPart);
                } else {
                    String contentType = bodyPart.getContentType();
                    if (contentType.indexOf("application") != -1) {
                        flag = true;
                    }

                    if (contentType.indexOf("name") != -1) {
                        flag = true;
                    }
                }

                if (flag)
                    break;
            }
        } else if (part.isMimeType("message/rfc822")) {
            flag = isContainAttachment((Part) part.getContent());
        }
        return flag;
    }

    /**
     * 判断邮件是否已读
     * 
     * @param msg
     *            邮件内容
     * @return 如果邮件已读返回true,否则返回false
     * @throws MessagingException
     */
    public static boolean isSeen(MimeMessage msg) throws MessagingException {
        return msg.getFlags().contains(Flags.Flag.SEEN);
    }

    /**
     * 判断邮件是否需要阅读回执
     * 
     * @param msg
     *            邮件内容
     * @return 需要回执返回true,否则返回false
     * @throws MessagingException
     */
    public static boolean isReplySign(MimeMessage msg) throws MessagingException {
        boolean replySign = false;
        String[] headers = msg.getHeader("Disposition-Notification-To");
        if (headers != null)
            replySign = true;
        return replySign;
    }

    /**
     * 获得邮件的优先级
     * 
     * @param msg
     *            邮件内容
     * @return 1(High):紧急 3:普通(Normal) 5:低(Low)
     * @throws MessagingException
     */
    public static String getPriority(MimeMessage msg) throws MessagingException {
        String priority = "普通";
        String[] headers = msg.getHeader("X-Priority");
        if (headers != null) {
            String headerPriority = headers[0];
            if (headerPriority.indexOf("1") != -1 || headerPriority.indexOf("High") != -1)
                priority = "紧急";
            else if (headerPriority.indexOf("5") != -1 || headerPriority.indexOf("Low") != -1)
                priority = "低";
            else
                priority = "普通";
        }
        return priority;
    }

    /**
     * 获得邮件文本内容
     * 
     * @param part
     *            邮件体
     * @param content
     *            存储邮件文本内容的字符串
     * @throws MessagingException
     * @throws IOException
     */
    public static void getMailTextContent(Part part, StringBuffer content) throws MessagingException, IOException {
        // 如果是文本类型的附件,通过getContent方法可以取到文本内容,但这不是我们需要的结果,所以在这里要做判断
        // part.getContent() 邮件全部内容 , 包含正文和附件
        // 正文包括本正文(Content-Type: text/plain;charset="gb2312")和html格式(Content-Type:
        // text/html;charset="gb2312")

        // // 获得邮件的MimeType类型
        // System.out.println("邮件的MimeType类型: " + contentType);
        String contentType = part.getContentType();
        int nameIndex = contentType.indexOf("name");
        boolean conName = false;
        if (nameIndex != -1) {
            conName = true;
        }
        if (part.isMimeType("text/plain") && conName == false) {
            // text/plain 类型
            content.append((String) part.getContent());
        } else if (part.isMimeType("text/html") && conName == false) {
            // text/html 类型 记得要判断这个类型,否则带有附件的正文时就读取不到正文
            String str = String.valueOf(part.getContent());
            content.append(str);
        }
else if (part.isMimeType("multipart/*")) {
            // multipart/*
            Multipart multipart = (Multipart) part.getContent();
            int counts = multipart.getCount();
            for (int i = 0; i < counts; i++) {
                getMailTextContent(multipart.getBodyPart(i), content);
            }
        } else if (part.isMimeType("message/rfc822")) {
            // message/rfc822
            getMailTextContent((Part) part.getContent(), content);
        }
    }

    /**
     * 保存附件
     * 
     * @param part
     *            邮件中多个组合体中的其中一个组合体
     * @param destDir
     *            附件保存目录
     * @throws UnsupportedEncodingException
     * @throws MessagingException
     * @throws FileNotFoundException
     * @throws IOException
     */
    public static void saveAttachment(Part part) {
        try {
            if (part.isMimeType("multipart/*")) {
                Multipart multipart = (Multipart) part.getContent(); // 复杂体邮件
                // 复杂体邮件包含多个邮件体
                int partCount = multipart.getCount();
                for (int i = 0; i < partCount; i++) {
                    // 获得复杂体邮件中其中一个邮件体
                    BodyPart bodyPart = multipart.getBodyPart(i);
                    // 某一个邮件体也有可能是由多个邮件体组成的复杂体 //
                    String disp = bodyPart.getDisposition();
                    if (disp != null
                            && (disp.equalsIgnoreCase(Part.ATTACHMENT) || disp.equalsIgnoreCase(Part.INLINE))) {
                        InputStream is = bodyPart.getInputStream();
                        saveFile(is, decodeText(bodyPart.getFileName()));
                    } else if (bodyPart.isMimeType("multipart/*")) {
                        saveAttachment(bodyPart);
                    } else {
                        String contentType = bodyPart.getContentType();
                        if (contentType.indexOf("name") != -1 || contentType.indexOf("application") != -1) {
                            saveFile(bodyPart.getInputStream(), decodeText(bodyPart.getFileName()));
                        }
                    }
                }
            } else if (part.isMimeType("message/rfc822")) {
                saveAttachment((Part) part.getContent());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 读取输入流中的数据保存至指定目录
     * 
     * @param is
     *            输入流
     * @param fileName
     *            文件名
     * @param destDir
     *            文件存储目录
     * @throws FileNotFoundException
     * @throws IOException
     * @throws ParseException
     */
    private static void saveFile(InputStream is, String fileName)
            throws FileNotFoundException, IOException, ParseException {
        BufferedInputStream bis = new BufferedInputStream(is);
        // 保存附件,如果文件夹不存在就新建
        String destDir = "f:\\email\\";
        File filePath = new File(destDir);
        if (!filePath.exists()) {
            filePath.mkdir();
        }
        File targetPath = new File(filePath + File.separator + fileName);
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(targetPath));
        int len = -1;
        while ((len = bis.read()) != -1) {
            bos.write(len);
            bos.flush();
        }
        bos.close();
        bis.close();
    }

    /**
     * 文本解码
     * 
     * @param encodeText
     *            解码MimeUtility.encodeText(String text)方法编码后的文本
     * @return 解码后的文本
     * @throws UnsupportedEncodingException
     */
    public static String decodeText(String encodeText) throws UnsupportedEncodingException {
        if (encodeText == null || "".equals(encodeText)) {
            return "";
        } else {
            return MimeUtility.decodeText(encodeText);
        }
    }

}
 

转载于:https://my.oschina.net/lsm97103/blog/1801413

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于JavaMail邮件收发系统是一种用于发送和接收电子邮件的应用程序,它基于JavaMail API来实现与邮件服务器的通信,并提供用户界面来进行邮件的管理和操作。以下是对该系统实现的描述: 用户界面: 系统提供了用户友好的界面,使用户能够方便地登录、查看、发送和管理邮件。 用户界面可能采用图形用户界面(GUI)或者Web界面,让用户能够通过桌面应用程序或者Web浏览器进行操作。 邮件发送功能: 用户可以通过系统界面编写邮件、设置收件人、添加附件等,并将邮件发送到指定的邮件服务器。 系统利用JavaMail API来构建和发送邮件,通过SMTP(Simple Mail Transfer Protocol)协议与邮件服务器进行通信,将邮件传输到目标邮箱。 邮件接收功能: 系统能够从用户指定的邮箱服务器上接收邮件,并将邮件内容显示在用户界面上。 使用JavaMail API中的POP3(Post Office Protocol 3)或者IMAP(Internet Message Access Protocol)协议来从邮件服务器上下载邮件,并将其解析成可读的格式供用户查看。 邮件管理功能: 用户可以在系统界面上对收件箱、发件箱、已发送邮件等进行管理,如查看、删除、标记、归档等操作。 系统可能提供对邮件进行分类、过滤和搜索的功能,以便用户能够更有效地管理大量的邮件。 安全性和认证: 系统应该提供安全的用户认证机制,确保只有经过授权的用户能够访问和操作邮件。 使用JavaMail API时,可以结合Java的安全机制,如SSL(Secure Sockets Layer)或者TLS(Transport Layer Security)来保护邮件的传输过程中的数据安全。 附件处理: 系统应支持发送和接收带有附件邮件,并能够对附件进行上传、下载和预览等操作。 通过以上实现,基于JavaMail邮件收发系统能够为用户提供便捷、安全的邮件收发服务,满足用户在日常工作和生活中的邮件通信需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值