1. 程式人生 > >郵件操作總結(Exchange、POP3)

郵件操作總結(Exchange、POP3)

總結下幾年前寫過的,操作郵件Exchange、POP3協議的demo

Exchange:

import microsoft.exchange.webservices.data.core.ExchangeService;
import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion;
import microsoft.exchange.webservices.data.core.enumeration.property.BodyType;
import microsoft.exchange.webservices.data.core.enumeration.property.WellKnownFolderName;
import microsoft.exchange.webservices.data.core.enumeration.search.LogicalOperator;
import microsoft.exchange.webservices.data.core.service.item.EmailMessage;
import microsoft.exchange.webservices.data.core.service.item.Item;
import microsoft.exchange.webservices.data.core.service.schema.EmailMessageSchema;
import microsoft.exchange.webservices.data.credential.ExchangeCredentials;
import microsoft.exchange.webservices.data.credential.WebCredentials;

import microsoft.exchange.webservices.data.core.service.folder.Folder;
import microsoft.exchange.webservices.data.property.complex.Attachment;
import microsoft.exchange.webservices.data.property.complex.MessageBody;
import microsoft.exchange.webservices.data.search.FindItemsResults;
import microsoft.exchange.webservices.data.search.ItemView;
import microsoft.exchange.webservices.data.search.filter.SearchFilter;

import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by sunjun on 2016/9/21.
 */
public class ExchangeMailTest {

