Hantera meddelande‑bilagor

Hantera bilagor i Outlook

Skapa och spara Outlook‑meddelanden (MSG‑filer) förklarar hur man skapar och sparar meddelanden, samt hur man skapar MSG‑filer med bilagor. Denna artikel förklarar hur man hanterar Microsoft Outlook‑bilagor med Aspose.Email. Bilagor från en meddelandefil nås och sparas till disk med hjälp av MapiMessage klass Bilagor egenskapen. Den Bilagor egenskap är en samling av typen MapiAttachmentCollection klass.

Kontrollera bilagtyp (Inbäddad eller vanlig)

Inbäddade och vanliga bilagor har olika syften. Inbäddade bilagor integreras visuellt i e‑postmeddelandet och är vanligtvis bilder eller mediafiler. Vanliga bilagor är däremot separata filer som bifogas e‑posten och kan omfatta olika filtyper. The MapiAttachment.IsInline egenskap hos MapiAttachment klassen får ett värde som indikerar om bilagan är inline eller vanlig.

Följande kodexempel extraherar och visar information om varje bilaga i den inlästa MapiMessage, inklusive deras visningsnamn och om de är inbäddade bilagor eller inte.

var message = MapiMessage.Load(fileName);

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

Kontrollera bilagtyp (IsReference)

Den MapiAttachment klass innehåller IsReference egenskap som låter utvecklare identifiera referensbilagor i ett meddelande. Med följande kodexempel kan du kontrollera om en bilaga är en referensbilaga:

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

Spara bilagor från MSG‑filer

För att spara bilagor från en MSG‑fil:

  1. Iterera igenom MapiAttachmentCollection samlingen och hämta de enskilda bilagorna.
  2. För att spara bilagorna, anropa MapiAttachment‑klassens Save()-metod.

Följande kodsnutt visar hur du sparar bilagor till den lokala disken.

// 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);
}

Extrahera bilagor från RTF‑formaterade MSG‑filer

För meddelanden som är formaterade som RTF kan följande kod användas för att särskilja och extrahera bilagor som antingen är inbäddade eller visas som ikon i meddelandetexten. Följande kodsnutt visar hur du identifierar och extraherar en inbäddad bilaga från ett MSG‑format som 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);
        }
    }
}

Hämta inbäddade e‑postmeddelandebilagor

Inbäddade OLE‑bilagor visas även i MapiMessage klassen Attachment-samling. Följande kodexempel analyserar en meddelandefil för inbäddade meddelandebilagor och sparar den till disken. The MapiMessage klassen FromProperties() statiska metod kan skapa ett nytt meddelande från en inbäddad bilaga. Följande kodsnutt visar hur du får åtkomst till inbäddade e‑postmeddelandebilagor.

// 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);

Ta bort bilagor

Aspose Outlook‑biblioteket ger funktionalitet för att ta bort bilagor från Microsoft Outlook‑meddelanden (.msg)-filer:

  • Anropa RemoveAttachments()-metoden. Den tar sökvägen till meddelandefilen som parameter. Den är implementerad som en offentlig statisk metod, så du behöver inte instansiera objektet.

Följande kodsnutt visar hur du tar bort bilagor.

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

Du kan också anropa MapiMessage klassens statiska metod DestroyAttachments(). Den fungerar snabbare än RemoveAttachments(), eftersom RemoveAttachments()-metoden analyserar meddelandefilen.

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

Lägg till MSG‑bilagor

Ett Outlook‑meddelande kan innehålla andra Microsoft Outlook‑meddelanden som bilagor, antingen som vanliga eller inbäddade meddelanden. The MapiAttachmentCollection tillhandahåller överlagrade medlemmar av Lägg till metod för att skapa Outlook‑meddelanden med båda bilagetyperna:

  • Add(string name, byte[] data) – lägger till en vanlig bilaga från en byte‑array.
  • Add(string name, MapiMessage message) – lägger till ett annat Outlook‑meddelande som ett inbäddat meddelande.

Följande kodsnutt visar hur du lägger till båda typerna av bilagor i ett meddelande.

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");

Lägg till referensbilagor till MapiMessages

Den ReferenceAttachmentOptions klassen förenklar tillägget av referensbilagor genom att kapsla in alla nödvändiga egenskaper i ett enda objekt.

Parametrar för ReferenceAttachmentOptions:

  • sharedLink: En fullständigt kvalificerad delad länk till bilagan som tillhandahålls av webbtjänsten som är värd för filen.
  • url: Filens plats eller resurs‑URL.
  • providerName: Namnet på leverantören av referensbilagan (t.ex. Google Drive, Dropbox).
  • Exempel: Lägga till en referensbilaga med 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);

Bädda in meddelanden som bilagor

Följande kodsnutt visar hur du bäddar in en MSG‑fil som bilaga i ett meddelande.

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");

Läs inbäddade meddelanden från bilagor

Följande kodsnutt visar hur du läser inbäddade meddelanden från bilagor.

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

Infoga och ersätta bilaga

Aspose.Email API ger möjlighet att infoga bilagor på ett specifikt index i föräldrameddelandet. Det ger även möjlighet att ersätta innehållet i en bilaga med en annan meddelandebilaga.

Infoga bilagor på specifika platser

Aspose.Email‑API erbjuder möjlighet att infoga en MSG‑bilaga i ett överordnat MSG med MapiAttachmentCollection:s Insert‑metod Insert(int index, string name, MapiMessage msg). Följande kodsnutt visar hur du infogar en bilaga på en specifik plats.

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);

Ersätt bilageinnehåll

Detta kan användas för att ersätta inbäddade bilagors innehåll med nya med hjälp av Replace‑metoden. Det kan dock inte användas för att infoga en bilaga med PR_ATTACH_NUM = 4 (t.ex.) i en samling med collection.Count = 2. Följande kodsnutt visar hur du ersätter bilagors innehåll.

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);

Byt namn på bilagor i MapiMessage

Det är möjligt att redigera DisplayName‑egenskapens värde i MapiMessage‑bilagor.

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

Spara bilagor från digitalt signerade meddelanden

Aspose.Email API ger möjlighet att hämta eller sätta ett värde som indikerar om ett clearsignerat meddelande ska avkodas. 

Extrahera inbäddade OLE‑objekt från oledata.mso

Ibland representeras inbäddad OLE‑data som en oledata.mso bilaga i en MapiAttachment och måste extraheras manuellt. Dessa oledata.mso filerna är i Microsoft Compound Document File (MCDF)‑format, och stöd för sådana filer ligger utanför Aspose.Email:s räckvidd. Däremot kan Aspose.Email kombineras med andra öppna källkods‑bibliotek, såsom OpenMCDF, för att läsa innehållet i dessa filer och spara dem till disk. Aspose.Email tillhandahåller InlineAttachmentExtractor klass för att enumerera MSO‑paketen som finns i den binära datan av oledata.mso, som sedan kan skickas till ett bibliotek för läsning av sammansatta filer för innehållsextraktion.

När ett meddelandekroppstyp är HTML (inte RTF) och det finns OLE‑objekt i meddelandet, MapiPropertyTag.PR_ATTACH_DATA_OBJ egenskap saknas. I detta fall innehåller informationen om OLE‑objekten oledata.mso.

För att extrahera innehållet med Aspose.Email och OpenMCDF:

  • Enumerera MSO‑paketen från den binära datan i oledata.mso bilaga.
  • För varje OLE‑objekt, läs den sammansatta filen.
  • Läs strömmen med namnet CONTENTS.
  • Spara innehållet till en 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++;
        }
    }
}