JavaMail 接收郵件及刪除


 解析讀取收件箱中郵件:

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.SimpleDateFormat;
import java.util.Date;
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;

/**
 * @ClassName: RecipientMail
 * @Description: 查詢收件箱郵件並輸出,有附件則將其保存進本地路徑,刪除郵件測試
 *
 */
public class RecipientMail {
    public static void main(String[] args) throws Exception {
        resceive();
    }

    /**
     * @Title: resceive
     * @Description: 接收郵件,解析,保存附件,刪除
     * @throws Exception
     *             void
     */
    public static void resceive() throws Exception {

        // 使用163郵箱,163的 pop3地址是 pop3.163.com,  端口是 110     
        String port = "110"; // 端口號
        String servicePath = "pop3.163.com"; // 服務器地址

        // 准備連接服務器的會話信息
        Properties props = new Properties();
        props.setProperty("mail.store.protocol", "pop3"); // 使用pop3協議
        props.setProperty("mail.pop3.port", port); // 端口
        props.setProperty("mail.pop3.host", servicePath); // pop3服務器

        // 創建Session實例對象
        Session session = Session.getInstance(props);
        Store store = session.getStore("pop3");
        store.connect("xxx@163.com", "abc"); // 163郵箱程序登錄屬於第三方登錄所以這里的密碼是163給的授權密碼而並非普通的登錄密碼

        // 獲得收件箱
        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(messages);

        // 得到收件箱中的所有郵件並且刪除郵件
        deleteMessage(messages);

        // 釋放資源
        folder.close(true);
        store.close();
    }

