💡 Plně funkční příklad dostupný na GitHubu:
convert-email-and-attachments-to-pdf-dotnet

Převod e‑mailu na PDF je workflow GroupDocs.Conversion pro .NET, který přemění Outlook zprávu a její přílohy na jeden nebo více PDF souborů bez toho, aby jedna příloha přepsala druhou nebo aby jeden nepodporovaný soubor zničil celý běh. Nahrazuje ruční export‑a‑přejmenování několika řádky kódu, které pro každou položku vědí, odkud pochází a zda se vůbec podařilo převést.

Starý způsob byl bolestivý

Představte si podporu, kde každá e‑mailová případová zpráva obsahuje dva nebo tři přílohy – zprávu zde, snímek obrazovky tam, někdy souborový formát, který nikdo v týmu nepozná. Na nic není neobvyklé. Zaarchivování takového případu znamená otevřít zprávu, ručně uložit každou přílohu, přejmenovat ty, které kolidují, protože dva systémy exportovaly soubor se stejným názvem report.csv, a doufat, že v sadě není formát, který váš PDF prohlížeč nedokáže otevřít. Udělejte to padesátkrát týdně a „rychlý export“ se stane nejpomalejší částí práce a zároveň částí, která je nejčastěji uspěchaná – právě v té chvíli se dějí chyby.

Dělat to ručně neznamená jen ztrátu času – je to také místo, kde soubory tiše mizí. Uložte dvě přílohy se stejným názvem report.csv do stejné složky bez předchozího přejmenování a druhé uložení přepíše první; nikdo si toho nevšimne, dokud nebudou záříská čísla nenajde. Zpráva s i jen jednou přílohou v neznámém formátu může zastavit celý export, dokud si někdo nerozhodne, co s ní udělat.

Skutečná cena ručního zpracování: přejmenovaná a přepsaná příloha nevyvolá chybu – jen tiše zmizí a soubor případu vypadá kompletně, dokud někdo nepotřebuje data, která v něm byla.

Existuje lepší způsob

GroupDocs.Conversion pro .NET to převádí na několik řádků kódu. Žádné ruční přejmenování není potřeba. Třída EmailLoadOptions řídí, zda se převádí zpráva, přílohy nebo obojí, a callback SaveContext popisuje každý výstupní položku tak podrobně, že dvě přílohy pojmenované report.csv nikdy nekolidují a příloha bez cesty k PDF nezastaví zbytek běhu. Každé volání tohoto callbacku hlásí ItemIndex (běžící čítač začínající od 1), HierarchyLevel (0 pro zprávu, 1 pro přílohu) a SourceFileName (původní název souboru), což stačí k vytvoření názvu výstupu bez kolizí bez dalšího účetního kódu.

Než začneme, budete potřebovat:

  • .NET SDK 8.0 nebo novější
  • GroupDocs.Conversion pro .NET 26.10.0 (získat dočasnou licenci pro odstranění omezení hodnocení)
  • Outlookovou zprávu .msg nebo .eml, kterou chcete převést

Instalace jedním příkazem:

dotnet add package GroupDocs.Conversion --version 26.10.0

Nový způsob: Převod zprávy a jejích příloh

Takto vypadá stejný úkol s GroupDocs.Conversion. Následující příklad převádí Outlook zprávu a každou její přílohu do samostatného PDF s názvy, které se nikdy nekolidují.

Krok 1 – Rozhodněte, co převést

EmailLoadOptions.ConvertOwner a ConvertOwned nezávisle zapínají nebo vypínají převod zprávy a jejích příloh; Depth (výchozí 2) omezuje, jak hluboko se sledují vnořené přílohy.

// Convert the message itself and every attachment it carries
var loadOptions = new EmailLoadOptions
{
    ConvertOwner = true,
    ConvertOwned = true,
    Depth = 2
};

Krok 2 – Pojmenujte každý výstup pomocí SaveContext

Předáte callback SaveContext metodě Converter.Convert místo pevné cesty výstupu. Callback se spustí jednou pro každou položku, přičemž ItemIndex je jedinečný i když dvě přílohy sdílejí stejný název souboru.

using (var converter = new Converter(messagePath, (LoadContext _) => loadOptions))
{
    converter.Convert((SaveContext item) =>
    {
        // ItemIndex is 1 for the message, then counts up per attachment
        string name = $"{item.ItemIndex:D2}-{item.SourceFileName}.pdf";
        return File.Create(Path.Combine(outputFolder, name));
    }, new PdfConvertOptions());
}

Krok 3 – Zpracujte přílohy bez PDF cesty

Ne každá příloha může být převedena na PDF. Zkontrolujte SaveContext.TargetFormat proti FileType.Unknown a tuto položku uložte pod vlastním názvem místo převodu.

