最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中處理郵件附件的方法(本地文件和在線URL)

 更新時(shí)間:2025年03月19日 08:28:23   作者:碼農(nóng)研究僧  
這篇文章主要介紹了在Java中處理郵件附件的方法,針對(duì)本地文件和在線URL兩種附件來(lái)源,提供了兩種解決方案,并提供了下載文件和發(fā)送郵件的代碼示例,需要的朋友可以參考下

發(fā)送帶附件的郵件是一個(gè)常見(jiàn)的需求。但在實(shí)際應(yīng)用中,附件的來(lái)源可能不同:

  • 本地文件:直接從服務(wù)器的文件系統(tǒng)讀取
  • 在線 URL:附件是一個(gè) HTTP 資源,需要先下載

如果郵件服務(wù)方法只支持 File 類型的附件,而數(shù)據(jù)來(lái)源是一個(gè) URL 鏈接,就需要進(jìn)行額外的處理

方案適用場(chǎng)景優(yōu)點(diǎn)缺點(diǎn)
方案 1:下載文件后發(fā)送sendMultiMail 只能接受 File-兼容所有 File 處理方法,確保附件可用-需要臨時(shí)存儲(chǔ),占用磁盤(pán)空間
方案 2:修改 sendMultiMail 使其支持 URLsendMultiMail 支持 URL 附件- 無(wú)需存儲(chǔ)文件,減少 IO- 需要改造 sendMultiMail,并且 URL 可能會(huì)失效

從實(shí)戰(zhàn)中學(xué)習(xí)出發(fā):

1. 本地文件

附件文件是 本地文件,可以直接使用 File 對(duì)象傳遞給郵件發(fā)送方法,例如:

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),則會(huì)報(bào) FileNotFoundException,因?yàn)?Java 認(rèn)為這是一個(gè)無(wú)效的路徑

解決方法:

  • 方案 1:先下載 URL 文件到本地,再作為 File 傳入
    優(yōu)點(diǎn): ? 兼容所有支持 File 類型的郵件方法。? 確保文件下載完成后再發(fā)送,避免資源問(wèn)題。
    缺點(diǎn): ? 可能會(huì)導(dǎo)致 磁盤(pán) IO 開(kāi)銷(xiāo),尤其是多個(gè)郵件附件時(shí)。? 需要臨時(shí)存儲(chǔ)文件,增加服務(wù)器磁盤(pán)負(fù)擔(dān)。
  • 方案 2:修改 sendMultiMail 方法,讓它支持直接使用 URL
    優(yōu)點(diǎn):? 避免本地存儲(chǔ),直接使用在線資源。? 減少 IO 開(kāi)銷(xiāo),更適合大規(guī)模郵件發(fā)送。
    缺點(diǎn): ? 需要 sendMultiMail 方法支持 URL 附件,否則無(wú)法直接使用。? URL 可能會(huì)過(guò)期,影響郵件內(nèi)容長(zhǎng)期有效性。

可以使用 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); // 創(chuàng)建 URL 對(duì)象
        File tempFile = File.createTempFile("attachment_", ".jpg"); // 生成臨時(shí)文件
        try (InputStream in = url.openStream()) {
            Files.copy(in, tempFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
        }
        return tempFile;
    }
}

下載后發(fā)送郵件

在發(fā)送郵件時(shí),先下載附件:

// 處理附件,將 HTTP 圖片下載到本地
List<File> attachments = new ArrayList<>();
try {
    File downloadedFile = FileDownloadUtil.downloadFileFromUrl(cabinetSwapDO.getImgCntrF());
    attachments.add(downloadedFile);
} catch (IOException e) {
    e.printStackTrace(); // 記錄日志
}

// 發(fā)送郵件
Long xx = mailSendService.sendMultiMail(mail, getLoginUserId(), UserTypeEnum.ADMIN.getValue(),
        templateCode, templateParams, attachments);

sendMultiMail 方法內(nèi)部使用的是 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"); // 可根據(jù)實(shí)際情況動(dòng)態(tài)命名
        return attachmentPart;
    }
}

3. 彩蛋

臨時(shí)下載的文件

Windows:通常存儲(chǔ)在 C:\Users\用戶名\AppData\Local\Temp
Linux / macOS:通常存儲(chǔ)在 /tmp/

截圖如下:

不希望存儲(chǔ)在系統(tǒng)臨時(shí)目錄,而是放到自定義目錄,可以這樣修改 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;
}

調(diào)用方式:

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