    //	private static String username = "
[email protected]
"; private static String username = "[email protected]*.local"; private static String password = "*@2016.07"; private static String demand = "mail.*.com";// 郵件伺服器 // private static String demand = "mail.*.com";// 郵件伺服器 private static ExchangeService service; /** * 初始化連線 * */ private static void init(){ service = new ExchangeService(ExchangeVersion.Exchange2010_SP2); ExchangeCredentials credentials = new WebCredentials(username,password); service.setCredentials(credentials); try { service.setUrl(new URI("https://" + "mail.jd.com" + "/EWS/Exchange.asmx")); } catch (URISyntaxException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 使用Exchange協議傳送 * @param subject 郵件主題 * @param to 收件人 * @param cc 抄送 * @param bobytext 正文 * @param realPath 附件 * * @throws Exception */ public static void doSend(String subject, List<String> to, List<String> cc, String bodyText, String realPath) throws Exception { EmailMessage msg = new EmailMessage(service); msg.setSubject(subject); MessageBody body = MessageBody.getMessageBodyFromText(bodyText); body.setBodyType(BodyType.Text); msg.setBody(body); for (String s : to) { msg.getToRecipients().add(s); } // for (String s : cc) { // msg.getCcRecipients().add(s); // } if (realPath != null && !"".equals(realPath)) { msg.getAttachments().addFileAttachment(realPath); } msg.send(); } public static void send(String subject, List<String> to, List<String> cc, String bodyText) throws Exception { doSend(subject, to, cc, bodyText, null); } /** * 使用Exchange協議接收郵件 * * @throws Exception */ public static void GetUnreadEmails() throws Exception { ItemView view = new ItemView(Integer.MAX_VALUE); List<String> list = new ArrayList<String>(); FindItemsResults<Item> unRead = Folder.bind(service, WellKnownFolderName.Inbox).findItems(SetFilter(), view); System.out.println("unRead:" + unRead.getItems().size()); for (Item item : unRead.getItems()) { if (item.getSubject() != null) { list.add(item.getSubject().toString()); } else { list.add("無標題"); } // list.Add(item.DateTimeSent.ToString()); } // int unRead1=Folder.bind(service, WellKnownFolderName.Inbox).getUnreadCount(); //未讀郵件數量 System.out.println("未讀郵件數量"+Folder.bind(service, WellKnownFolderName.Inbox).getUnreadCount()); } /** * 設定獲取什麼型別的郵件 * * @throws Exception */ private static SearchFilter SetFilter() { List<SearchFilter> searchFilterCollection = new ArrayList<SearchFilter>(); searchFilterCollection.add(new SearchFilter.IsEqualTo( EmailMessageSchema.IsRead, false)); SearchFilter s = new SearchFilter.SearchFilterCollection( LogicalOperator.And,searchFilterCollection); // 如果要獲取所有郵件的話程式碼改成這樣: // searchFilterCollection.add(new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false)); // searchFilterCollection.add(new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, true)); // SearchFilter s = new SearchFilter.SearchFilterCollection(LogicalOperator.Or,searchFilterCollection); return s; } public static void main(String[] args) throws Exception { init(); List<String> to = new ArrayList<String>(); to.add("*@jd.com"); to.add("*@163.com"); send("test",to,null,"hello"); GetUnreadEmails(); receive("", 5200); } /** * * ______________________________________________ */ /** serverName 接收郵件地址 user 使用者資訊 pwd 密碼 path 郵件臨時儲存路徑 max 每次接收郵件的最大數量 **/ public static void receive(String path, int max) throws Exception { //繫結郵箱 Folder inbox = Folder.bind(service, WellKnownFolderName.Inbox); //獲取郵箱檔案數量 int count = inbox.getTotalCount(); if(max > 0) count = count > max ? max : count; //迴圈獲取郵箱郵件 ItemView view = new ItemView(count); FindItemsResults<Item> findResults = service.findItems(inbox.getId(), view); for (Item item : findResults.getItems()) { EmailMessage message = EmailMessage.bind(service, item.getId()); List<Attachment> attachs = message.getAttachments().getItems();// System.out.println("id-->" + message.getId()); System.out.println("sender-->" + message.getSender()); System.out.println("sub-->" + item.getSubject()); // System.out.println("body-->" + message.getBody()); System.out.println("===========End=============" ); //處理附件 // try{ // if(message.getHasAttachments()){ // for(Attachment f : attachs){ // if(f instanceof FileAttachment){ // //接收郵件到臨時目錄 // File tempZip = new File(path,f.getName()); // ((FileAttachment)f).load(tempZip.getPath()); // } // } // //刪除郵件 //// message.delete(DeleteMode.HardDelete); // } // }catch(Exception err){ // } } } public static void receive(){ try { ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP2); ExchangeCredentials credentials = new WebCredentials("*@*.local", "*@*.07"); service.setCredentials(credentials); service.setUrl(new URI("https://" + "mail.*.com" + "/EWS/Exchange.asmx")); // Bind to the Inbox. Folder inbox = Folder.bind(service, WellKnownFolderName.Inbox);//獲取郵箱檔案數量 int count = inbox.getTotalCount(); System.out.println(count); System.out.println(inbox.getDisplayName()); ItemView view = new ItemView(10); FindItemsResults<Item> findResults = service.findItems(inbox.getId(), view); for (Item item : findResults.getItems()) { EmailMessage message = EmailMessage.bind(service, item.getId()); System.out.println("id-->" + message.getId()); System.out.println("sender-->" + message.getSender()); System.out.println("sub-->" + item.getSubject()); // System.out.println("body-->" + message.getBody()); System.out.println("===========End=============" ); } } catch (Exception e) { System.out.println("===========" + e.getMessage()); } } }

POP3:

import com.jr.gyl.pledge.base.common.mail.MailAuthenticator;

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.Properties;

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.MimeUtility;



/**

 * @author yh

 *

 */

public class ShowMail {



    private MimeMessage mimeMessage = null;

    private String saveAttachPath = ""; // 附件下載後的存放目錄

    private StringBuffer bodyText = new StringBuffer(); // 存放郵件內容的StringBuffer物件

    private String dateFormat = "yy-MM-dd HH:mm"; // 預設的日前顯示格式



    /**

     * 建構函式,初始化一個MimeMessage物件

     */

    public ShowMail() {

    }



    public ShowMail(MimeMessage mimeMessage) {

        this.mimeMessage = mimeMessage;

        System.out.println("建立一個ReceiveEmail物件....");

    }



    public void setMimeMessage(MimeMessage mimeMessage) {

        this.mimeMessage = mimeMessage;

        System.out.println("設定一個MimeMessage物件...");

    }



    /**

     * *獲得發件人的地址和姓名 

     */