converter.Convert((SaveContext item) =>
{
    bool passedThrough = item.TargetFormat == FileType.Unknown;
    string baseName = $"{item.ItemIndex:D2}-{item.SourceFileName}";
    string name = passedThrough
        ? baseName
        : $"{baseName}.{item.TargetFormat.Extension}";
    return File.Create(Path.Combine(outputFolder, name));
}, new PdfConvertOptions());

Nasměrujte tento kód na ukázkový podporný e‑mail se dvěma přílohami pojmenovanými report.csv a jednou přílohou v nepodporovaném formátu. Výsledkem jsou tři PDF: zpráva a oba CSV reporty. Nepodporovaný soubor také vyjde, nedotčen – otevřete jej vedle originálu a všechny jeho 32 bytů se shodují.

Jak se vyhnout přepisování příloh, které mají stejný název souboru?

Název souboru sám o sobě nemůže být bezpečným klíčem pro výstup, protože dvě přílohy mohou mít naprosto stejný. Vložte SaveContext.ItemIndex do názvu spolu s SaveContext.SourceFileName a dvě přílohy pojmenované report.csv přestanou soutěžit o stejný slot na disku; každá získá svůj vlastní nulami doplněný prefix (02- a 03- ve vzorku, po 01- zprávy) a svůj vlastní soubor, jakýkoli název, který zdroj použil.

Vedle sebe: Před vs. Po

Před (ručně) Po (GroupDocs.Conversion)
Čas Minuty na zprávu, ručně Několik řádků kódu, libovolný počet zpráv
Duplicitní názvy Tichý přepis Uchovány odděleně pomocí ItemIndex
Nepodporovaná příloha Rozbije celý převod (před 26.10) Uložena pod vlastním názvem, převod pokračuje
Výstup Cokoliv, co váš PDF prohlížeč dokáže uložit Strukturované PDF, které můžete archivovat nebo indexovat

Ukázkový podporný e‑mail je složen právě z tohoto mixu: dva měsíční CSV exporty se stejným názvem a jeden soubor, který žádný převodník nepozná.

Praktický příklad: Archivace podpůrných případů

Podpůrný tým zaznamenává každý zákaznický případ jako e‑mail s jednou nebo více přílohami tabulek a systém sledování případů potřebuje každou přílohu uložit jako samostatné prohledávatelné PDF, oddělené od zprávy. Spuštěním zprávy přes KeepAttachmentsWithoutPdfRoute jednou pro každou příchozí zprávu se zpráva a její přílohy převedou na číslovanou sadu souborů, přičemž žádná příloha nikdy nepřepíše jinou, i když dva reporty mají stejný název. E‑mail s dvěma měsíčními exporty report.csv a jedním souborem v neznámém formátu tak skončí se čtyřmi soubory: zprávou, oběma CSV reporty jako PDF a souborem uloženým pod vlastním názvem – nic nebylo ztraceno, nic nesloučeno, nic tiše přepsáno.

// One call per case e-mail - no manual export, no renamed duplicates
int kept = KeepAttachmentsWithoutPdfRoute(caseMessagePath, caseOutputFolder);

Co dalšího můžete dělat s GroupDocs.Conversion pro .NET?

Kromě rozdělení zprávy od jejích příloh EmailLoadOptions pokrývá i další aspekty samotné zprávy:

  • Viditelnost polí: zobrazit nebo skrýt hlavičku a řádky From, To, Cc a Bcc pomocí DisplayHeader a souvisejících možností Display* (Cc a Bcc jsou ve výchozím nastavení skryté).
  • Lokalizované hlavičky: přiřadit každému EmailField jiný popisek pomocí FieldTextMap, například přeložit Subject a Attachments do jiného jazyka.
  • Formátování data: řádek Sent používá kulturu počítače, na kterém běží převod, a TimeZoneOffset nastavuje posun UTC použité pro data zprávy.
  • Výstup jen zprávy: nastavte ConvertOwned na false, pokud PDF má představovat jen zprávu, přičemž názvy příloh zůstávají uvedeny v hlavičce pro referenci.

Podívejte se na kompletní referenci EmailLoadOptions pro všechny možnosti.

Závěr

To, co dříve znamenalo otevřít zprávu, ručně uložit přílohy a znovu zkontrolovat přepsané duplikáty, nyní vyžaduje pouze callback SaveContext a několik řádků kódu. GroupDocs.Conversion pro .NET poskytuje každé výstupní položce – zprávě i každé příloze – název, který se nikdy nekoliduje, a zachová přílohu bez PDF cesty místo selhání běhu. Tři stavební bloky – ConvertOwner, ConvertOwned a callback SaveContext – škálují od jediného souhrnného PDF až po kompletní, kolizně‑bezpečný rozklad zprávy a všech jejích příloh, takže můžete začít malým krokem a postupně rozšiřovat workflow podle potřeb vaší schránky.

Připraveni automatizovat svůj e‑mail‑na‑PDF workflow?

Další zdroje