1. 程式人生 > >java郵件自動傳送時新增網路附件

java郵件自動傳送時新增網路附件

查了很多資料都是使用本地資源作為附件傳送。但是資料和程式分開時,還需要先下載資料,儲存到本地再發送郵件。查了很多資料後,發現apach提供了很好的一個commons-mail.jar包,做了很好的封裝,簡單易用。下載地址是http://commons.apache.org/proper/commons-email/download_email.cgi

public void sendHtmlEmailWithImg() throws Exception {  
        String htmlEmailContent = "這是一張用於測試的圖片,請查收。 <img src=\"D:/1.png\"> "  
                + " <img src=\"http://commons.apache.org/proper/commons-email/images/commons-logo.png\">";  
        ImageHtmlEmail email = new ImageHtmlEmail();//用ImageHtmlEmail來發送  
        email.setDebug(true);//可以看到執行過程的debug資訊  
        email.setCharset("UTF-8");//防止亂碼  
        email.setSSLCheckServerIdentity(true);  
        email.setSslSmtpPort("465"); // 設定SSL埠  
          
        //解析本地圖片和網路圖片都有的html檔案重點就是下面這兩行;  
        //ImageHtmlEmail通過setDataSourceResolver來識別並嵌入圖片  
        //檢視DataSourceResolver的繼承結構發現有幾個好用的子類  
        DataSourceResolver[] dataSourceResolvers =   
                new DataSourceResolver[]{new DataSourceFileResolver(),//新增DataSourceFileResolver用於解析本地圖片  
                new DataSourceUrlResolver(new URL("http://"))};//新增DataSourceUrlResolver用於解析網路圖片,注意:new URL("http://")  
        //DataSourceCompositeResolver類可以加入多個DataSourceResolver,  
        //把需要的DataSourceResolver放到一個數組裡傳進去就可以了;  
        email.setDataSourceResolver(new DataSourceCompositeResolver(dataSourceResolvers));  
                 // 郵箱登陸資訊
        email.setHostName("smtp.qq.com");  
        email.addTo("*@qq.com", "Jo");  
        email.setFrom("*@qq.com", "Me"); // 必須和登陸郵箱名一致,否則會報錯 
        email.setAuthenticator(new DefaultAuthenticator("*@qq.com", "********")); // 郵箱名和登陸密碼  
        email.setSubject("傳送一張圖片,看看是否可以收到。");  
          
        email.setHtmlMsg(htmlEmailContent);  
  
        //如果客戶端不去持HTML格式會顯示這句話,不過應該很少有不支援HTML格式的客戶端了吧  
        email.setTextMsg("你的郵箱客戶端不支援HTML格式郵件");  
        email.send();  
    }  

如果使用QQ郵箱做測試需要注意,QQ郵箱對圖片顯示不太友好,需要點選顯示圖片才能顯示。

ImageHtmlEmail也可以直接新增網路資源作為附件

/**
	 * 為郵件新增附件
	 * @param email 郵件
	 * @param urls 附件連結
	 * @param names 附件名稱,最好有後綴名才能預覽檔案
	 */
	public void addAttachment(ImageHtmlEmail email, List<String> urls, List<String> names) {
		// 保證附件名的長度和連結一一對應
		while(urls.size() > names.size()) {
			names.add("");
		}
		
		for(int i = 0; i < urls.size(); i++) {
			EmailAttachment attachment = new EmailAttachment();
			 try {
				attachment.setURL(new URL(urls.get(i)));
				attachment.setDisposition(EmailAttachment.ATTACHMENT);
//				attachment.setDescription("Apache logo");
				attachment.setName(names.get(i));
			} catch (MalformedURLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			try {
				email.attach(attachment); // 將附件新增到郵件中
			} catch (EmailException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}