    public String getFrom() throws Exception {

        InternetAddress address[] = (InternetAddress[]) mimeMessage.getFrom();

        String from = address[0].getAddress();

        if (from == null) {

            from = "";

            System.out.println("無法知道傳送者.");

        }

        String personal = address[0].getPersonal();



        if (personal == null) {

            personal = "";

            System.out.println("無法知道傳送者的姓名.");

        }



        String fromAddr = null;

        if (personal != null || from != null) {

            fromAddr = personal + "<" + from + ">";

            System.out.println("傳送者是:" + fromAddr);

        } else {

            System.out.println("無法獲得傳送者資訊.");

        }

        return fromAddr;

    }



    /**

     * *獲得郵件的收件人,抄送,和密送的地址和姓名,根據所傳遞的引數的不同

     * *"to"----收件人"cc"---抄送人地址"bcc"---密送人地址 

     */

    public String getMailAddress(String type) throws Exception {

        String mailAddr = "";

        String addType = type.toUpperCase();



        InternetAddress[] address = null;

        if (addType.equals("TO") || addType.equals("CC")

                || addType.equals("BCC")) {



            if (addType.equals("TO")) {

                address = (InternetAddress[]) mimeMessage

                        .getRecipients(Message.RecipientType.TO);

            } else if (addType.equals("CC")) {

                address = (InternetAddress[]) mimeMessage

                        .getRecipients(Message.RecipientType.CC);

            } else {

                address = (InternetAddress[]) mimeMessage

                        .getRecipients(Message.RecipientType.BCC);

            }



            if (address != null) {

                for (int i = 0; i < address.length; i++) {

                    String emailAddr = address[i].getAddress();

                    if (emailAddr == null) {

                        emailAddr = "";

                    } else {

                        System.out.println("轉換之前的emailAddr: " + emailAddr);

                        emailAddr = MimeUtility.decodeText(emailAddr);

                        System.out.println("轉換之後的emailAddr: " + emailAddr);

                    }

                    String personal = address[i].getPersonal();

                    if (personal == null) {

                        personal = "";

                    } else {

                        System.out.println("轉換之前的personal: " + personal);

                        personal = MimeUtility.decodeText(personal);

                        System.out.println("轉換之後的personal: " + personal);

                    }

                    String compositeto = personal + "<" + emailAddr + ">";

                    System.out.println("完整的郵件地址:" + compositeto);

                    mailAddr += "," + compositeto;

                }

                mailAddr = mailAddr.substring(1);

            }

        } else {

            throw new Exception("錯誤的電子郵件型別!");

        }

        return mailAddr;

    }



    /**

     * *獲得郵件主題 

     */

    public String getSubject() throws MessagingException {
        String subject = "";
        try {
            System.out.println("轉換前的subject:" + mimeMessage.getSubject());
            subject = MimeUtility.decodeText(mimeMessage.getSubject());
            System.out.println("轉換後的subject: " + mimeMessage.getSubject());
            if (subject == null) {
                subject = "";
            }
        } catch (Exception exce) {
            exce.printStackTrace();
        }
        return subject;
    }

    /**
     * *獲得郵件傳送日期 
     */

    public String getSentDate() throws Exception {
        Date sentDate = mimeMessage.getSentDate();
        System.out.println("傳送日期 原始型別: " + dateFormat);
        SimpleDateFormat format = new SimpleDateFormat(dateFormat);
        String strSentDate = format.format(sentDate);
        System.out.println("傳送日期 可讀型別: " + strSentDate);
        return strSentDate;
    }

    /**
     * *獲得郵件正文內容 
     */
    public String getBodyText() {
        return bodyText.toString();
    }

