Gestione degli allegati del messaggio

Gestione degli allegati in Outlook

Creare e salvare file Outlook Message (MSG) spiega come creare e salvare messaggi, e come creare file MSG con allegati. Questo articolo spiega come gestire gli allegati di Microsoft Outlook con Aspose.Email. Gli allegati da un file di messaggio vengono acceduti e salvati su disco usando il MapiMessage classe Allegati proprietà. Il Allegati la proprietà è una collezione di tipo MapiAttachmentCollection classe.

Verifica tipo di allegato (In linea o Regolare)

Gli allegati in linea e quelli regolari hanno scopi diversi. Gli allegati in linea sono integrati visivamente nel messaggio di posta elettronica e sono tipicamente immagini o file multimediali. Nel frattempo, gli allegati regolari sono file separati allegati all’email e possono includere vari tipi di file. Il MapiAttachment.IsInline proprietà del MapiAttachment la classe ottiene un valore che indica se l’allegato è in linea o regolare.

Il seguente esempio di codice estrae e visualizza le informazioni su ciascun allegato nel MapiMessage caricato, inclusi i loro nomi visualizzati e se sono allegati in linea o meno.

var message = MapiMessage.Load(fileName);

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

Verifica tipo di allegato (IsReference)

Il MapiAttachment la classe include il IsReference proprietà che consente agli sviluppatori di identificare gli allegati di riferimento in un messaggio. Con il seguente esempio di codice, è possibile verificare se un allegato è un allegato di riferimento:

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

Salvare gli allegati da file MSG

Per salvare gli allegati da un file MSG:

  1. Iterare attraverso il MapiAttachmentCollection collezione e ottieni gli allegati individuali.
  2. Per salvare gli allegati, chiama il metodo Save() della classe MapiAttachment.

Il seguente frammento di codice mostra come salvare gli allegati sul disco locale.

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

Estrai gli allegati da file MSG formattati in RTF

Per i messaggi formattati in RTF, il codice seguente può essere usato per differenziare ed estrarre gli allegati che sono in linea o appaiono come icona nel corpo del messaggio. Il seguente frammento di codice mostra come identificare ed estrarre un allegato incorporato da un MSG formattato in 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);
        }
    }
}

Ottenere gli allegati di messaggi di posta nidificati

Gli allegati OLE incorporati compaiono anche nel MapiMessage collezione di classe Attachment. Il seguente esempio di codice analizza un file di messaggio per gli allegati di messaggi incorporati e lo salva su disco. Il MapiMessage Il metodo statico FromProperties() della classe può creare un nuovo messaggio da un allegato incorporato. Il seguente frammento di codice mostra come ottenere gli allegati di messaggi di posta nidificati.

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

Rimuovere allegati

La libreria Aspose Outlook fornisce la funzionalità per rimuovere gli allegati dai file Microsoft Outlook Message (.msg):

  • Chiama il metodo RemoveAttachments(). Accetta il percorso del file del messaggio come parametro. È implementato come metodo statico pubblico, quindi non è necessario istanziare l’oggetto.

Il frammento di codice seguente mostra come rimuovere gli allegati.

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

Puoi anche chiamare il MapiMessage metodo statico della classe DestroyAttachments(). Funziona più velocemente di RemoveAttachments(), perché il metodo RemoveAttachments() analizza il file del messaggio.

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

Aggiungere allegati MSG

Un messaggio Outlook può contenere altri messaggi Microsoft Outlook come allegati, sia come messaggi regolari sia incorporati. Il MapiAttachmentCollection fornisce membri sovraccaricati del Aggiungi metodo per creare messaggi Outlook con entrambi i tipi di allegati:

  • Add(string name, byte[] data) – aggiunge un allegato normale da un array di byte.
  • Add(string name, MapiMessage message) – aggiunge un altro messaggio Outlook come messaggio incorporato.

Il frammento di codice seguente mostra come aggiungere entrambi i tipi di allegati a un messaggio.

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

Aggiungi allegati di riferimento a MapiMessages

Il ReferenceAttachmentOptions La classe semplifica l’aggiunta di allegati di riferimento incapsulando tutte le proprietà necessarie in un unico oggetto.

Parametri di ReferenceAttachmentOptions:

  • sharedLink: Un link condiviso completamente qualificato all’allegato fornito dal servizio web che ospita il file.
  • url: La posizione del file o l’URL della risorsa.
  • providerName: Il nome del provider dell’allegato di riferimento (es. Google Drive, Dropbox).
  • Esempio: Aggiunta di un allegato di riferimento con 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);

Incorporare messaggi come allegati

Il seguente frammento di codice mostra come incorporare un allegato file MSG in un messaggio.

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

Leggere messaggi incorporati dagli allegati

Il seguente snippet di codice mostra come leggere i messaggi incorporati dagli allegati.

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

Inserimento e Sostituzione dell’Allegato

L’API Aspose.Email fornisce la possibilità di inserire allegati a un indice specifico nel messaggio genitore. Offre anche la possibilità di sostituire i contenuti di un allegato con un altro allegato di messaggio.

Inserire allegati in posizioni specifiche

L’API Aspose.Email fornisce la capacità di inserire un allegato MSG in un MSG genitore usando il metodo Insert della MapiAttachmentCollection MapiAttachmentCollection Insert(int index, string name, MapiMessage msg). Il seguente frammento di codice mostra come inserire un allegato in una posizione specifica.

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

Sostituire i contenuti dell’allegato

Ciò può essere usato per sostituire i contenuti di un allegato incorporato con quelli nuovi usando il metodo Replace. Tuttavia, non può essere usato per inserire un allegato con PR_ATTACH_NUM = 4 (ad esempio) in una collezione con collection.Count = 2. Il frammento di codice seguente mostra come sostituire i contenuti di un allegato.

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

Rinomina gli allegati in MapiMessage

È possibile modificare il valore della proprietà DisplayName negli allegati MapiMessage.

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

Salva gli allegati da messaggi firmati digitalmente

L’API Aspose.Email fornisce la possibilità di ottenere o impostare un valore che indica se il messaggio firmato in chiaro sarà decodificato. 

Estrai oggetti OLE incorporati da oledata.mso

A volte i dati OLE incorporati sono rappresentati come un oledata.mso allegato in un MapiAttachment e deve essere estratto manualmente. Questi oledata.mso i file sono nel formato Microsoft Compound Document File (MCDF), e il supporto per tali file è al di fuori dello scopo di Aspose.Email. Tuttavia, Aspose.Email può essere usato in combinazione con altre librerie open source, come OpenMCDF, per leggere il contenuto di questi file e salvarli su disco. Aspose.Email fornisce il InlineAttachmentExtractor classe per enumerare i pacchetti MSO contenuti nei dati binari del oledata.mso, che può poi essere passato a una libreria di lettura di file composti per l’estrazione del contenuto.

Quando il tipo di corpo del messaggio è HTML (non RTF) e ci sono oggetti OLE nel messaggio, il MapiPropertyTag.PR_ATTACH_DATA_OBJ la proprietà è assente. In questo caso, le informazioni sugli oggetti OLE sono contenute in oledata.mso.

Per estrarre i contenuti usando Aspose.Email e OpenMCDF:

  • Enumera i pacchetti MSO dai dati binari del oledata.mso allegato.
  • Per ogni elemento OLE, leggi il file composto.
  • Leggi lo stream denominato CONTENTS.
  • Salva i contenuti in un 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++;
        }
    }
}