為什麼要從電子郵件中提取圖像?

電子郵件 (MSG, EML) 通常包含重要的視覺內容,例如客戶提交的圖片、營銷橫幅、內嵌的 HTML 圖片和照片附件。自動化提取使您能夠:

  • 從電子郵件中無需手動操作即可保存照片
  • 批量處理電子郵件
  • 下載內嵌和CID嵌入的圖片
  • 增強 CRM、支援票務、自動化和檔案管理的工作流程
  • 準備視覺數據以進行分析和處理

這篇文章回答了一些常見問題,例如如何從電子郵件保存照片、如何保存電子郵件中的照片,以及如何使用 .NET REST API 從電子郵件下載圖片。

電子郵件圖片提取 API

使用 GroupDocs.Parser Cloud SDK for .NET,您可以解析 EML 和 MSG 文件並提取它們包含的每種類型的圖像,包括:

  • 內嵌圖像(Base64 / CID)
  • CID-referenced HTML images
  • 附加照片 (JPG, PNG, GIF, BMP, TIFF)

支援的格式:

  • EML — 標準 RFC822 郵件文件。
  • MSG — Microsoft Outlook 電子郵件消息。

先決條件

  • A GroupDocs Cloud account (Client ID & Client Secret).
  • .NET 6.0+ 已安裝。
  • Visual Studio 或兼容的 IDE。
  • NuGet 套件: GroupDocs.Parser-Cloud

透過 NuGet 安裝

dotnet add package GroupDocs.Parser-Cloud --version 25.7.0

從電子郵件中提取圖片使用 C# .NET

以下是一個完整的 C# 範例,顯示如何上傳電子郵件檔案(EML 或 MSG),調用圖片 API 從電子郵件中提取圖片,並將結果照片下載到本地。這解決了如何從電子郵件中保存圖片和電子郵件照片下載的用例。

步驟 1 — 初始化 API:

var config = new Configuration("YOUR_CLIENT_ID", "YOUR_CLIENT_SECRET");
var parserApi = new ParserApi(config);

步驟 2 — 設定 ZIP 檔案資訊與選項:

var fileInfo = new FileInfo { FilePath = "source.eml" };
var options = new ImagesOptions { FileInfo = fileInfo };
var request = new ImagesRequest(options);

步驟 3 — 擷取圖片:

var imagesRequest = new ImagesRequest(options);
var imagesResponse = parserApi.Images(imagesRequest);
// 1. 配置 API 客戶端
var config = new Configuration
{
    ClientId = "YOUR_CLIENT_ID",
    ClientSecret = "YOUR_CLIENT_SECRET"
};

var parserApi = new ParserApi(config);
var fileApi = new FileApi(config);

// 本地和雲端路徑
var localEmailPath = "/Users/you/Downloads/message.eml"; // macOS example
var remoteEmailPath = "inbox/message.eml";
var outputFolder = "extracted-email-images"; // cloud output folder
var localOutputDir = "/Users/you/Downloads/extracted-email-images";

// 2. 將電子郵件檔案上傳到雲端儲存空間
using (var fs = File.OpenRead(localEmailPath))
{
    var uploadRequest = new UploadFileRequest(path: remoteEmailPath, fileContent: fs);
    fileApi.UploadFile(uploadRequest);
    Console.WriteLine($"Uploaded {remoteEmailPath} to cloud storage.");
}

// 3. 準備圖片提取請求
var fileInfo = new FileInfo { FilePath = remoteEmailPath, StorageName = "internal" };
var options = new ImagesOptions { FileInfo = fileInfo, OutputPath = outputFolder };
var imagesRequest = new ImagesRequest(options);

// 4. 呼叫 Images API 以提取內嵌/附加的圖片
var imagesResponse = parserApi.Images(imagesRequest);

if (imagesResponse.Images == null || imagesResponse.Images.Count == 0)
{
    Console.WriteLine("No images found inside the email.");
    return;
}

Console.WriteLine($"Found {imagesResponse.Images.Count} image(s) inside the email:");
foreach (var img in imagesResponse.Images)
{
    Console.WriteLine($"  - {img.Path} ({img.Size} bytes) [{img.MediaType}]");
}

// 5. 下載從雲端儲存提取的圖片到本地資料夾(macOS安全)
Directory.CreateDirectory(localOutputDir);