    /**
     * @Title: parseMessage
     * @Description: 解析郵件
     * @param messages
     *            要解析的郵件列表
     * @throws MessagingException
     * @throws IOException
     *             void
     */
    public static void parseMessage(Message... messages)
            throws MessagingException, IOException {
        if (messages == null || messages.length < 1) {
            throw new MessagingException("未找到要解析的郵件!");
        }
        // 解析所有郵件
        for (int i = 0, count = messages.length; i < count; i++) {
            MimeMessage msg = (MimeMessage) messages[i];
            System.out.println("------------------解析第" + msg.getMessageNumber()
                    + "封郵件-------------------- ");
            System.out.println("主題: " + getSubject(msg));
            System.out.println("發件人: " + getFrom(msg));
            System.out.println("收件人:" + getReceiveAddress(msg, null));
            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, "d:\\mailTest\\" + msg.getSubject() + "_"
                        + i + "_"); // 保存附件
            }
            StringBuffer content = new StringBuffer(30);
            getMailTextContent(msg, content);
            System.out.println("郵件正文:"
                    + (content.length() > 100 ? content.substring(0, 100)
                            + "..." : content));
            System.out.println("------------------第" + msg.getMessageNumber()
                    + "封郵件解析結束-------------------- ");
            System.out.println();

        }
    }

    /**
     * @Title: deleteMessage
     * @Description: 解析郵件
     * @param messages
     *            要解析的郵件列表
     * @throws MessagingException
     * @throws IOException
     *             void
     */
    public static void deleteMessage(Message... messages)
            throws MessagingException, IOException {
        if (messages == null || messages.length < 1) {
            throw new MessagingException("未找到要解析的郵件!");
        }
        // 解析所有郵件
        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);
            System.out.println("Marked DELETE for message: " + subject);

        }
    }

    /**
     * @Title: getSubject
     * @Description: 獲得郵件主題
     * @param msg
     *            郵件內容
     * @return 解碼后的郵件主題
     * @throws UnsupportedEncodingException
     * @throws MessagingException
     *             String
     */
    public static String getSubject(MimeMessage msg)
            throws UnsupportedEncodingException, MessagingException {
        return MimeUtility.decodeText(msg.getSubject());
    }

    /**
     * @Title: getFrom
     * @Description: 獲得郵件發件人
     * @param msg
     *            郵件內容
     * @return 姓名 <Email地址>
     * @throws MessagingException
     * @throws UnsupportedEncodingException
     *             String
     */
    public static String getFrom(MimeMessage msg) throws MessagingException,
            UnsupportedEncodingException {
        String from = "";
        Address[] froms = msg.getFrom();
        if (froms.length < 1) {
            throw new MessagingException("沒有發件人!");
        }
        InternetAddress address = (InternetAddress) froms[0];
        String person = address.getPersonal();
        if (person != null) {
            person = MimeUtility.decodeText(person) + " ";
        } else {
            person = "";
        }
        from = person + "<" + address.getAddress() + ">";

        return from;
    }

    /**
     * @Title: getReceiveAddress
     * @Description: 根據收件人類型,獲取郵件收件人、抄送和密送地址。如果收件人類型為空,則獲得所有的收件人
     *               <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
     *             String
     */
    public static String getReceiveAddress(MimeMessage msg,
            Message.RecipientType type) throws MessagingException {
        StringBuffer receiveAddress = new StringBuffer();
        Address[] addresss = null;
        if (type == null) {
            addresss = msg.getAllRecipients();
        } else {
            addresss = msg.getRecipients(type);
        }

        if (addresss == null || addresss.length < 1) {
            throw new MessagingException("沒有收件人!");
        }
        for (Address address : addresss) {
            InternetAddress internetAddress = (InternetAddress) address;
            receiveAddress.append(internetAddress.toUnicodeString())
                    .append(",");
        }

        receiveAddress.deleteCharAt(receiveAddress.length() - 1); // 刪除最后一個逗號

        return receiveAddress.toString();
    }

    /**
     * @Title: getSentDate
     * @Description: 獲得郵件發送時間
     * @param msg
     *            郵件內容
     * @param pattern
     *            日期格式
     * @return yyyy年mm月dd日 星期X HH:mm
     * @throws MessagingException
     *             String
     */
    public static String getSentDate(MimeMessage msg, String pattern)
            throws MessagingException {
        Date receivedDate = msg.getSentDate();
        if (receivedDate == null) {
            return "";
        }
        if (pattern == null || "".equals(pattern)) {
            pattern = "yyyy年MM月dd日 E HH:mm ";
        }
        return new SimpleDateFormat(pattern).format(receivedDate);
    }

    /**
     * @Title: isContainAttachment
     * @Description: 判斷郵件中是否包含附件
     * @param part
     *            郵件內容
     * @return 郵件中存在附件返回true,不存在返回false
     * @throws MessagingException
     * @throws IOException
     *             boolean
     */
    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();
                boolean isHasAttachment = (disp != null && (disp
                        .equalsIgnoreCase(Part.ATTACHMENT) || disp
                        .equalsIgnoreCase(Part.INLINE)));
                if (isHasAttachment) {
                    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;
    }

    /**
     * @Title: isSeen
     * @Description: 判斷郵件是否已讀
     * @param msg
     *            郵件內容
     * @return 如果郵件已讀返回true,否則返回false
     * @throws MessagingException
     *             boolean
     */
    public static boolean isSeen(MimeMessage msg) throws MessagingException {
        return msg.getFlags().contains(Flags.Flag.SEEN);
    }

    /**
     * @Title: isReplySign
     * @Description: 判斷郵件是否需要閱讀回執
     * @param msg
     *            郵件內容
     * @return 需要回執返回true,否則返回false
     * @throws MessagingException
     *             boolean
     */
    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;
    }

    /**
     * @Title: getPriority
     * @Description: 獲得郵件的優先級
     * @param msg
     *            郵件內容
     * @return 1(High):緊急 3:普通(Normal) 5:低(Low)
     * @throws MessagingException
     *             String
     */
    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;
    }

    /**
     * @Title: getMailTextContent
     * @Description: 獲得郵件文本內容
     * @param part
     *            郵件體
     * @param content
     *            存儲郵件文本內容的字符串
     * @throws MessagingException
     * @throws IOException
     *             void
     */
    public static void getMailTextContent(Part part, StringBuffer content)
            throws MessagingException, IOException {
        // 如果是文本類型的附件,通過getContent方法可以取到文本內容,但這不是我們需要的結果,所以在這里要做判斷
        boolean isContainTextAttach = part.getContentType().indexOf("name") > 0;
        if (part.isMimeType("text/*") && !isContainTextAttach) {
            content.append(part.getContent().toString());
        } else if (part.isMimeType("message/rfc822")) {
            getMailTextContent((Part) part.getContent(), content);
        } else 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);
                getMailTextContent(bodyPart, content);
            }
        }
    }

    /**
     * @Title: saveAttachment
     * @Description: 保存附件
     * @param part
     *            郵件中多個組合體中的其中一個組合體
     * @param destDir
     *            附件保存目錄
     * @throws UnsupportedEncodingException
     * @throws MessagingException
     * @throws FileNotFoundException
     * @throws IOException
     *             void
     */
    public static void saveAttachment(Part part, String destDir)
            throws UnsupportedEncodingException, MessagingException,
            FileNotFoundException, IOException {
        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();
                boolean isHasAttachment = (disp != null && (disp
                        .equalsIgnoreCase(Part.ATTACHMENT) || disp
                        .equalsIgnoreCase(Part.INLINE)));
                if (isHasAttachment) {
                    InputStream is = bodyPart.getInputStream();
                    saveFile(is, destDir, decodeText(bodyPart.getFileName()));
                    System.out.println("----附件:"
                            + decodeText(bodyPart.getFileName()) + ","
                            + " 保存路徑為" + destDir);
                } else if (bodyPart.isMimeType("multipart/*")) {
                    saveAttachment(bodyPart, destDir);
                } else {
                    String contentType = bodyPart.getContentType();
                    if (contentType.indexOf("name") != -1
                            || contentType.indexOf("application") != -1) {
                        saveFile(bodyPart.getInputStream(), destDir,
                                decodeText(bodyPart.getFileName()));
                    }
                }
            }
        } else if (part.isMimeType("message/rfc822")) {
            saveAttachment((Part) part.getContent(), destDir);
        }
    }

    /**
     * @Title: saveFile
     * @Description: 讀取輸入流中的數據保存至指定目錄
     * @param is
     *            輸入流
     * @param destDir
     *            文件存儲目錄
     * @param fileName
     *            文件名
     * @throws FileNotFoundException
     * @throws IOException
     *             void
     */
    private static void saveFile(InputStream is, String destDir, String fileName)
            throws FileNotFoundException, IOException {
        BufferedInputStream bis = new BufferedInputStream(is);
        BufferedOutputStream bos = new BufferedOutputStream(
                new FileOutputStream(new File(destDir + fileName)));
        int len = -1;
        while ((len = bis.read()) != -1) {
            bos.write(len);
            bos.flush();
        }
        bos.close();
        bis.close();
    }

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

解析結果:

附件文件保存進本地路徑:

刪除測試:

 

參考:

https://www.cnblogs.com/huangminwen/category/909841.html

https://blog.csdn.net/xyang81/article/details/7675160


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM