java實現發送郵件可多個附件內嵌圖片-commons-email使用

yn6e 9年前發布 | 8K 次閱讀 Java

前言

       java實現發郵件功能,其實SUN在javaEE的開發包里給我們提供了相關的工具,利用 mail.jar 和 activation.jar可以實現這個功能,n年前包括我第一次實習的時候項目上也是用SUN提供的包實現的,實現起來比較繁瑣麻煩,今天我們就用 Apache的工具包commons-email包來實現發送帶郵件和內嵌圖片的功能,它是把前者做了下封裝,使用起來更加的簡易方便明了,所以我們使用 commons-email來實現發送郵件的功能,必須也引入mail.jar,activation.jar2個依賴包,MyEclipse中是自帶 的,所以你如果不知道commons-email.jar還需要依賴這個2個包的話,一旦把項目換到其他開發環境中,可能就出現ClassNotFund 異常,不知道的你可能可能還在郁悶之中呢,這里給大家提供一下這三個jar包免費下載地址:java郵件功能jar包免費下載,好了廢話,不多說,直接切入代碼,代碼中我注釋的很詳盡,就不做多余的解釋了,大家一看就明白了。

說明

           由于時間緊,一直忙于項目的封閉開發,所以先直接貼出實現代碼 和測試代碼,暫時不做排版和各個功能代碼的說明和注意事項,不過代碼注釋已非常詳盡,大家一看就會明白的,等有時間了會對博文做進一步的修色和排版、代碼 的說明以方面大家更好的理解和掌握,如有什么疑問或建議,歡迎留言!


實現代碼:

    package sendemail;

import java.net.MalformedURLException;  
import java.net.URL;  
import java.util.Map;  

import javax.mail.MessagingException;  

import org.apache.commons.mail.EmailAttachment;  
import org.apache.commons.mail.EmailException;  
import org.apache.commons.mail.HtmlEmail;  
import org.apache.commons.mail.ImageHtmlEmail;  
import org.apache.commons.mail.resolver.DataSourceUrlResolver;  

public class Email {  
    //郵箱服務器的登錄用戶名  
    private static String username="642417953@qq.com";  
    //郵箱服務器的密碼  
    private static String password="1234567890";  
    //郵箱服務器smtp host,此處采用自己的QQ郵箱作為郵件服務器  
    private static String smtpHost="smtp.qq.com";  
    //發送方的郵箱(必須為郵箱服務器的登錄用戶名)  
    private static String fromEmail="642417953@qq.com";  
    //發送方姓名  
    private static String fromUsername="某某公司";  
    //郵件內容編碼,防止亂碼  
    private static String charset="UTF-8";  