foreach (var img in imagesResponse.Images)
{
    // 標準化返回的路徑和輸出資料夾以避免重複
    var returnedPath = (img.Path ?? string.Empty).Replace("\\", "/").Trim('/');
    var normalizedOutputFolder = (outputFolder ?? string.Empty).Replace("\\", "/").Trim('/');

    string cloudImagePath;
    if (!string.IsNullOrEmpty(normalizedOutputFolder) &&
    (returnedPath.StartsWith(normalizedOutputFolder + "/") || returnedPath == normalizedOutputFolder))
    {
        cloudImagePath = returnedPath;
    }
    else if (!string.IsNullOrEmpty(normalizedOutputFolder))
    {
        cloudImagePath = $"{normalizedOutputFolder}/{returnedPath}".Trim('/');
    }
    else
    {
        cloudImagePath = returnedPath;
    }

    Console.WriteLine($"Downloading from cloud path: {cloudImagePath}");

    var downloadRequest = new DownloadFileRequest(path: cloudImagePath);
    var responseStream = fileApi.DownloadFile(downloadRequest);

    var localFileName = Path.GetFileName(returnedPath);
    var localFilePath = Path.Combine(localOutputDir, localFileName);

    using (var fsLocal = File.Create(localFilePath))
    {
        responseStream.CopyTo(fsLocal);
    }

    Console.WriteLine($"Downloaded: {localFilePath}");
}

Console.WriteLine("Email image extraction completed.");

關於 macOS 和雲端路徑的備註

  • 請不要使用 Path.Combine 來構建雲端儲存金鑰。在組成 S3/物件儲存金鑰時,請使用斜線 (/) 分隔符。
  • 僅在本地文件系統路徑(在 macOS 上保存下載的文件)中使用 Path.Combine
  • 上述代碼對 API 返回的 img.Path 進行了標準化,避免了重複的資料夾段,如 extracted-email-images/extracted-email-images/....

提取電子郵件圖片使用 cURL

另外,如果您更喜歡命令行介面(CLI),您可以直接調用 REST API。

步驟 1 — 生成存取令牌 這種方法的第一步是根據客戶端憑證生成 JWT 存取令牌。

curl -v -X POST "https://api.groupdocs.cloud/connect/token" \
-d "grant_type=client_credentials&client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET" \
-H "Content-Type: application/x-www-form-urlencoded"

*Step 2 — Extract Images from ZIP

curl -v -X POST "https://api.groupdocs.cloud/v1.0/parser/images" \
-H  "accept: application/json" \
-H  "authorization: Bearer {ACCESS_TOKEN}" \
-H  "Content-Type: application/json" \
-d "{ "FileInfo": { "FilePath": "inbox/message.eml", "StorageName": "internal" }, "OutputPath": "extracted-email-images"}"

回應返回一個包含提取的圖像記錄及其雲路徑的數組;使用 File API 或簽名 URL 下載它們。

嘗試在線郵件圖片提取器

為了測試 REST API 的功能而不需要寫一行代碼,您可以考慮使用我們的免費在線 Email Image Extractor 工具。它是基於 GroupDocs.Parser Cloud API 開發的,能夠讓您保存電子郵件照片。

提取電子郵件圖片

故障排除與除錯

  • 指定的鍵不存在” — 檢查 API 返回的確切 img.Path值。如果返回的路徑已經包含OutputPath`,則不要在前面加上它。
  • 沒有找到圖像 — 請確保電子郵件實際包含支持的圖像類型並檢查嵌套的 MIME 部分。
  • 大型電子郵件 — 對於非常大的或多張圖片,建議使用雲端儲存輸出和批量下載。
  • 權限 — 驗證 API 憑證和 StorageName(例如,internal)是否正確。

結論

這篇文章展示了如何從電子郵件檔案(.eml 和 .msg)中提取圖像,如何以程式化的方式保存照片,以及如何使用 GroupDocs.Parser Cloud SDK for .NET 下載內嵌和附加的圖片。

相關文章

我們強烈建議您參閱以下文章以了解更多:

常見問題 (FAQs)

  1. 我可以從電子郵件中提取內嵌照片嗎? 是的,API 自動提取內聯和嵌入的圖像。

  2. 這是否適用於 .msg (Outlook) 文件? 是的 — 支援 MSG 和 EML 格式。

  3. 我可以只提取附加的照片嗎? 是的,過濾選項允許僅提取附件。

  4. 支援哪些圖片格式? JPG、PNG、BMP、GIF、TIFF 和其他常見的圖像類型。

  5. 是否有免費試用? 是的。您可以創建一個免費帳戶並獲得每月 150 次 API 呼叫。