Tworzenie i zapisywanie plików Outlook

Aspose.Email obsługuje tworzenie plików wiadomości Outlook (MSG). Ten artykuł wyjaśnia, jak:

Utwórz i zapisz wiadomości Outlook

Ten MailMessage klasy ma Save() metoda, która może zapisać pliki Outlook MSG na dysk lub strumień. Poniższe fragmenty kodu tworzą instancję MailMessage klasy, ustaw właściwości takie jak from, to, subject i body. Metoda Save() metoda przyjmuje nazwę pliku jako argument. Dodatkowo wiadomości Outlook mogą być tworzone z skompresowane ciało RTF używając MapiConversionOptions

  1. Utwórz nową instancję MailMessage klasy i ustawia właściwości From, To, Subject oraz Body.
  2. Wywołaj MapiMessage klasa FromMailMessage metoda, która przyjmuje obiekt MailMessage typ. Metoda FromMailMessage metoda konwertuje MailMessage do MapiMessage (MSG).
  3. Wywołaj MapiMessage.Save() metoda zapisu pliku MSG.

Umieść poniższy kod w zdarzeniu kliknięcia przycisku kontrolki w aplikacji Windows.

// Create an instance of the MailMessage class
MailMessage mailMsg = new MailMessage();

// Set from, to, subject and body properties
mailMsg.From = "sender@domain.com";
mailMsg.To = "receiver@domain.com";
mailMsg.Subject = "This is test message";
mailMsg.Body = "This is test body";

// Create an instance of the MapiMessage class and pass MailMessage as argument
MapiMessage outlookMsg = MapiMessage.FromMailMessage(mailMsg);
            
// Save the message (MSG) file
string strMsgFile = @"CreatingAndSavingOutlookMessages_out.msg";
outlookMsg.Save(dataDir + strMsgFile);

Tworzenie plików MSG z załącznikami

W powyższym przykładzie, utworzyliśmy prosty plik MSG. Aspose.Email obsługuje również zapisywanie plików wiadomości z załącznikami. Wystarczy dodać załączniki do MailMessage instancji. Dodaj załączniki, wywołując metodę Add() na MailMessage.Attachments kolekcję. Dodaj listbox do formularza utworzonego powyżej i dodaj dwa przyciski, po jednym do dodawania i usuwania załączników. Aplikacja dodająca załączniki działa w ten sposób:

  1. Po kliknięciu przycisku Add Attachment wyświetlany jest Open File Dialog, który pomaga użytkownikom przeglądać i wybierać załączniki.
  2. Po wybraniu pliku pełna ścieżka jest dodawana do listy.
  3. Gdy plik MSG jest tworzony, ścieżki załączników są pobierane z listy i dodawane do MailMessage.Attachments kolekcję.

Wpisz poniższy kod w zdarzeniu kliknięcia przycisku Add Attachment.

// Open a file open dialog to select the attachment
OpenFileDialog fd = new OpenFileDialog();
// If user selected the file and clicked OK, add the file name and path to the list
if (fd.ShowDialog() == DialogResult.OK)
{
    lstAttachments.Items.Add(fd.FileName);
}

Po kliknięciu przycisku Remove Attachment usuń zaznaczone pozycje z listboxa. Wpisz poniższy kod w zdarzeniu kliknięcia przycisku Remove Attachment.

// Check if the user has selected any item in the attachments listbox
if (lstAttachments.SelectedItems.Count > 0)
{
    // Remove the selected attachment from the listbox
    lstAttachments.Items.RemoveAt(lstAttachments.SelectedIndex);
}

Dodaj kod dodający załączniki do MailMessage instancji. Ostateczny kod funkcji Write Msg jest przedstawiony poniżej.

// File name for output MSG file
string strMsgFile;

// Open a save file dialog for saving the file and Add filter for msg files
SaveFileDialog fd = new SaveFileDialog();
fd.Filter = "Outlook Message files (*.msg)|*.msg|All files (*.*)|*.*";

// If user pressed OK, save the file name + path
if (fd.ShowDialog() == DialogResult.OK)
{
    strMsgFile = fd.FileName;
}
else
{
    // If user did not selected the file, return
    return;
}

// Create an instance of MailMessage class
MailMessage mailMsg = new MailMessage();
// Set from, to, subject and body properties
mailMsg.From = txtFrom.Text;
mailMsg.To = txtTo.Text;
mailMsg.Subject = txtSubject.Text;
mailMsg.Body = txtBody.Text;

// Add the attachments
foreach (string strFileName in lstAttachments.Items)
{
    mailMsg.Attachments.Add(new Attachment(strFileName));
}

// Create an instance of MapiMessage class and pass MailMessage as argument
MapiMessage outlookMsg = MapiMessage.FromMailMessage(mailMsg);
outlookMsg.Save(strMsgFile);

Utwórz pliki MSG z ciałem RTF

Możesz także tworzyć pliki Outlook Message (MSG) z ciałami w formacie rich text (RTF) przy użyciu Aspose.Email. Ciało RTF obsługuje formatowanie tekstu. Utwórz je, ustawiając MailMessage.HtmlBody właściwość. Gdy konwertujesz MailMessage instancja do MapiMessage instancja, ciało HTML jest konwertowane do RTF. W ten sposób formatowanie treści e‑maila jest zachowane.

