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(); } } }
————————————————
版权声明:本文为CSDN博主「谢小涛」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u011974797/article/details/122539873
本文来自博客园,作者:天军,转载请注明原文链接:https://www.cnblogs.com/h2285409/p/17805113.html