    /**
     * *解析郵件,把得到的郵件內容儲存到一個StringBuffer物件中,解析郵件
     * *主要是根據MimeType型別的不同執行不同的操作,一步一步的解析 
     */
    public void getMailContent(Part part) throws Exception {
        String contentType = part.getContentType();
        // 獲得郵件的MimeType型別
        System.out.println("郵件的MimeType型別: " + contentType);
        int nameIndex = contentType.indexOf("name");
        boolean conName = false;
        if (nameIndex != -1) {
            conName = true;
        }
        System.out.println("郵件內容的型別:" + contentType);
        if (part.isMimeType("text/plain") && conName == false) {
            // text/plain 型別
            bodyText.append((String) part.getContent());
        } else if (part.isMimeType("text/html") && conName == false) {
            // text/html 型別
            bodyText.append((String) part.getContent());
        } else if (part.isMimeType("multipart/*")) {
            // multipart/*
            Multipart multipart = (Multipart) part.getContent();
            int counts = multipart.getCount();
            for (int i = 0; i < counts; i++) {
                getMailContent(multipart.getBodyPart(i));
            }
        } else if (part.isMimeType("message/rfc822")) {
            // message/rfc822
            getMailContent((Part) part.getContent());
        } else {
        }
    }

    /**
     * *判斷此郵件是否需要回執,如果需要回執返回"true",否則返回"false" 
     */

    public boolean getReplySign() throws MessagingException {
        boolean replySign = false;
        String needReply[] = mimeMessage
                .getHeader("Disposition-Notification-To");
        if (needReply != null) {
            replySign = true;
        }
        if (replySign) {
            System.out.println("該郵件需要回復");
        } else {
            System.out.println("該郵件不需要回復");
        }
        return replySign;
    }

    /**
     *獲得此郵件的Message-ID 
     */
    public String getMessageId() throws MessagingException {
        String messageID = mimeMessage.getMessageID();
        System.out.println("郵件ID: " + messageID);
        return messageID;
    }

    /**
     * 判斷此郵件是否已讀,如果未讀返回false,反之返回true
     */

    public boolean isNew() throws MessagingException {
        boolean isNew = false;
        Flags flags = ((Message) mimeMessage).getFlags();
        Flags.Flag[] flag = flags.getSystemFlags();
        System.out.println("flags的長度:" + flag.length);
        for (int i = 0; i < flag.length; i++) {
            if (flag[i] == Flags.Flag.SEEN) {
                isNew = true;
                System.out.println("seen email...");
                // break;
            }
        }
        return isNew;
    }

    /**
     * 判斷此郵件是否包含附件
     */
    public boolean isContainAttach(Part part) throws Exception {
        boolean attachFlag = false;
        // String contentType = part.getContentType();
        if (part.isMimeType("multipart/*")) {
            Multipart mp = (Multipart) part.getContent();
            for (int i = 0; i < mp.getCount(); i++) {
                BodyPart mPart = mp.getBodyPart(i);
                String disposition = mPart.getDisposition();
                if ((disposition != null)

                        && ((disposition.equals(Part.ATTACHMENT)) || (disposition

                        .equals(Part.INLINE))))

                    attachFlag = true;

                else if (mPart.isMimeType("multipart/*")) {

                    attachFlag = isContainAttach((Part) mPart);

                } else {

                    String conType = mPart.getContentType();
                    if (conType.toLowerCase().indexOf("application") != -1)
                        attachFlag = true;
                    if (conType.toLowerCase().indexOf("name") != -1)
                        attachFlag = true;
                }
            }
        } else if (part.isMimeType("message/rfc822")) {
            attachFlag = isContainAttach((Part) part.getContent());
        }
        return attachFlag;
    }

    /**
     * *儲存附件 
     */
    public void saveAttachMent(Part part) throws Exception {

        String fileName = "";

        if (part.isMimeType("multipart/*")) {
            Multipart mp = (Multipart) part.getContent();
            for (int i = 0; i < mp.getCount(); i++) {
                BodyPart mPart = mp.getBodyPart(i);
                String disposition = mPart.getDisposition();
                if ((disposition != null)
                        && ((disposition.equals(Part.ATTACHMENT)) || (disposition
                        .equals(Part.INLINE)))) {
                    fileName = mPart.getFileName();
                    if (fileName.toLowerCase().indexOf("gb2312") != -1) {
                        fileName = MimeUtility.decodeText(fileName);
                    }
                    saveFile(fileName, mPart.getInputStream());
                } else if (mPart.isMimeType("multipart/*")) {
                    saveAttachMent(mPart);
                } else {
                    fileName = mPart.getFileName();
                    if ((fileName != null)
                            && (fileName.toLowerCase().indexOf("GB2312") != -1)) {
                        fileName = MimeUtility.decodeText(fileName);
                        saveFile(fileName, mPart.getInputStream());
                    }
                }
            }

        } else if (part.isMimeType("message/rfc822")) {

            saveAttachMent((Part) part.getContent());

        }

    }



