Apache common mail 包相關類解析

jopen 12年前發布 | 21K 次閱讀 常用工具包 Common Mail

在common mail包中總共有8各類,主要是那個Email類,這個類里面包括了發送郵件的幾乎全部方法。它的子類MultiPartEmail擴展了幾個簡單的方法,主要的是擴展一個郵件附件的方法,MultiPartEmail的子類HtmlEmail定義了幾個重載的embed方法,這幾個方法我覺得在平常工作當中用到的機會不是很多。其他的幾個類都是在這三個類當中作為方法參數或者變量出現。

所以我們在實現郵件發送的功能上,我們足足可以只使用HtmlEmail類來操作。創建一個HtmlEmail如下:

private final HtmlEmail createHtmlEmail() {
        HtmlEmail email = new HtmlEmail();
        email.setHostName(hostname);
        email.setSmtpPort(port);
        email.setCharset("GBK");
        email.setAuthentication(sender, password);
        return email;
    }
這些方法都不是HtmlEmail類中的,全部都是Email中的方法。而發送的代碼可以像下面這樣寫:

if(mailEntry != null) {
                htmlEmail.setSubject(mailEntry.getTitle());
                try {
                    htmlEmail.addTo(mailEntry.getRecipient());
                    htmlEmail.setFrom(sender);
                    htmlEmail.setHtmlMsg(mailEntry.getContent());
                    if (mailEntry.getAttachment() != null) {
                        htmlEmail.attach(mailEntry.getAttachment());
                    }
                    htmlEmail.send();
                } catch (EmailException ex) {
                    LOGGER.error(String.format("HtmlEmail send failure. Cause: %s", ex.getMessage()));
                }
            }
mailEntry是自己寫的一個pojo類。沒什么好說的。上面代碼中的一些方法中setHtmlMsg是HtmlEmail類自身的,這個方法很簡單,只是簡單的賦值操作。attach方法是MultiPartEmail,方法的具體實現可以自己看源碼,其他的方法也都是Email的。

當需要發送群郵件時,也是很簡單的,Email類都為我們封裝好了,我們需要做的只是簡單的拼裝郵件的內容,發送者,接受者等等信息:

public void sendMultiplyMails(MailEntry mail) throws EmailException {
        if (mail.getRecipients() != null && mail.getRecipients().size() == 1) {
            mail.setRecipient(mail.getRecipients().get(0));
            sendMail(mail);
            return;
        }
        HtmlEmail email = createHtmlEmail();
        email.setSubject(mail.getTitle());
        try {
            email.setTo(mail.getRecipients());
            email.setFrom(sender);
            email.setHtmlMsg(mail.getContent());
            email.send();
        } catch (EmailException ex) {
            LOGGER.error("HtmlEmail send failure. Cause " + ex.getMessage());
        }
    }
另外一個問題是我們需不需要將郵件發送的代碼放入一個線程當中,如果我們把相關方法放入一個線程的run方法內,那么執行這個方法我們需要new Thread(new XxxThread()).start或new XxxThread().start的方法來執行。我們可以使用線程來實現多任務,如果沒有使用線程有可能會出現代碼的混亂執行(就變得不是并發的了,關于并發的只是可以查看相關書籍)。當然我們使用了線程實現的話我們還需要對線程的停止進行相關的操作:

private static void stopTask(Thread task) {
        if(task != null && task.isAlive()) {
            try {
                task.join();
            } catch(InterruptedException ex) {
                // 線程被中斷
            } catch(Exception ex) {
                task.interrupt();
            }
        }
    }
join()方法的意思是等待線程消亡,注意這里是無參數的,這就意味著永遠等待下去if(l == 0L) for(; isAlive(); wait(0L));在等待過程中別的線程不能執行相關代碼。這樣就相當于實現了同步。
所以我們在發送郵件時最好還是將代碼放入線程當中。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!