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:
W ‘Add Reference…’ na zakładce COM wybieramy ‘Microsoft Outlook 11.0 Object Library’
Dodajemy referencję do przestrzeni nazw:
using Microsoft.Office.Interop.Outlook;
- 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);
}