java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java处理邮件附件

Java中处理邮件附件的方法(本地文件和在线URL)

作者:码农研究僧

这篇文章主要介绍了在Java中处理邮件附件的方法,针对本地文件和在线URL两种附件来源,提供了两种解决方案,并提供了下载文件和发送邮件的代码示例,需要的朋友可以参考下

发送带附件的邮件是一个常见的需求。但在实际应用中,附件的来源可能不同:

如果邮件服务方法只支持 File 类型的附件,而数据来源是一个 URL 链接,就需要进行额外的处理

方案适用场景优点缺点
方案 1:下载文件后发送sendMultiMail 只能接受 File-兼容所有 File 处理方法,确保附件可用-需要临时存储,占用磁盘空间
方案 2:修改 sendMultiMail 使其支持 URLsendMultiMail 支持 URL 附件- 无需存储文件,减少 IO- 需要改造 sendMultiMail,并且 URL 可能会失效

从实战中学习出发:

1. 本地文件

附件文件是 本地文件,可以直接使用 File 对象传递给邮件发送方法,例如:

List<File> attachments = Collections.singletonList(new File("C:\\images\\test.jpg"));

传入 sendMultiMail 方法:

Long messageId = mailSendService.sendMultiMail(
        mailList, getLoginUserId(), UserTypeEnum.ADMIN.getValue(),
        templateCode, templateParams, attachments);

2. 在线URL

new File(String path) 只能处理 本地文件路径,但如果xxx返回的是 HTTP URL(如 http://example.com/image.jpg),则会报 FileNotFoundException,因为 Java 认为这是一个无效的路径

解决方法:

可以使用 java.net.URL 和 Files.copy 方法下载文件:

import java.io.*;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;

public class FileDownloadUtil {
    public static File downloadFileFromUrl(String fileUrl) throws IOException {
        URL url = new URL(fileUrl); // 创建 URL 对象
        File tempFile = File.createTempFile("attachment_", ".jpg"); // 生成临时文件
        try (InputStream in = url.openStream()) {
            Files.copy(in, tempFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
        }
        return tempFile;
    }
}

下载后发送邮件

在发送邮件时,先下载附件:

// 处理附件,将 HTTP 图片下载到本地
List<File> attachments = new ArrayList<>();
try {
    File downloadedFile = FileDownloadUtil.downloadFileFromUrl(cabinetSwapDO.getImgCntrF());
    attachments.add(downloadedFile);
} catch (IOException e) {
    e.printStackTrace(); // 记录日志
}

// 发送邮件
Long xx = mailSendService.sendMultiMail(mail, getLoginUserId(), UserTypeEnum.ADMIN.getValue(),
        templateCode, templateParams, attachments);

sendMultiMail 方法内部使用的是 javax.mail,可以改造 sendMultiMail 以支持 URL:

import javax.activation.DataHandler;
import javax.activation.URLDataSource;
import javax.mail.internet.MimeBodyPart;
import java.net.URL;

public class MailAttachmentUtil {
    public static MimeBodyPart createUrlAttachment(String fileUrl) throws Exception {
        MimeBodyPart attachmentPart = new MimeBodyPart();
        URL url = new URL(fileUrl);
        attachmentPart.setDataHandler(new DataHandler(new URLDataSource(url)));
        attachmentPart.setFileName("attachment.jpg"); // 可根据实际情况动态命名
        return attachmentPart;
    }
}

3. 彩蛋

临时下载的文件

Windows:通常存储在 C:\Users\用户名\AppData\Local\Temp
Linux / macOS:通常存储在 /tmp/

截图如下:

不希望存储在系统临时目录,而是放到自定义目录,可以这样修改 downloadFileFromUrl 方法:

public static File downloadFileFromUrl(String fileUrl, String saveDir) throws IOException {
    URL url = new URL(fileUrl);
    
    // 确保目录存在
    File directory = new File(saveDir);
    if (!directory.exists()) {
        directory.mkdirs();
    }

    // 指定下载文件路径
    File file = new File(saveDir + File.separator + "attachment.jpg");
    
    // 下载文件
    try (InputStream in = url.openStream()) {
        Files.copy(in, file.toPath(), StandardCopyOption.REPLACE_EXISTING);
    }

    return file;
}

调用方式:

File file = downloadFileFromUrl("http://example.com/image.jpg", "D:\\attachments");
System.out.println("Saved file path: " + file.getAbsolutePath());

到此这篇关于Java中处理邮件附件的方法(本地文件和在线URL)的文章就介绍到这了,更多相关Java处理邮件附件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文