javamail发送附件DataSource使用文件流解决过程

 更新时间:2025年08月15日 09:12:52   作者:涛哥是个大帅比  
使用ByteArrayDataSource替代传统附件处理方式,解决James邮件服务器需通过ApacheHttpClient下载华为云/FTP附件的问题,实现直接内存传输,确保邮件发送功能正常运作

问题

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java数据结构及算法实例:冒泡排序 Bubble Sort

    Java数据结构及算法实例:冒泡排序 Bubble Sort

    这篇文章主要介绍了Java数据结构及算法实例:冒泡排序 Bubble Sort,本文直接给出实现代码,代码中包含详细注释,需要的朋友可以参考下
    2015-06-06
  • Java Socket+mysql实现简易文件上传器的代码

    Java Socket+mysql实现简易文件上传器的代码

    最近在做一个小项目,项目主要需求是实现一个文件上传器,通过客户端的登陆,把本地文件上传到服务器的数据库(本地的)。下面通过本文给大家分享下实现代码,感兴趣的朋友一起看看吧
    2016-10-10
  • 聊一聊带智能提示的spring-boot-starter

    聊一聊带智能提示的spring-boot-starter

    这篇文章主要介绍了带智能提示的spring-boot-starter的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-11-11
  • MyBatis Mapper.xml入参List使用in函数问题

    MyBatis Mapper.xml入参List使用in函数问题

    文章主要讲述了在使用MyBatis的Mapper.xml文件时,如何正确地在in函数中使用List作为入参,作者强调了完整拷贝<if>...</if>格式的重要性,并指出稍微的改动就会导致错误
    2025-02-02
  • Mybatis中的自定义映射resultMap

    Mybatis中的自定义映射resultMap

    在MyBatis中,自定义映射resultMap可以让你精确控制如何将数据库返回的结果集映射到Java对象上,本文给介绍了Mybatis之自定义映射resultMap,需要的朋友可以参考下
    2024-03-03
  • springboot集成Swagger的方法(让你拥有属于自己的api管理器)

    springboot集成Swagger的方法(让你拥有属于自己的api管理器)

    在大型的项目中,如果你有非常多的接口需要统一管理,或者需要进行接口测试,那么我们通常会在繁杂地api中找到需要进行测试或者管理的接口,接下来通过本文给大家介绍springboot集成Swagger的方法让你拥有属于自己的api管理器,感兴趣的朋友一起看看吧
    2021-11-11
  • Spring Boot 2.x中Actuator的一些知识点

    Spring Boot 2.x中Actuator的一些知识点

    这篇文章主要给大家介绍了关于Spring Boot 2.x中Actuator的一些知识点,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot 2.x具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • java报错:找不到或无法加载主类的解决方法简单粗暴

    java报错:找不到或无法加载主类的解决方法简单粗暴

    本文主要介绍了java报错:找不到或无法加载主类的解决方法简单粗暴,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • Java利用StampedLock实现读写锁的方法详解

    Java利用StampedLock实现读写锁的方法详解

    在jdk8以后,java提供了一个性能更优越的读写锁并发类StampedLock,该类的设计初衷是作为一个内部工具类,用于辅助开发其它线程安全组件。本文就来和大家一起学习下StampedLock的功能和使用
    2022-10-10
  • Java实现生成n个不重复的随机数

    Java实现生成n个不重复的随机数

    这篇文章主要为大家详细介绍了Java实现生成n个不重复的随机数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05

最新评论