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

发布时间 2023-11-02 12:13:17作者: 天军

问题:在使用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