javamail發(fā)送附件DataSource使用文件流解決過(guò)程
問(wèn)題
在使用james郵件服務(wù)器發(fā)送郵件時(shí),附件是存儲(chǔ)在華為云服務(wù)器上的,只能通過(guò)Apache HttpClient去下載,存儲(chǔ)在FTP上的文件同樣會(huì)碰到這個(gè)問(wèn)題。
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 通過(guò)下載的方式獲取文件流
* @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);
//沒(méi)有抄送人可以忽略
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));
// 處理郵件中附件文件名的中文問(wèn)題
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-06
Java Socket+mysql實(shí)現(xiàn)簡(jiǎn)易文件上傳器的代碼
最近在做一個(gè)小項(xiàng)目,項(xiàng)目主要需求是實(shí)現(xiàn)一個(gè)文件上傳器,通過(guò)客戶端的登陸,把本地文件上傳到服務(wù)器的數(shù)據(jù)庫(kù)(本地的)。下面通過(guò)本文給大家分享下實(shí)現(xiàn)代碼,感興趣的朋友一起看看吧2016-10-10
MyBatis Mapper.xml入?yún)ist使用in函數(shù)問(wèn)題
文章主要講述了在使用MyBatis的Mapper.xml文件時(shí),如何正確地在in函數(shù)中使用List作為入?yún)?作者強(qiáng)調(diào)了完整拷貝<if>...</if>格式的重要性,并指出稍微的改動(dòng)就會(huì)導(dǎo)致錯(cuò)誤2025-02-02
springboot集成Swagger的方法(讓你擁有屬于自己的api管理器)
在大型的項(xiàng)目中,如果你有非常多的接口需要統(tǒng)一管理,或者需要進(jìn)行接口測(cè)試,那么我們通常會(huì)在繁雜地api中找到需要進(jìn)行測(cè)試或者管理的接口,接下來(lái)通過(guò)本文給大家介紹springboot集成Swagger的方法讓你擁有屬于自己的api管理器,感興趣的朋友一起看看吧2021-11-11
Spring Boot 2.x中Actuator的一些知識(shí)點(diǎn)
這篇文章主要給大家介紹了關(guān)于Spring Boot 2.x中Actuator的一些知識(shí)點(diǎn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring Boot 2.x具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
java報(bào)錯(cuò):找不到或無(wú)法加載主類(lèi)的解決方法簡(jiǎn)單粗暴
本文主要介紹了java報(bào)錯(cuò):找不到或無(wú)法加載主類(lèi)的解決方法簡(jiǎn)單粗暴,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
Java利用StampedLock實(shí)現(xiàn)讀寫(xiě)鎖的方法詳解
在jdk8以后,java提供了一個(gè)性能更優(yōu)越的讀寫(xiě)鎖并發(fā)類(lèi)StampedLock,該類(lèi)的設(shè)計(jì)初衷是作為一個(gè)內(nèi)部工具類(lèi),用于輔助開(kāi)發(fā)其它線程安全組件。本文就來(lái)和大家一起學(xué)習(xí)下StampedLock的功能和使用2022-10-10
Java實(shí)現(xiàn)生成n個(gè)不重復(fù)的隨機(jī)數(shù)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)生成n個(gè)不重復(fù)的隨機(jī)數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05

