问题:在使用james邮件服务器发送邮件时,附件是存储在华为云服务器上的,只能通过Apache HttpClient去下载,存储在FTP上的文件同样会碰到这个问题。
API上邮件添加附件的方法:
/*************1.本地文件*************/
// 将本地文件作为附件
DataSource dataSource = new FileDataSource("d:/测试文档.doc");
/*************2.网络文件*************/
// 将网络文件作为附件
URL url = new URL("www.test.com/file/ceshi.doc");
DataSource dataSource = new URLDataSource(url);
这两种方式都不能满足需求
解决方案:
使用ByteArrayDataSource
关键代码:
/*************3.文件流*************/
DataSource dataSource = new ByteArrayDataSource(inputStream, "application/octet-stream");
完整发送邮件代码:
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 {
/**
* 发送邮件
* @param session 连接james邮件获取
* @param inputStream 通过下载的方式获取文件流
* @param fileName 文件名称带后缀
*/
public void sendMail(Session session,InputStream inputStream,String fileName) {
try {
if(session == null){
return;
}
// 创建一个MimeMessage 对象
MimeMessage mimeMessage = new MimeMessage(session);
// 指定发件人邮箱,包括姓名
mimeMessage.setFrom(new InternetAddress("test@163.com", "测试人员", "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("发送带附件的邮件");
// 指定邮件发送日期
mimeMessage.setSentDate(new Date());
// 指定邮件优先级 1:紧急 3:普通 5:缓慢
mimeMessage.setHeader("X-Priority", "3");
MimeMultipart mimeMultipart = new MimeMultipart("mixed");
mimeMessage.setContent(mimeMultipart);
//内容
MimeBodyPart bodyPart = new MimeBodyPart();
mimeMultipart.addBodyPart(bodyPart);
// 新建一个存放邮件附件的BodyPart对象
BodyPart fileBodyPart = new MimeBodyPart();
/*************1.本地文件*************/
// 将本地文件作为附件
// DataSource dataSource = new FileDataSource("d:/测试文档.doc");
/*************2.网络文件*************/
// 将网络文件作为附件
// 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);
// 设定附件文件名
fileBodyPart.setFileName(attachName);
// 添加附件
mimeMultipart.addBodyPart(fileBodyPart); //发给外部邮箱需要添加附件
//BODY(包括:图片,html)
MimeMultipart bodyMultipart = new MimeMultipart("related");
bodyPart.setContent(bodyMultipart);
MimeBodyPart html = new MimeBodyPart();
bodyMultipart.addBodyPart(html);
//html
html.setContent("测试发送带附件的邮件","text/html;charset=gbk");
mimeMessage.saveChanges();
// 发送邮件
Transport.send(mimeMessage, mimeMessage.getAllRecipients());
} catch (Exception e) {
e.printStackTrace();
}
}
}