    /** 
     *java發送郵件-commons-email 
     * @param nameAndAddrMap 用戶名及對應的郵箱組成的Map 
     * @param subject 郵件主題或標題 
     * @param htmlContent 郵件內容html格式 
     * @throws EmailException 
     * @throws MessagingException 
     * @author chenleixing 
     */  
    public static void sendEmail(Map<String,String> nameAndAddrMap,String subject,String htmlContent)  
        throws EmailException, MessagingException{  
        //SimpleEmail email = new SimpleEmail();//創建簡單郵件,不可附件、HTML文本等  
        //MultiPartEmail  email = new MultiPartEmail();//創建能加附件的郵件,可多個、網絡附件亦可  
        /*ImageHtmlEmail:HTML文本的郵件、通過2代碼轉轉內聯圖片,  1.3新增的,但我怎么也測試不成功 
          ImageHtmlEmail網上都是官網上例子而官網上例子比較模糊 
          ImageHtmlEmail email=new ImageHtmlEmail();*/  
        HtmlEmail email = new HtmlEmail();//創建能加附件內容為HTML文本的郵件、HTML直接內聯圖片但必須用setHtmlMsg()傳郵件內容  

        //email.setDebug(true);//是否開啟調試默認不開啟  
        email.setSSLOnConnect(true);//開啟SSL加密  
        email.setStartTLSEnabled(true);//開啟TLS加密  

        //設置smtp host,此處采用自己的QQ郵箱作為郵件服務器  
        email.setHostName(Email.smtpHost);  
        //登錄郵件服務器的用戶名和密碼(保證郵件服務器POP3/SMTP服務開啟)  
        email.setAuthentication(Email.username, Email.password);  

        email.setFrom(Email.fromEmail,Email.fromUsername);//發送方  
        for(Map.Entry<String, String> map:nameAndAddrMap.entrySet()){//遍歷用戶名及對應的郵箱地址組成的map  
            email.addTo(map.getValue(),map.getKey());//接收方郵箱和用戶名  
        }  
        //email.addCc("chen_leixing@qq.com");//抄送方  
        //email.addBcc("leixing_chen@120.com");//秘密抄送方  

        email.setCharset(Email.charset);//設置郵件的字符集為UTF-8防止亂碼  
        email.setSubject(subject);//主題  
        email.setHtmlMsg(htmlContent);//郵件內容:<font color='red'>測試簡單郵件發送功能!</font>  

        /*HtmlEmail、ImageHtmlEmail有setHtmlMsg()方法,且可以直接內聯圖片,可網上都搞那么復雜說不行如 
         *<img src='http://www.apache.org/images/asf_logo_wide.gif' />本人測試新浪、搜狐、QQ郵箱等都能顯示 
         */  
        /*//如果使用setMsg()傳郵件內容,則HtmlEmail內嵌圖片的方法 
        URL url = new URL("http://www.jianlimuban.com/圖片");   
        String cid = email.embed(url, "名字");   
        email.setHtmlMsg("<img src='cid:"+cid+"' />");*/  

        //這是ImageHtmlEmail的內嵌圖片方法,我多次測試都不行,官網提供比較模糊,而大家都是用官網舉的例子  
        //內嵌圖片,此處會拋出MessagingException, MalformedURLException異常  
        //URL url=new URL("http://www.apache.org");//定義你基本URL來解決相對資源的位置  
        //email.setDataSourceResolver(new DataSourceUrlResolver(url));//這樣HTML內容里如果有此路徑下的圖片會直接內聯  

        //創建郵件附件可多個   
        EmailAttachment attachment = new EmailAttachment();//創建附件  
        attachment.setPath("D:\\MongoDB.txt");//本地附件,絕對路徑    
        //attachment.setURL(new URL("http://www.baidu.com/moumou附件"));//可添加網絡上的附件  
        attachment.setDisposition(EmailAttachment.ATTACHMENT);  
        attachment.setDescription("MongoDB入門精通");//附件描述   
        attachment.setName("NoSQL數據庫");//附件名稱  
        email.attach(attachment);//添加附件到郵件,可添加多個  
        email.attach(attachment);//添加附件到郵件,可添加多個  

        /*email.buildMimeMessage();//構建內容類型 , 
        //設置內容的字符集為UTF-8,先buildMimeMessage才能設置內容文本 ,但不能發送HTML格式的文本 
        email.getMimeMessage().setText("<font color='red'>測試簡單郵件發送功能!</font>","UTF-8");*/  

        email.send();//發送郵件  
    }     
}  </pre> 


測試代碼:

    package sendemail;

import java.util.Map;  

import org.junit.Test;  

import com.google.common.collect.Maps;  


public class EmailTest {  

    @Test  
    public void testSendSimpleEmail(){  

        //用戶名和對應的郵箱  
        Map<String,String> nameAndAddrMap=Maps.newHashMap();//新建一個map  
        nameAndAddrMap.put("張三","chen*****@sina.com");  
        nameAndAddrMap.put("李四","leixing*****@163.com");  
        nameAndAddrMap.put("王麻子","chenxing*****@qq.com");  
        String htmlContent="<font color='red'>測試簡單郵件發送功能!</font>";//郵件內容  
        String subject="新年好!";//主題或者標題  
        try {  
            Email.sendEmail(nameAndAddrMap,subject,htmlContent);//測試發送郵件功能  
        } catch( Exception e) {  
            System.out.println("郵件發送失敗!");  
            //logger.setMessage(e.getMessage());  
        }  
    }  
}  </pre> 


出處:http://blog.csdn.net/chenleixing/article/details/44708533

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