Dlaczego wyodrębniać obrazy z e-maili?

E-maile (MSG, EML) często zawierają ważne wizualizacje, takie jak obrazy przesłane przez klientów, banery reklamowe, obrazy HTML osadzone oraz załączniki w postaci zdjęć. Automatyzacja ekstrakcji umożliwia Ci:

  • Zapisz zdjęcia z e-maili bez ręcznego wysiłku
  • Przetwarzaj e-maile hurtowo
  • Pobierz obrazy osadzone w linii i z CID
  • Zwiększ workflow dla CRM, zgłoszeń wsparcia, automatyzacji i archiwizacji
  • Przygotuj dane wizualne do analizy i przetwarzania

Ten artykuł odpowiada na często zadawane pytania, takie jak jak zapisać zdjęcie z e-maila, jak zapisać zdjęcia z e-maila oraz jak pobrać obraz z e-maila za pomocą .NET REST API.

API do ekstrakcji obrazów z e-maili

Używając GroupDocs.Parser Cloud SDK for .NET, możesz analizować pliki EML i MSG oraz ekstraktować każdy typ obrazu, który zawierają, w tym:

  • Inline embedded images (Base64 / CID)
  • CID-referenced HTML images
  • Załączone zdjęcia (JPG, PNG, GIF, BMP, TIFF)

Obsługiwane formaty:

  • EML — standardowe pliki e-mail RFC822.
  • MSG — wiadomości e-mail Microsoft Outlook.

Wymagania wstępne

  • Konto GroupDocs Cloud (ID klienta i tajny klient).
  • .NET 6.0+ zainstalowane.
  • Visual Studio lub kompatybilne IDE.
  • NuGet package: GroupDocs.Parser-Cloud

Zainstaluj przez NuGet

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

Ekstrakcja obrazów z wiadomości e-mail za pomocą C# .NET

Poniżej znajduje się kompletny przykład C# pokazujący, jak przesłać plik email (EML lub MSG), wywołać API Obrazów w celu wyodrębnienia obrazów z wiadomości email i pobrać wynikowe zdjęcia lokalnie. Rozwiązuje to przypadki użycia, takie jak jak zapisać zdjęcie z maila i pobieranie zdjęcia z maila.

Krok 1 — Zainicjalizuj API:

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

Krok 2 — Ustaw informacje i opcje pliku ZIP:

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

tep 3 — Wyodrębnij obrazy:

var imagesRequest = new ImagesRequest(options);
var imagesResponse = parserApi.Images(imagesRequest);
// 1. Skonfiguruj klienta API
var config = new Configuration
{
    ClientId = "YOUR_CLIENT_ID",
    ClientSecret = "YOUR_CLIENT_SECRET"
};

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

// Ścieżki lokalne i chmurowe
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. Prześlij plik e-mail do chmury
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. Przygotuj prośbę o wyodrębnienie obrazów
var fileInfo = new FileInfo { FilePath = remoteEmailPath, StorageName = "internal" };
var options = new ImagesOptions { FileInfo = fileInfo, OutputPath = outputFolder };
var imagesRequest = new ImagesRequest(options);

// 4. Wywołaj API obrazów, aby wyodrębnić obrazy wbudowane/dołączone
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. Pobierz wyodrębnione obrazy z chmury do lokalnego folderu (bezpieczne dla macOS)
Directory.CreateDirectory(localOutputDir);

foreach (var img in imagesResponse.Images)
{
    // Normalizować zwróconą ścieżkę i folder wyjściowy, aby uniknąć duplikacji
    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.");

Notatki dotyczące macOS i ścieżek w chmurze

  • Nie używaj Path.Combine do budowania kluczy przechowywania w chmurze. Używaj separatorów ukośnika (/) podczas tworzenia kluczy S3/przechowywania obiektów.
  • Użyj Path.Combine tylko dla lokalnych ścieżek systemu plików (zapisywanie pobranych plików na macOS).
  • Kod powyżej normalizuje img.Path zwrócony przez API i unika zduplikowanych segmentów folderów, takich jak extracted-email-images/extracted-email-images/....

Extract Email Images using cURL

Alternatywnie, jeśli wolisz CLI, możesz bezpośrednio wywołać REST API.

Krok 1 — Wygeneruj token dostępu Pierwszym krokiem w tym podejściu jest wygenerowanie tokena dostępu JWT na podstawie danych uwierzytelniających klienta.

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"}"

Odpowiedź zwraca tablicę wyodrębnionych rekordów obrazów z ich ścieżkami w chmurze; pobierz je za pomocą interfejsu API plików lub podpisanych URL-i.

Spróbuj narzędzia Online Email Image Extractor

Aby przetestować możliwości REST API bez pisania ani jednej linii kodu, możesz rozważyć skorzystanie z naszego bezpłatnego narzędzia Email Image Extractor. Zostało opracowane na podstawie GroupDocs.Parser Cloud API i umożliwia zapisywanie zdjęć z e-maili.

extract email images

Rozwiązywanie problemów i debugowanie

  • Określony klucz nie istnieje” — sprawdź dokładne wartości img.Pathzwrócone przez API. Nie dodawajOutputPath`, jeśli zwrócone ścieżki już go zawierają.
  • Nie znaleziono obrazów — upewnij się, że e-mail rzeczywiście zawiera obsługiwane typy obrazów i sprawdź zagnieżdżone części MIME.
  • Duże maile — w przypadku bardzo dużych lub wielu obrazów, preferuj przechowywanie w chmurze i pobieranie zbiorcze.
  • Uprawnienia — zweryfikuj dane uwierzytelniające API oraz StorageName (np. internal), czy są poprawne.

Wniosek

Ten artykuł pokazał, jak wydobywać obrazy z plików e-mailowych (.eml i .msg), jak programowo zapisywać zdjęcia z e-maila oraz jak pobierać obrazy inline i załączone za pomocą GroupDocs.Parser Cloud SDK dla .NET.

Powiązane artykuły

Zalecamy zapoznanie się z następującymi artykułami, aby dowiedzieć się więcej o:

Najczęściej zadawane pytania (FAQs)

  1. Czy mogę wyodrębnić zdjęcia w treści wiadomości e-mail? Tak, API automatycznie wyodrębnia obrazy wewnętrzne i osadzone.

  2. Czy to działa z plikami .msg (Outlook)? Tak — formaty MSG i EML są obsługiwane.

  3. Czy mogę wyodrębnić tylko załączone zdjęcia? Tak, opcje filtracji pozwalają na wyodrębnienie tylko załączników.

  4. Jakie formaty obrazów są obsługiwane? JPG, PNG, BMP, GIF, TIFF oraz inne powszechne typy obrazów.

  5. Czy jest darmowy okres próbny? Tak. Możesz założyć darmowe konto i uzyskać 150 miesięcznych wywołań API.