为什么从电子邮件中提取图像?

电子邮件 (MSG, EML) 通常包含重要的视觉元素,例如客户提交的图像、营销横幅、内联 HTML 图片和照片附件。自动提取使您能够:

  • 通过电子邮件保存照片而无需手动操作
  • 批量处理电子邮件
  • 下载内联和CID嵌入的图像
  • 增强 CRM、支持工单、自动化和归档的工作流程
  • 准备可视化数据以进行分析和处理

这篇文章回答了常见的问题,例如如何从电子邮件中保存照片,如何保存电子邮件照片,以及如何使用 .NET REST API 从电子邮件下载图像。

Email Image Extraction API

使用 GroupDocs.Parser Cloud SDK for .NET,您可以解析 EML 和 MSG 文件,并提取它们包含的每种类型的图像,包括:

  • 嵌入式图片 (Base64 / CID)
  • CID-引用的HTML图像
  • 附加照片(JPGPNGGIFBMPTIFF)

支持的格式:

  • EML — 标准 RFC822 邮件文件。
  • MSG — 微软 Outlook 电子邮件消息。

先决条件

  • 一个 GroupDocs Cloud 帐户(客户端 ID 和客户端密钥)。
  • .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. 调用图像 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"}"

响应返回一个提取的图像记录数组及其云路径;使用文件 API 或签名 URL 下载它们。

尝试在线电子邮件图像提取器

为了在不写一行代码的情况下测试REST API的功能,您可以考虑使用我们的免费在线 Email Image Extractor 工具。它是基于GroupDocs.Parser Cloud API开发的,能够让您保存电子邮件照片。

提取电子邮件图片

故障排除与调试

  • 指定的键不存在” — 检查 API 返回的确切 img.Path值。如果返回的路径已经包含OutputPath,则不要在前面加上 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 调用。