💡 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
.msgnebo.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,CcaBccpomocíDisplayHeadera souvisejících možnostíDisplay*(CcaBccjsou ve výchozím nastavení skryté). - Lokalizované hlavičky: přiřadit každému
EmailFieldjiný popisek pomocíFieldTextMap, například přeložitSubjectaAttachmentsdo jiného jazyka. - Formátování data: řádek
Sentpoužívá kulturu počítače, na kterém běží převod, aTimeZoneOffsetnastavuje posun UTC použité pro data zprávy. - Výstup jen zprávy: nastavte
ConvertOwnednafalse, 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?
- Vyzkoušejte bezplatnou dočasnou licenci
- Prozkoumejte převod každé e‑mailové přílohy do jiného výstupního formátu
- Přečtěte si kompletní referenci EmailLoadOptions
- Podívejte se na ukázkový projekt na GitHubu