首页 > 编程语言 >javamail发送附件DataSource使用文件流解决方案

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

时间:2023-11-02 12:22:42浏览次数:32  
标签:mail mimeMessage javamail import 附件 new javax 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("[email protected]", "测试人员", "UTF-8"));
            
            // 收件人地址
            Address[] to = InternetAddress.parse("[email protected]");
            // 指定收件人邮箱
            mimeMessage.addRecipients(Message.RecipientType.TO, to);
            
            //没有抄送人可以忽略
            Address[] cc = InternetAddress.parse("[email protected]");
            // 指定抄送人邮箱
            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

标签:mail,mimeMessage,javamail,import,附件,new,javax,DataSource
From: https://www.cnblogs.com/h2285409/p/17805113.html

相关文章

  • odoo pdf 打印任务后台运行,pdf保存在附件中, 借助queue_job模块实现后台打印
    用户故事:在打印大批量pdf文件时会有较长事件的等待,而且容易中断原因中断原因,有内存及超时限制,wkhtmltopdf工具比较吃内存解决方案:内存限制的问题可以分批处理,比如每次只处理50条记录代码示例,使用按钮触发的打印功能:#model:[email protected]......
  • JavaScript能否实现在线Excel附件的上传与下载?
    前言在本地使用Excel时,经常会有需要在Excel中添加一些附件文件的需求,例如在Excel中附带一些Word,CAD图等等。同样的,类比到Web端,现在很多人用的在线Excel是否也可以像本地一样实现附件文件的操作呢?答案是肯定的,不过和本地不同的是,Web端不会直接打开附件,而是使用超链接单元格的形式来......
  • 手把手教你如何轻松播放附件中的视频——面向初学者的实践指引
    前言在日常使用办公系统的过程中,经常被问到一个问题,就是附件中如果上传的是视频文件,如何在网页上播放?虽然可以下载后再在本地播放,但是有时候只是想看一下视频里其中的一段,下载后再播放就非常的浪费时间。在这篇文章中,我们将一步一步手把手教你如何实现在办公系统中播放视频(以kinton......
  • 手把手教你如何轻松播放附件中的视频——面向初学者的实践指引
    前言在日常使用办公系统的过程中,经常被问到一个问题,就是附件中如果上传的是视频文件,如何在网页上播放?虽然可以下载后再在本地播放,但是有时候只是想看一下视频里其中的一段,下载后再播放就非常的浪费时间。在这篇文章中,我们将一步一步手把手教你如何实现在办公系统中播放视频(以kin......
  • el-upload上传附件并携带其他参数
    <el-dialogtitle="导入":visible.sync="showExportDialog"><el-form:model="addForm"ref="addForm"size="small":rules="rules"label-width="130px">......
  • ChatGPT 实用小案例分享——使用Python重命名附件和统计发票合计金额
    大家好,我是皮皮。一、前言前几天在【志军】的星球看到了一个有意思的ChatGPT分享,正好喝Python相关的,一起来看看吧。ChatGPT实用小案例分享。如果你在高德或者滴滴上申请过开票,应该知道它们会给我们发一封邮件,发票和行程单都会放在附件中。由于高德是聚合平台,背后有很多网约车平台,......
  • .net 上传附件错误
     错误net::ERR_CONNECTION_ABORTED 导致这种错误的主要原因是上传的文件太大,服务器不能继续读取请求而过早中断链接Failedtoloadresource:theserverrespondedwithastatusof413()开发环境(IISExpress)1073741824=1GB根目录下创建 web.config 文件,内容如下<......
  • Dynamics CRM中自定义页面实现附件管理包含下载模板、上传、下载、删除
    前言附件使用的DynamicsCRM平台本身的注释表annotation存储,将附件转换成二进制字节流保存到数据库中,因自带的注释在页面中显示附件不够直观,特做了一个单独的附件管理自定义页面,通过CRM自定义按钮打开对话框的方式展示附件列表页面。同时支持下载附件模板,页面为简单的H5+Bootstr......
  • Spring Boot如何实现邮件发送附件?一文带你搞定它!
    前言随着互联网的发展,电子邮件已经成为人们日常工作中不可或缺的一部分。在软件开发领域中,发送邮件也是必不可少的一项功能。本文将介绍如何在SpringBoot中使用JavaMailSender发送带附件的邮件。摘要本文将从以下几个方面介绍如何在SpringBoot中发送带附件的邮件:配置Spring......
  • Grafana导入 json 文件的 dashboard 错误 Templating Failed to upgrade legacy queri
    前言编辑或者修改后的dashboard保存为json文件,在其他环境导入使用,报错FailedtoupgradelegacyqueriesDatasourcexxxxxxxwasnotfound,无法显示监控数据问题原因为:从其他grafana导出的dashboardjson文件中,数据源是写的固定的,如果当前要显示的监控数据的数据源名称......