javamail發(fā)送附件DataSource使用文件流解決過程
問題
在使用james郵件服務(wù)器發(fā)送郵件時(shí),附件是存儲(chǔ)在華為云服務(wù)器上的,只能通過Apache HttpClient去下載,存儲(chǔ)在FTP上的文件同樣會(huì)碰到這個(gè)問題。
API上郵件添加附件的方法:
/*************1.本地文件*************/ // 將本地文件作為附件 DataSource dataSource = new FileDataSource("d:/測(cè)試文檔.doc");
/*************2.網(wǎng)絡(luò)文件*************/ // 將網(wǎng)絡(luò)文件作為附件 URL url = new URL("www.test.com/file/ceshi.doc"); DataSource dataSource = new URLDataSource(url);
這兩種方式都不能滿足需求
解決方案
使用ByteArrayDataSource
關(guān)鍵代碼:
/*************3.文件流*************/ DataSource dataSource = new ByteArrayDataSource(inputStream, "application/octet-stream");
完整發(fā)送郵件代碼:
import java.io.InputStream; import java.util.Date; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.mail.Address; import javax.mail.BodyPart; import javax.mail.Message; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import javax.mail.internet.MimeUtility; import javax.mail.util.ByteArrayDataSource; public class MailService { /** * 發(fā)送郵件 * @param session 連接james郵件獲取 * @param inputStream 通過下載的方式獲取文件流 * @param fileName 文件名稱帶后綴 */ public void sendMail(Session session,InputStream inputStream,String fileName) { try { if(session == null){ return; } // 創(chuàng)建一個(gè)MimeMessage 對(duì)象 MimeMessage mimeMessage = new MimeMessage(session); // 指定發(fā)件人郵箱,包括姓名 mimeMessage.setFrom(new InternetAddress("test@163.com", "測(cè)試人員", "UTF-8")); // 收件人地址 Address[] to = InternetAddress.parse("to@163.com"); // 指定收件人郵箱 mimeMessage.addRecipients(Message.RecipientType.TO, to); //沒有抄送人可以忽略 Address[] cc = InternetAddress.parse("cc@163.com"); // 指定抄送人郵箱 mimeMessage.addRecipients(Message.RecipientType.CC, cc); // 指定郵件主題 mimeMessage.setSubject("發(fā)送帶附件的郵件"); // 指定郵件發(fā)送日期 mimeMessage.setSentDate(new Date()); // 指定郵件優(yōu)先級(jí) 1:緊急 3:普通 5:緩慢 mimeMessage.setHeader("X-Priority", "3"); MimeMultipart mimeMultipart = new MimeMultipart("mixed"); mimeMessage.setContent(mimeMultipart); //內(nèi)容 MimeBodyPart bodyPart = new MimeBodyPart(); mimeMultipart.addBodyPart(bodyPart); // 新建一個(gè)存放郵件附件的BodyPart對(duì)象 BodyPart fileBodyPart = new MimeBodyPart(); /*************1.本地文件*************/ // 將本地文件作為附件 // DataSource dataSource = new FileDataSource("d:/測(cè)試文檔.doc"); /*************2.網(wǎng)絡(luò)文件*************/ // 將網(wǎng)絡(luò)文件作為附件 // URL url = new URL("www.test.com/file/ceshi.doc"); // DataSource dataSource = new URLDataSource(url); /*************3.文件流*************/ DataSource dataSource = new ByteArrayDataSource(inputStream, "application/octet-stream"); fileBodyPart.setDataHandler(new DataHandler(dataSource)); // 處理郵件中附件文件名的中文問題 String attachName = MimeUtility.encodeText(fileName); // 設(shè)定附件文件名 fileBodyPart.setFileName(attachName); // 添加附件 mimeMultipart.addBodyPart(fileBodyPart); //發(fā)給外部郵箱需要添加附件 //BODY(包括:圖片,html) MimeMultipart bodyMultipart = new MimeMultipart("related"); bodyPart.setContent(bodyMultipart); MimeBodyPart html = new MimeBodyPart(); bodyMultipart.addBodyPart(html); //html html.setContent("測(cè)試發(fā)送帶附件的郵件","text/html;charset=gbk"); mimeMessage.saveChanges(); // 發(fā)送郵件 Transport.send(mimeMessage, mimeMessage.getAllRecipients()); } catch (Exception e) { e.printStackTrace(); } } }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java數(shù)據(jù)結(jié)構(gòu)及算法實(shí)例:冒泡排序 Bubble Sort
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)及算法實(shí)例:冒泡排序 Bubble Sort,本文直接給出實(shí)現(xiàn)代碼,代碼中包含詳細(xì)注釋,需要的朋友可以參考下2015-06-06Java Socket+mysql實(shí)現(xiàn)簡(jiǎn)易文件上傳器的代碼
最近在做一個(gè)小項(xiàng)目,項(xiàng)目主要需求是實(shí)現(xiàn)一個(gè)文件上傳器,通過客戶端的登陸,把本地文件上傳到服務(wù)器的數(shù)據(jù)庫(kù)(本地的)。下面通過本文給大家分享下實(shí)現(xiàn)代碼,感興趣的朋友一起看看吧2016-10-10MyBatis Mapper.xml入?yún)ist使用in函數(shù)問題
文章主要講述了在使用MyBatis的Mapper.xml文件時(shí),如何正確地在in函數(shù)中使用List作為入?yún)?作者強(qiáng)調(diào)了完整拷貝<if>...</if>格式的重要性,并指出稍微的改動(dòng)就會(huì)導(dǎo)致錯(cuò)誤2025-02-02springboot集成Swagger的方法(讓你擁有屬于自己的api管理器)
在大型的項(xiàng)目中,如果你有非常多的接口需要統(tǒng)一管理,或者需要進(jìn)行接口測(cè)試,那么我們通常會(huì)在繁雜地api中找到需要進(jìn)行測(cè)試或者管理的接口,接下來通過本文給大家介紹springboot集成Swagger的方法讓你擁有屬于自己的api管理器,感興趣的朋友一起看看吧2021-11-11Spring Boot 2.x中Actuator的一些知識(shí)點(diǎn)
這篇文章主要給大家介紹了關(guān)于Spring Boot 2.x中Actuator的一些知識(shí)點(diǎn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring Boot 2.x具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09java報(bào)錯(cuò):找不到或無法加載主類的解決方法簡(jiǎn)單粗暴
本文主要介紹了java報(bào)錯(cuò):找不到或無法加載主類的解決方法簡(jiǎn)單粗暴,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01Java利用StampedLock實(shí)現(xiàn)讀寫鎖的方法詳解
在jdk8以后,java提供了一個(gè)性能更優(yōu)越的讀寫鎖并發(fā)類StampedLock,該類的設(shè)計(jì)初衷是作為一個(gè)內(nèi)部工具類,用于輔助開發(fā)其它線程安全組件。本文就來和大家一起學(xué)習(xí)下StampedLock的功能和使用2022-10-10Java實(shí)現(xiàn)生成n個(gè)不重復(fù)的隨機(jī)數(shù)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)生成n個(gè)不重復(fù)的隨機(jī)數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05