天天看點

使用Apache commons email發送郵件

今天研究了一下怎麼用java代碼發送郵件,用的是Apache的commons-email包。

據說這個包是對javamail進行了封裝,簡化了操作。 這裡講一下具體用法吧

一.首先你需要有郵箱賬号和一個授權碼。

需要進入到QQ郵箱或者是網易郵箱裡面去擷取。在郵箱的設定->賬戶裡面,開啟如下服務,就能得到一個授權碼,這個授權碼要好好保管。有了這兩個東西就能夠通過第三方用戶端發送郵件了。

使用Apache commons email發送郵件

二.導入commons-email的maven依賴。

我用的是1.4,也可以去maven倉庫網站(https://mvnrepository.com)上面找别的版本。

<dependency>
     <groupId>org.apache.commons</groupId>
     <artifactId>commons-email</artifactId>
     <version>1.4</version>
 </dependency>      

三.然後就可以寫發送郵件的代碼了。

我在網上找了幾個案例,如下。

 1.發送簡單文本郵件。這是最簡單也是最常用的。

/**
     * @describe 發送内容為簡單文本的郵件
     * @throws EmailException
     */
    public static void sendSimpleTextEmail() throws EmailException {
         Email email = new SimpleEmail();
         //設定主機名,QQ郵箱是"smtp.qq.com",網易郵箱是"smtp.163.com"
         email.setHostName("smtp.163.com");
         // 使用者名和密碼為郵箱的賬号和授權碼(不需要進行base64編碼)
         email.setAuthenticator(new DefaultAuthenticator("[email protected]", "myshouquanma"));
         //設定SSL連接配接,這樣寫就對了
         email.setSSLOnConnect(true);
         //設定來源,就是發送方的郵箱位址
         email.setFrom("[email protected]");
         //設定主題,可以不設定
         email.setSubject("java發送郵件");
         //設定資訊,就是内容,這個必須要有
         email.setMsg("這是測試郵件 ... :-)");
         //接收人郵箱位址
         email.addTo("[email protected]");
         email.send();
    }      

2.發送包含附件的郵件(附件為本地資源),這裡用到了一個EmailAttachment對象,也就是附件的意思

/**
     * @describe 發送包含附件的郵件(附件為本地資源)
     * @throws EmailException
     */
    public static void sendEmailsWithAttachments() throws EmailException {
        // 建立一個attachment(附件)對象
        EmailAttachment attachment = new EmailAttachment();
        //設定上傳附件的位址
        attachment.setPath("C:\\Users\\Administrator\\Pictures\\Saved Pictures\\conti.png");
        attachment.setDisposition(EmailAttachment.ATTACHMENT);
        //這個描述可以随便寫
        attachment.setDescription("Picture of conti");
        //這個名稱要注意和檔案格式一緻,這将是接收人下載下傳下來的檔案名稱
        attachment.setName("conti.png");

        //因為要上傳附件,是以用MultiPartEmail()方法建立一個email對象,固定步驟都是一樣的
        MultiPartEmail email = new MultiPartEmail();
        email.setHostName("smtp.163.com");
        email.setAuthenticator(new DefaultAuthenticator("[email protected]", "myshouquanma"));
        email.setSSLOnConnect(true);
        email.addTo("[email protected]", "Conti Zhang");
        email.setFrom("[email protected]", "Me");
        email.setSubject("圖檔");
        email.setMsg("這是發送給你的圖檔");
        //将附件添加到郵件
        email.attach(attachment);

        email.send();
    }      

3.發送包含附近的郵件(附件為線上資源),這個與上傳本地附件稍有差別,注意一下就行

  /**
     * @describe 發送包含附件的郵件(附件為線上資源)
     * @throws EmailException
     * @throws MalformedURLException
     */
    public static void sendEmailsWithOnlineAttachments() throws EmailException, MalformedURLException {
        EmailAttachment attachment = new EmailAttachment();
        //設定線上資源路徑,和上傳本地附件的唯一差別
        attachment.setURL(new URL("http://www.apache.org/images/asf_logo_wide.gif"));
        attachment.setDisposition(EmailAttachment.ATTACHMENT);
        attachment.setDescription("Apache logo");
        attachment.setName("Apache logo.gif");

        MultiPartEmail email = new MultiPartEmail();
        email.setHostName("smtp.163.com");
        email.setAuthenticator(new DefaultAuthenticator("[email protected]", "myshouquanma"));
        email.setSSLOnConnect(true);
        email.addTo("[email protected]", "Conti Zhang");
        email.setFrom("[email protected]", "Me");
        email.setSubject("The logo");
        email.setMsg("Here is Apache\'s logo");
        email.attach(attachment);
        email.send();
    }      

4.發送内容為HTML格式的郵件,有些郵件直接打開就是一個HTML頁面。雖然不一定用到,可以了解一下

  /**
     * @describe 發送内容為HTML格式的郵件
     * @throws EmailException
     * @throws MalformedURLException
     */
    public static void sendHTMLFormattedEmail() throws EmailException, MalformedURLException {
        // 這裡需要使用HtmlEmail建立一個email對象
        HtmlEmail email = new HtmlEmail();
        email.setHostName("smtp.163.com");
        email.setAuthenticator(new DefaultAuthenticator("[email protected]", "myshouquanma"));
        email.addTo("[email protected]", "Conti Zhang");
        email.setFrom("[email protected]", "Me");
        email.setSubject("Test email with inline image");

        // 嵌入圖像并擷取内容id,雖然案例這樣寫,但我感覺直接在html内容裡面寫圖檔網絡位址也可以
        URL url = new URL("http://www.apache.org/images/asf_logo_wide.gif");
        String cid = email.embed(url, "Apache logo");

        // 設定html内容
        email.setHtmlMsg("<html>The apache logo - <img src=\"cid:" + cid + "\"></html>");

        // 設定替代内容,如果不支援html
        email.setTextMsg("你的郵件用戶端不支援html郵件");
        email.send();
    }

      

5.發送内容為HTML格式的郵件(嵌入圖檔更友善)

這裡用到了DataSourceFileResolver對象,和DataSourceUrlResolver對象,前者可以解析本地檔案路徑,後者可以解析網絡路徑

具體用法如下

/**
     * @describe 發送内容為HTML格式的郵件(嵌入圖檔更友善)
     * @throws MalformedURLException
     * @throws EmailException
     */
    public static void sendHTMLFormattedEmailWithEmbeddedImages() throws MalformedURLException, EmailException {
        //html郵件模闆
        String htmlEmailTemplate = "<img src=\"http://www.conti.com/images/1.jpg\">";
        DataSourceResolver[] dataSourceResolvers =new DataSourceResolver[]{new DataSourceFileResolver(),new DataSourceUrlResolver(new URL("http://"))};
        email.setDataSourceResolver(new DataSourceCompositeResolver(dataSourceResolvers));
        email.setHostName("smtp.qq.com");
        email.setAuthenticator(new DefaultAuthenticator("[email protected]", "myshouquanma"));
        email.addTo("[email protected]", "Conti Zhang");
        email.setFrom("[email protected]", "Me");
        email.setSubject("Test email with inline image");
        email.setHtmlMsg(htmlEmailTemplate);
        email.setTextMsg("你的郵件用戶端不支援html郵件");

        email.send();
    }      

此種方式可能會報錯,會被郵箱認為是有害郵件不接收而導緻發送失敗。解決方法就是,網易郵箱不行就換QQ郵箱,我就是這樣做的

好了,就這麼多,歡迎讨論!