Poniższy przykład tworzy plik MSG z ciałem w formacie RTF. W ciele HTML znajduje się jeden nagłówek oraz formatowanie pogrubione i podkreślone. To formatowanie jest zachowywane po konwersji HTML do RTF.

// Create an instance of the MailMessage class
MailMessage mailMsg = new MailMessage();
            
// Set from, to, subject and body properties
mailMsg.From = "from@domain.com";
mailMsg.To = "to@domain.com";
mailMsg.Subject = "subject";
mailMsg.HtmlBody = "<h3>rtf example</h3><p>creating an <b><u>outlook message (msg)</u></b> file using Aspose.Email.</p>";
            
MapiMessage outlookMsg = MapiMessage.FromMailMessage(mailMsg);
outlookMsg.Save(dataDir + "CreatingMSGFilesWithRTFBody_out.msg");

Kompresja RTF dla treści wiadomości MAPI

UWAGA: Proces kompresji może spowolnić wydajność przy tworzeniu wiadomości. Rozumiejąc ten fakt i konfigurując flagę kompresji w oparciu o konkretne wymagania oraz kompromis między rozmiarem pliku a wydajnością, programiści mogą skutecznie zarządzać tworzeniem plików MSG i PST przy obsłudze wiadomości e‑mail.

Kompresja RTF ma na celu zmniejszenie rozmiaru wiadomości, a także powstałych plików PST (Personal Storage Table), które Microsoft Outlook używa do przechowywania wiadomości e‑mail i innych danych. Korzystając z kompresji RTF przy konfigurowaniu treści wiadomości, programiści mogą zmniejszyć ilość pamięci potrzebnej do przechowywania wiadomości e‑mail lub zoptymalizować przepustowość sieci przy przesyłaniu wiadomości.

W tym celu zaprojektowano dwie przeciążone metody:

  • MapiMessageItemBase.SetBodyContent(string content, BodyContentType contentType, bool compression): Ta metoda umożliwia ustawienie treści ciała wiadomości przy użyciu podanego łańcucha oraz określenie typu zawartości ciała (np. zwykły tekst, HTML itp.). Opcjonalny parametr compression jest wartością określającą, czy treść powinna być skompresowana przy użyciu kompresji RTF. Jeśli parametr compression jest true, treść zostanie skompresowana, co skutkuje mniejszym rozmiarem wiadomości.

  • MapiMessageItemBase.SetBodyRtf(string content, bool compression): Ta metoda ustawia treść ciała wiadomości w formacie RTF. Parametr content jest łańcuchem reprezentującym treść RTF, która zostanie ustawiona jako ciało wiadomości. Podobnie jak w poprzedniej metodzie, parametr compression określa, czy na treść należy zastosować kompresję RTF. Jeśli compression jest true, treść RTF zostanie skompresowana w celu zmniejszenia rozmiaru.

Poniższy przykład kodu pokazuje, jak ustawić treść HTML i zachować jej kompresję:

var htmlBody = "<html><body><h1>This is the body content</h1></body></html>";

var msg = new MapiMessage("from@domain.com", "to@domain.com", "subject", "body");
// set the html body and keep it compressed
// this will reduce the message size
msg.SetBodyContent(htmlBody, BodyContentType.Html, true);

Istnieje także MapiConversionOptions.UseBodyCompression właściwość. Gdy ta właściwość jest włączona, kompresja treści RTF jest stosowana podczas konwersji MailMessage do MapiMessage, co skutkuje mniejszym rozmiarem pliku MSG. Poniżej pokazano przykład kodu:

var message = MailMessage.Load(fileName);
var options = new MapiConversionOptions();
options.UseBodyCompression = true;
var msg = MapiMessage.FromMailMessage(message, options);

Zapisz wiadomość w stanie szkicu

E-maile są zapisywane jako wersje robocze, gdy ktoś rozpoczął ich edycję, ale chce do nich wrócić w celu dokończenia później. Aspose.Email obsługuje zapisywanie wiadomości e‑mail w stanie wersji roboczej poprzez ustawienie flagi wiadomości. Poniżej znajduje się przykładowy kod, który zapisuje wiadomość e‑mail Outlook (MSG) jako wersję roboczą.

// Change properties of an existing MSG file
string strExistingMsg = @"message.msg";
            
// Load the existing file in MailMessage and Change the properties
MailMessage msg = MailMessage.Load(dataDir + strExistingMsg, new MsgLoadOptions());
msg.Subject += "NEW SUBJECT (updated by Aspose.Email)";
msg.HtmlBody += "NEW BODY (updated by Aspose.Email)";
            
// Create an instance of type MapiMessage from MailMessage, Set message flag to un-sent (draft status) and Save it
MapiMessage mapiMsg = MapiMessage.FromMailMessage(msg);
mapiMsg.SetMessageFlags(MapiMessageFlags.MSGFLAG_UNSENT);
mapiMsg.Save(dataDir + "SavingMessageInDraftStatus_out.msg");