Správa příloh zpráv

Manipulace s přílohami v Outlooku

Vytváření a ukládání Outlook zpráv (MSG) souborů vysvětluje, jak vytvořit a uložit zprávy a jak vytvořit soubory MSG s přílohami. Tento článek popisuje, jak spravovat přílohy Microsoft Outlook pomocí Aspose.Email. Přílohy ze souboru zprávy jsou přístupné a ukládají se na disk pomocí MapiMessage třída Přílohy vlastnost. Ta Přílohy vlastnost je kolekce typu MapiAttachmentCollection třída.

Zkontrolovat typ přílohy (Inline nebo běžná)

Vložené a běžné přílohy slouží různým účelům. Vložené přílohy jsou vizuálně integrovány do e‑mailové zprávy a jsou typicky obrázky nebo mediální soubory. Naopak běžné přílohy jsou samostatné soubory připojené k e‑mailu a mohou zahrnovat různé typy souborů. MapiAttachment.IsInline vlastnost třídy MapiAttachment Zkontrolovat, zda je příloha inline nebo běžná

Následující ukázka kódu extrahuje a zobrazí informace o každé příloze načteného MapiMessage, včetně jejich zobrazovaných názvů a toho, zda jsou vložené (inline) nebo ne.

var message = MapiMessage.Load(fileName);

foreach (var attach in message.Attachments)
{
    Console.WriteLine($"{attach.DisplayName} : {attach.IsInline}");
}

Zkontrolovat typ přílohy (IsReference)

The MapiAttachment třída zahrnuje IsReference vlastnost, která umožňuje vývojářům identifikovat referenční přílohy ve zprávě. V následujícím ukázkovém kódu můžete zkontrolovat, zda je příloha referenční přílohou:

foreach (var attachment in msg.Attachments)
{
    if (attachment.IsReference)
    {
        // Process reference attachment
    }
}

Uložit přílohy ze souborů MSG

Pro uložení příloh ze souboru MSG:

  1. Iterujte přes MapiAttachmentCollection kolekci a získejte jednotlivé přílohy.
  2. Pro uložení příloh zavolejte metodu Save() třídy MapiAttachment.

Následující úryvek kódu ukazuje, jak uložit přílohy na místní disk.

// Create an instance of MapiMessage from file
MapiMessage message = MapiMessage.FromFile(dataDir + fileName);

// Iterate through the attachments collection
foreach (MapiAttachment attachment in message.Attachments)
{
    // Save the individual attachment
    attachment.Save(dataDir + attachment.FileName);
}

Extrahovat přílohy z MSG souborů formátovaných jako RTF

Pro zprávy formátované jako RTF lze následující kód použít k rozlišení a extrakci příloh, které jsou buď Inline, nebo se zobrazují jako ikona v těle zprávy. Následující úryvek kódu ukazuje, jak identifikovat a extrahovat vloženou přílohu z MSG formátovaného jako RTF.


var eml = MapiMessage.Load("MSG file with RTF Formatting.msg");

