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

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;

     

  3. 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);
    }