code it

Martins Tech Blog

Einprägsames Office365 OWA

Wer von unterwegs auf seinen Exchange zugreifen möchte und keine Lust hat, lange Mails auf dem Smartphone zu schreiben, der verwendet sicher den Outlook Web Access. Bei SaaS-Produkten wie Office365 hat man nun selbst recht wenig Einfluss auf die Konfiguration des Servers und so wird auch hier der Servername bei der Einrichtung von Microsoft festgelegt. Möchte man sich nun mit dem eigenen OWA verbinden, muss man sich diesen Servernamen merken, auch wenn man inzwischen nicht mehr die Standard-Domain verwendet, sondern die eigene Domain hinterlegt hat.

Muss man nicht, wie ich heute gelernt habe.

Zum einen vergibt Microsoft selbst einen Alias. Unter der Url http://outlook.com/contoso.com - wobei contoso.com durch die eigene Domain ersetzbar ist ;) - kann man Zugriff auf seine persönliche Instanz erhalten. Diese Url ist schon wesentlich einprägsamer als der interne Servername.

Zum anderen hat man, so man die Einrichtung für den Zugriff aus Outlook vorgenommen hat, einen CNAME-Eintrag für seine Domain vorgenommen (http://autodiscover.contoso.com). Unter dieser Url ist nicht nur das Desktop-Outlook in der Lage, die Konfiguration automatisch vorzunehmen, sondern sie erlaubt auch Zugriff auf den eigenen OWA.

Beide Möglichkeiten habe ich in der Dokumentation von Office365 nicht gefunden (zumindest den ersten hätte ich dort erwartet), aber vielleicht hab ich auch nur an der falschen Stelle gesucht.

Fehlermeldung beim Öffnen von Word- und Excel-Dokumenten aus Outlook

Gelegentlich bekommt man ja auch mal Office-Dokumente per Mail geschickt. Und früher funktionierte es mal, dass man diese Dokumente auch direkt aus der Mail in Outlook per Doppelklick öffnen konnte - wie gesagt früher. Aktuell ist es bei mir so, dass ich dann von den Zielanwendungen - also Word 2010 oder Excel 2010 mit diversen Fehlermeldungen beglückt werde.

Excel meldet: "Die Datei ist beschädigt und kann nicht geöffnet werden.".

Word meint: "Fehler beim Öffnen der Datei in Word."

Und PowerPoint meldet gleich: "Die Anwendung konnte nicht korrekt gestartet werden (0x000022)." und bietet mir an, die Präsentation zu reparieren.

Ursache dafür ist das Sicherheitscenter (englisch Trust Center). Dieses findet man unter Datei -> Sicherheitscenter im jeweiligen Programm. Unter dem Menüpunkt "Geschützte Ansicht" gibt es die Option "Geschützte Ansicht für Outlook Anlagen aktivieren".

Deaktiviert man diese Option, so kann man die Dateien auch wieder aus Outlook heraus öffnen.

Mails versenden mit Outlook und Dynamics

Ein altbekanntes Problem, aber eines, das auch in Foren immer wieder gestellt wird ist "Wie kann ich Mails mit Outlook versenden?" - nach Möglichkeit unabhängig von der Outlook-Version des Anwenders.

Ein Weg unter vielen ist die Verwendung der Dynamic Language Runtime. Diese gibt es seit dem .NET Framework 4.0 und sie erlaubt einen Zugriff auf Typen, die in ihrer wirklichen Ausprägung erst zur Laufzeit fest stehen. Einen Überblick über die Grundzüge und die Möglichkeiten der DLR gibt es in der MSDN.

In der Praxis sieht das Ganze dann in etwa so aus:

private void ComposeEmail(string receipient, string subject, string body)
{
   const int olMailItem = 0;

   dynamic outlookApp = GetOutlookApplication();
   if (outlookApp == null)
   {
       MessageBox.Show("Outlook konnte nicht initialisiert werden.");
       return;
   }

   dynamic mailItem = outlookApp.CreateItem(olMailItem);
   mailItem.To = receipient;
   mailItem.Body = body;
   mailItem.Subject = subject;
   mailItem.Display();
   //mailItem.Send();
}

private dynamic GetOutlookApplication()
{
   // try to get an existing outlook instance
   try
   {
       dynamic outlookApp = System.Runtime.InteropServices.Marshal.GetActiveObject("Outlook.Application");
       return outlookApp;
   }
   catch (System.Runtime.InteropServices.COMException)
   {
   }

   // try to get an existing outlook instance
   try
   {
       dynamic outlookApp = System.Activator.CreateInstance(
          System.Type.GetTypeFromProgID("Outlook.Application"));
       return outlookApp;
   }
   catch
   {
       return null;
   }
}

Die Funktion GetOutlookApplication versucht zunächst eine laufende Outlook-Instanz zu ermitteln. Schlägt das fehl wird eine neue Instanz geöffnet. Dabei wird das Objekt über den Registry-Eintrag "Outlook.Application" referenziert. Dies ist ein Verweis auf die jeweils aktuelle Outlook-Installation.

Die ermittelte Outlook-Instanz wird dann verwendet, um ein neues MailItem zu erzeugen. Im Beispiel wird das Item nur angezeigt, damit der Kunde es noch bearbeiten kann. Durch die Verwendung von Late Binding mit dem dynamic Schlüsselwort ist zur Entwicklungszeit irrelevant, welche Version der Kunde installiert hat. Die Überprüfung erfolgt erst zur Laufzeit. Wird dann auf eine Eigenschaft oder Methode zugegriffen, die es bei dem real vorliegenden Objekt nicht gibt, so wird ein RuntimeException geworfen, die es zu behandeln gilt.

Das Outlook-Fenster kann nicht geöffnet werden...

Vor wenigen Tagen begrüßte mich Outlook mit der vielsagenden Meldung "Microsoft Office Outlook kann nicht gestartet werden. Das Outlook-Fenster kann nicht geöffnet werden."

Seltsam daran war, dass im Hintergrund dieser Meldung sehr wohl ein Outlook-Fenster zu sehen war, dieses aber nach einem Klick auf OK in obiger Meldung gleich wieder verschwand.

Einige Suche brachte zu Tage, dass das Profil neu erstellt werden muss oder XML-Dateien korrupt sind oder oder oder....

Aber alle diese Hinweise brachten mich zu keinem Erfolg. In einem letzten Aufbäumen der Kreativität versuchte ich dann noch die Reparatur-Kommandozeilenoptionen von Outlook selbst und siehe da - mit outlook.exe /resetnavpane hatte ich Erfolg und Outlook startet seitdem wieder normal.