foreach (var attachment in eml.Attachments)
{
    if (IsAttachmentInline(attachment))
    {
        try
        {
            SaveAttachment(attachment, Guid.NewGuid().ToString());
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}

static bool IsAttachmentInline(MapiAttachment attachment)
{
    foreach (var property in attachment.ObjectData.Properties.Values)
    {
        if (property.Name == "\x0003ObjInfo")
        {
            var odtPersist1 = BitConverter.ToUInt16(property.Data, 0);
            return (odtPersist1 & (1 << (7 - 1))) == 0;
        }
    }
    return false;
}

static void SaveAttachment(MapiAttachment attachment, string fileName)
{
    foreach (var property in attachment.ObjectData.Properties.Values)
    {
        if (property.Name == "Package")
        {
            using var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write);
            fs.Write(property.Data, 0, property.Data.Length);
        }
    }
}

Získat vnořené přílohy e‑mailových zpráv

Vložené OLE přílohy se také objevují v MapiMessage třída kolekce Attachment. Následující příklad kódu parsuje soubor zprávy pro vložené přílohy zpráv a ukládá jej na disk. The MapiMessage statická metoda třídy FromProperties() může vytvořit novou zprávu z vložené přílohy. Následující úryvek kódu ukazuje, jak získat vnořené přílohy e‑mailových zpráv.

// Create a MapiMessage object from the individual attachment
MapiMessage getAttachment = MapiMessage.FromProperties(attachment.ObjectData.Properties);

// Convert the embedded message to a MailMessage and save it to disk
MailMessage mailMessage = getAttachment.ToMailMessage(new MailConversionOptions());
mailMessage.Save(dataDir + @"NestedMailMessageAttachments_out.eml", SaveOptions.DefaultEml);

Odstranit přílohy

Knihovna Aspose Outlook poskytuje funkci pro odebrání příloh ze souborů Microsoft Outlook Message (.msg):

  • Zavolejte metodu RemoveAttachments(). Přijímá jako parametr cestu k souboru se zprávou. Je implementována jako veřejná statická metoda, takže není třeba vytvářet instanci objektu.

Následující úryvek kódu ukazuje, jak odebrat přílohy.

MapiMessage.RemoveAttachments(dataDir + "AttachmentsToRemove_out.msg");

Můžete také zavolat MapiMessage statická metoda třídy DestroyAttachments(). Funguje rychleji než RemoveAttachments(), protože metoda RemoveAttachments() parsuje soubor zprávy.

MapiMessage.DestroyAttachments(dataDir + "AttachmentsToDestroy_out.msg");

Přidat MSG přílohy

Outlook zpráva může obsahovat jiné Microsoft Outlook zprávy v přílohách buď jako běžné, nebo jako vložené zprávy. The MapiAttachmentCollection poskytuje přetížené členy třídy Add metoda pro vytvoření Outlook zpráv s oběma typy příloh:

  • Add(string name, byte[] data) – přidá běžnou přílohu z pole bajtů.
  • Add(string name, MapiMessage message) – přidá jinou Outlook zprávu jako vloženou zprávu.

Následující úryvek kódu ukazuje, jak přidat oba typy příloh do zprávy.

MapiMessage message = new MapiMessage("from@test.com", "to@test.com", "Subj", "This is a message body");

// Add a regular attachment from a byte array
message.Attachments.Add("note.txt", File.ReadAllBytes(dataDir + "note.txt"));

// Add another Outlook message as an embedded message
MapiMessage attachMsg = MapiMessage.FromFile(dataDir + "Message.msg");
message.Attachments.Add("Weekly report.msg", attachMsg);

message.Save(dataDir + "WithAttachments_out.msg");

Přidat referenční přílohy do MapiMessages

The ReferenceAttachmentOptions třída zjednodušuje přidávání referenčních příloh tím, že zapouzdří všechny potřebné vlastnosti do jediného objektu.

Parametry ReferenceAttachmentOptions:

  • sharedLink: Plně kvalifikovaný sdílený odkaz na přílohu poskytovaný webovou službou hostující soubor.
  • url: Umístění souboru nebo URL zdroje.
  • providerName: Název poskytovatele referenční přílohy (např. Google Drive, Dropbox).
  • Příklad: Přidání referenční přílohy pomocí ReferenceAttachmentOptions
var options = new ReferenceAttachmentOptions(
    "https://drive.google.com/file/d/1HJ-M3F2qq1oRrTZ2GZhUdErJNy2CT3DF/",
    "https://drive.google.com/drive/my-drive",
    "GoogleDrive");

// Add reference attachment
msg.Attachments.Add("Document.pdf", options);

Vložit zprávy jako přílohy

Následující úryvek kódu ukazuje, jak vložit přílohu MSG souboru do zprávy.

MapiMessage message = new MapiMessage("from@test.com", "to@test.com", "Subj", "This is a message body");
MapiMessage attachMsg = MapiMessage.FromFile(dataDir + "Message.msg");
message.Attachments.Add("Weekly report.msg", attachMsg);
message.Save(dataDir + "WithEmbeddedMsg_out.msg");

Číst vložené zprávy z příloh

Následující úryvek kódu ukazuje, jak číst vložené zprávy z příloh.

var message = MapiMessage.FromFile(fileName);
if (message.Attachments[0].ObjectData.IsOutlookMessage)
{
    var getData = message.Attachments[0].ObjectData.ToMapiMessage();
}

Vkládání a nahrazování příloh

metoda. Nicméně nelze použít k vložení přílohy s PR_ATTACH_NUM = 4 (například) do kolekce s collection.Count = 2.

Vložit přílohy na konkrétní místa

API Aspose.Email poskytuje možnost vložit MSG přílohu do nadřazeného MSG pomocí metody Insert kolekce MapiAttachmentCollection Insert(int index, string name, MapiMessage msg). Následující úryvek kódu ukazuje, jak vložit přílohu na konkrétní místo.

var message = MapiMessage.FromFile(fileName);
var memoryStream = new MemoryStream();
message.Attachments[2].Save(memoryStream);
           
var getData = MapiMessage.FromStream(memoryStream);
message.Attachments.Insert(1, "new 11", getData);

Nahradit obsah přílohy

Toto lze použít k nahrazení obsahu vložené přílohy novým pomocí metody Replace. Nemůže však být použito k vložení přílohy s PR_ATTACH_NUM = 4 (například) do kolekce, kde collection.Count = 2. Následující úryvek kódu vám ukazuje, jak nahradit obsah přílohy.

var message = MapiMessage.FromFile(fileName);
var memoryStream = new MemoryStream();
message.Attachments[2].Save(memoryStream);
var getData = MapiMessage.FromStream(memoryStream);
message.Attachments.Replace(1, "new 1", getData);

Přejmenovat přílohy v MapiMessage

Je možné upravit hodnotu vlastnosti DisplayName v přílohách MapiMessage.

var msg = MapiMessage.Load(fileName);
msg.Attachments[0].DisplayName = "New display name 1";
msg.Attachments[1].DisplayName = "New display name 2";

Uložit přílohy z digitálně podepsaných zpráv

Následující ukázka kódu načte e‑mailovou zprávu ze souboru a poté získá informace o přílohách, konkrétně vytiskne zobrazovaný název každé přílohy a zda je v rámci zprávy inline nebo ne: 

Extrahovat vložené OLE objekty z oledata.mso

Někdy jsou vložená OLE data reprezentována jako oledata.mso příloha v MapiAttachment a je třeba je extrahovat ručně. Tyto oledata.mso soubory jsou ve formátu Microsoft Compound Document File (MCDF) a podpora takových souborů přesahuje rámec Aspose.Email. Nicméně Aspose.Email lze použít ve spojení s dalšími open‑source knihovnami, jako je OpenMCDF, pro čtení obsahu těchto souborů a uložení na disk. Aspose.Email poskytuje InlineAttachmentExtractor třída pro vyjmenování MSO balíčků obsažených v binárních datech oledata.mso, které lze poté předat knihovně pro čtení složených souborů k extrakci obsahu.

Když je typ těla zprávy HTML (ne RTF) a zpráva obsahuje OLE objekty, MapiPropertyTag.PR_ATTACH_DATA_OBJ vlastnost chybí. V tomto případě jsou informace o OLE objektech obsaženy v oledata.mso.

Pro extrahování obsahu pomocí Aspose.Email a OpenMCDF:

  • Vyjmenujte MSO balíčky z binárních dat oledata.mso příloha.
  • Pro každou OLE položku přečtěte složený soubor.
  • Přečtěte stream pojmenovaný CONTENTS.
  • Uložte obsah do FileStream.
// The path to the File directory
string dataDir = RunExamples.GetDataDir_Email();

MapiMessage msg = MapiMessage.FromFile(dataDir + "double.msg");
foreach (MapiAttachment mapiAttachment in msg.Attachments)
{
    if (mapiAttachment.LongFileName == "oledata.mso")
    {
        IDictionary<string, byte[]> oledata = InlineAttachmentExtractor.EnumerateMsoPackage(new MemoryStream(mapiAttachment.BinaryData));
        int index = 0;
        foreach (var oleItem in oledata)
        {
            // Using the OpenMCDF library
            CompoundFile cf = new CompoundFile(new MemoryStream(oleItem.Value));
            CFStream contents = cf.RootStorage.GetStream("CONTENTS");
            using (FileStream fs = File.OpenWrite(index + ".pdf"))
            {
                byte[] data = contents.GetData();
                fs.Write(data, 0, data.Length);
                fs.Flush();
                fs.Close();
            }
            index++;
        }
    }
}