到此這篇關(guān)于Java中處理郵件附件的方法(本地文件和在線URL)的文章就介紹到這了,更多相關(guān)Java處理郵件附件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何利用grep-console插件使Intellij idea顯示多顏色調(diào)試日志

    如何利用grep-console插件使Intellij idea顯示多顏色調(diào)試日志

    這篇文章主要介紹了利用grep-console插件使Intellij idea顯示多顏色調(diào)試日志,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Java線程中的Thread.yield()詳細(xì)解析

    Java線程中的Thread.yield()詳細(xì)解析

    這篇文章主要介紹了Java線程中的Thread.yield()詳細(xì)解析,yield()讓當(dāng)前線程從運(yùn)行狀態(tài)?轉(zhuǎn)為?就緒狀態(tài),以允許具有相同優(yōu)先級(jí)的其他線程獲得運(yùn)行機(jī)會(huì),需要的朋友可以參考下
    2023-11-11
  • 解決SpringBoot整合MybatisPlus分模塊管理遇到的bug

    解決SpringBoot整合MybatisPlus分模塊管理遇到的bug

    這篇文章主要介紹了解決SpringBoot整合MybatisPlus分模塊管理遇到的bug,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • WeakHashMap的使用方法詳解

    WeakHashMap的使用方法詳解

    這篇文章主要介紹了WeakHashMap的使用方法詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • Spring Boot 默認(rèn)數(shù)據(jù)庫(kù)連接池 HikariCP全文解析

    Spring Boot 默認(rèn)數(shù)據(jù)庫(kù)連接池 HikariCP全文解析

    HikariCP是SpringBoot默認(rèn)的高性能數(shù)據(jù)庫(kù)連接池,通過(guò)合理配置可以顯著提升系統(tǒng)性能,文章詳細(xì)介紹了HikariCP的核心參數(shù)及最佳實(shí)踐,,文章列舉了常見(jiàn)的錯(cuò)誤配置及其可能導(dǎo)致的問(wèn)題,并推薦了適用于大多數(shù)中小型SpringBoot項(xiàng)目的穩(wěn)定生產(chǎn)配置,感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • java返回前端實(shí)體類json數(shù)據(jù)時(shí)忽略某個(gè)屬性方法

    java返回前端實(shí)體類json數(shù)據(jù)時(shí)忽略某個(gè)屬性方法

    這篇文章主要給大家介紹了關(guān)于java返回前端實(shí)體類json數(shù)據(jù)時(shí)忽略某個(gè)屬性的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • java serialVersionUID解決序列化類版本不一致問(wèn)題面試精講

    java serialVersionUID解決序列化類版本不一致問(wèn)題面試精講

    這篇文章主要為大家介紹了serialVersionUID解決序列化類版本不一致問(wèn)題的面試精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • SpringAOP中基于注解實(shí)現(xiàn)通用日志打印方法詳解

    SpringAOP中基于注解實(shí)現(xiàn)通用日志打印方法詳解

    這篇文章主要介紹了SpringAOP中基于注解實(shí)現(xiàn)通用日志打印方法詳解,在日常開(kāi)發(fā)中,項(xiàng)目里日志是必不可少的,一般有業(yè)務(wù)日志,數(shù)據(jù)庫(kù)日志,異常日志等,主要用于幫助程序猿后期排查一些生產(chǎn)中的bug,需要的朋友可以參考下
    2023-12-12
  • Spring MVC打印@RequestBody、@Response日志的方法

    Spring MVC打印@RequestBody、@Response日志的方法

    這篇文章主要介紹了Spring MVC打印@RequestBody、@Response日志的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-02-02
  • springcloud本地服務(wù)不注冊(cè)到注冊(cè)中心的解決方案

    springcloud本地服務(wù)不注冊(cè)到注冊(cè)中心的解決方案

    這篇文章主要介紹了springcloud本地服務(wù)不注冊(cè)到注冊(cè)中心,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07

最新評(píng)論

嘉定区| 长子县| 施秉县| 临沭县| 新化县| 井陉县| 青河县| 当雄县| 安岳县| 台安县| 上虞市| 荔浦县| 任丘市| 天水市| 吕梁市| 清镇市| 铁力市| 静海县| 昔阳县| 盐亭县| 泗洪县| 昌黎县| 神木县| 南投县| 共和县| 晋州市| 榆中县| 中山市| 桐乡市| 西青区| 神池县| 达孜县| 芷江| 天水市| 乌拉特前旗| 长春市| 砀山县| 石柱| 新邵县| 原平市| 上林县|