    /**
     *設定附件存放路徑
     */
    public void setAttachPath(String attachPath) {
        this.saveAttachPath = attachPath;
    }

    /**
     * *設定日期顯示格式 
     */
    public void setDateFormat(String format) throws Exception {
        this.dateFormat = format;
    }

    /**
     * *獲得附件存放路徑 
     */
    public String getAttachPath() {
        return saveAttachPath;
    }

    /**

     * *真正的儲存附件到指定目錄裡 

     */

    private void saveFile(String fileName, InputStream in) throws Exception {

        String osName = System.getProperty("os.name");

        String storeDir = getAttachPath();

        String separator = "";

        if (osName == null) {

            osName = "";

        }

        if (osName.toLowerCase().indexOf("win") != -1) {

            separator = "\\";

            if (storeDir == null || storeDir.equals(""))

                storeDir = "c:\\tmp";

        } else {

            separator = "/";

            storeDir = "/tmp";

        }

        File storeFile = new File(storeDir + separator + fileName);

        System.out.println("附件的儲存地址:" + storeFile.toString());

        // for(inti=0;storefile.exists();i++){

        // storefile=newFile(storedir+separator+fileName+i);

        // }

        BufferedOutputStream bos = null;

        BufferedInputStream bis = null;



        try {

            bos = new BufferedOutputStream(new FileOutputStream(storeFile));

            bis = new BufferedInputStream(in);

            int c;

            while ((c = bis.read()) != -1) {

                bos.write(c);

                bos.flush();

            }

        } catch (Exception exception) {

            exception.printStackTrace();

            throw new Exception("檔案儲存失敗!");

        } finally {

            bos.close();

            bis.close();

        }

    }



    /**

     *ReceiveEmail類測試

     */

    public static void main(String args[]) throws Exception {

//        String host = "smtp.jd.com";
        String host = "pop3.jd.com";
        String username = "
[email protected]
"; String password = "[email protected]"; Properties props = new Properties(); // Session session = Session.getDefaultInstance(props, null); // 初始化props props.put("mail.smtp.host", host); props.put("mail.smtp.auth", "true"); // 驗證 MailAuthenticator authenticator = new MailAuthenticator(username, password); // 建立session Session session = Session.getInstance(props, authenticator); Store store = session.getStore("pop3"); store.connect(host, username, password); Folder folder = store.getFolder("INBOX"); folder.open(Folder.READ_ONLY); Message message[] = folder.getMessages(); System.out.println("郵件數量:" + message.length); ShowMail re = null; for (int i = 0; i < message.length; i++) { re = new ShowMail((MimeMessage) message[i]); System.out.println("郵件" + i + "主題:" + re.getSubject()); System.out.println("郵件" + i + "傳送時間:" + re.getSentDate()); System.out.println("郵件" + i + "是否需要回復:" + re.getReplySign()); System.out.println("郵件" + i + "是否已讀:" + re.isNew()); System.out.println("郵件" + i + "是否包含附件:" + re.isContainAttach((Part) message[i])); System.out.println("郵件" + i + "傳送人地址:" + re.getFrom()); System.out.println("郵件" + i + "收信人地址:" + re.getMailAddress("to")); System.out.println("郵件" + i + "抄送:" + re.getMailAddress("cc")); System.out.println("郵件" + i + "暗抄:" + re.getMailAddress("bcc")); re.setDateFormat("yy年MM月dd日HH:mm"); System.out.println("郵件" + i + "傳送時間:" + re.getSentDate()); System.out.println("郵件" + i + "郵件ID:" + re.getMessageId()); re.getMailContent((Part) message[i]); System.out.println("郵件" + i + "正文內容:\r\n" + re.getBodyText()); re.setAttachPath("e:\\"); re.saveAttachMent((Part) message[i]); } } }