javamail发送附件DataSource使用文件流解决方案

问题:在使用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();
		}
	}
	
}

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涛哥是个大帅比

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值