Coding with Titans

so breaking things happens constantly, but never on purpose

Kiedy ‘mailto:’ już nie wystarcza

Bardzo szybko okazuje się, że prosta operacja przygotowania e-maila w domyślnym kliencie pocztowym na platformie Windows urasta do rangi spędzenia całego wieczoru na przeglądaniu internetowych forów w poszukiwaniu pomocy… Mail ten był o tyle specyficzny, iż miał posiadać ustawione od razu wartości:

  • w polu osoby odbiorcy
  • w polu tytułu
  • treść
  • oraz być z załącznikiem.

Najprostsze rozwiązanie, jakie przychodzi na myśl to wykonać zwykłe otwarcie poniższego odnośnika:

[mailto:receiver@mail.com?subject=Tytul&body=To jest specjalny email&attachment=/path/file.txt](mailto:receiver@mail.com?subject=Tytul&body=To jest specjalny email&attachment=/path/file.txt)

Niestety, MS Outlook 2003 ma problem z dołączeniem załącznika. Ścieżka nie gra tu najmniejszej roli, opakowanie jej w apostrofy, zmiana slash na backslash itp. nie pomagają. Parametr ten jest po prostu ignorowany i jego błędne podanie może tylko spowodować pokazanie komunikatu błędu.

Inne dwa potencjalne rozwiązania to, uruchomienie pliku outlook.exe z odpowiednimi przełącznikami (dokumentacja), jednakże wymienione wartości nie mogą być podane razem. Dlaczego?.. ot takie zachowanie programu.

Ostateczne rozwiązanie wygląda zatem tak, że bez pomocy małego programu w C# i odwołania do VSTO (Visual Studio 2008 Tools for Office) się nie obejdzie. Jego utworzenie wygląda mniej, więcej tak:

  1. W ‘Add Reference…’ na zakładce COM wybieramy ‘Microsoft Outlook 11.0 Object Library

    Add Reference

  2. Dodajemy referencję do przestrzeni nazw:

using Microsoft.Office.Interop.Outlook;
  1. Tworzymy odpowiedni obiekt e-mail i wypełniamy go danymi programistycznie. UWAGA! Aby uniknąć pytania z systemu zabezpieczeń Outlook o próbie przeglądania książki adresowej zalecam dodanie załącznika jako pierwszą operację w pozycji startowej wiadomości.
_Application app = new Application();
_MailItem messageItem = app.CreateItem(OlItemType.olMailItem) as _MailItem;

if (messageItem != null)
{
   Attachments attachments = messageItem.Attachments;
   string sourceFile = @"path-to-attachment-file";

   string displayName = "Hello.txt";
   attachments.Add(sourceFile, OlAttachmentType.olByValue, 1, displayName);
   messageItem.Subject = "Hello World";
   messageItem.Body = "New email with attachment using VSTO - Visual C#";

   messageItem.To = "receiver@mail.com";
   messageItem.Display(false);
}