VBS: Outlook Send Now

VBScript und 64Bit !
Viele 32bit COM-Objekte lassen sich auf einem 64bit System nur instanziieren, wenn die 32bit Version von CSCRIPT/WSCRIPT genutzt wird, welcher unter C:\Windows\SysWOW64\cscript.exe liegt.

Outlook ist ja ein ganz nützliches Programm um automatisiert bestimmte Nachrichten zu versenden. Es gibt z.B.: jede Menge Produkte, die eine Mail einfach per MAPI oder Extended MAPI in Outlook einstellen und Outlook die Nachrichten übermitteln lassen.

Das Problem hierbei ist, dass dieses Verfahren nur funktioniert, wenn Outlook "Online" ist. Handelt es sich aber um einen Computer, der ohne Netzwerk vielleicht noch mit einer ISDN-Karte in einer Ecke steht, dann sendet Outlook diese Nachricht nicht sofort, sondern erst wenn der Anwender die Nachricht mit F9 versendet oder Sie eine regelmäßige automatische Versendung eingestellt haben.

Diese Einschränkung gilt nicht beim Einsatz eines Exchange Servers mit einer LAN-Verbindung. Sie gilt aber, wenn Outlook über SMTP Nachrichten versendet oder Outlook im "Offline Betrieb" ist und keine permanente Verbindung zum Exchange Server besteht.

Vielleicht gibt es sogar einen Weg, Outlook zu sagen, das er Nachrichten auch im Offline Mode sofort senden soll. Dann ist diese Beschreibung überflüssig. Ich habe aber keinen Weg gefunden.

Diese regelmäßige Verbindungsaufnahme ist aber vielen Firmen ein Dorn im Auge, da hierdurch Kosten auflaufen. Wenn Sie z.B. zeitnah diese generierten Nachrichten zustellen wollen, dann haben Sie nur die Wahl, entweder Outlook "immer online" sein zu lassen oder z.B. alle 5 Minuten eine Verbindung aufbauen zu lassen. Outlook Express würde ja sogar von alleine eine Verbindung aufbauen und eine anstehende Mail versenden, aber wenn die Mails mit dem Outlook Objekt Modell erstellt werden, dann kann Outlook Express nicht genutzt werden.

Immer Online ist beim Einsatz von ISDN oder analogen Leitungen jedoch nicht akzeptabel. Zwar sind auch die Kosten für "Internet by Call" mittlerweile unter 1cent/Minute gefallen, aber wenn ihr Outlook alle 5 Minuten eine Verbindung von ca. 60 Sekunden nur für das "Nichtstun" aufbaut, dann sind das im Jahr auch wieder 100 Euro. Schlimmer ist die Bilanz noch beim Einsatz von analogen Modems.

Eine permanente Verbindung ist zwar nett, aber aktuell nur mit DSL zu erreichen. Hier sind dann die monatlichen Grundgebühren für nur diese Anwendung sehr hoch oder DSL ist gar nicht verfügbar. Also muss eine Lösung her, die eine günstige Wählverbindung mit einem zeitnahen Versand koppelt.

Outlook mit VBScript

Das Outlook Objekt Modell erlaubt nicht nur die umfangreiche Manipulationen von Nachrichten im Informationsspeicher sondern auch eine weitgehende Steuerung von Outlook und den Funktionen. ein kurzer Blick in das Outlook Objekt Modell ergibt, dass es relativ einfach ist, den Postausgang zu Überwachen und eine Synchronisation anzustoßen. Im wesentlichen reicht folgender Ausschnitt aus dem Code:

Set myFolder= myOlApp.GetNameSpace("MAPI").GetDefaultFolder(olFolderOutbox)
Set mySyncs = myOlApp.GetNamespace("MAPI").SyncObjects
Set mySync = mySyncs.Item(1)

If (myFolder.Items.Count > 0)AND (drossel >0 ) Then
   mySync.Start
end if

Natürlich ist das wirklich nur die Kurzform. Der hier zum Download bereit gestellte Code ist schon etwas umfangreicher und dokumentiert und schreibt Protokolldateien.

Kostenbremse

Zudem ist im Code eine einfache Kostenbremse eingebaut. Das Script erkennt nur, ob eine Mail vorhanden ist, und wenn ja, dann stößt es die Replikation an und wartet einige Zeit, ehe sich der Vorgang wiederholt. Kann die Mail nicht versendet werden, z.B. weil  der Mailserver die Mail nicht annimmt, dann wird der Versand immer und immer wieder versucht. Dadurch würde immer wieder eine kostenpflichtige Verbindung aufgebaut.

Die Bremse ist so gelöst, dass das Skript ein "Konto" führt, welches am Anfang mit 1000 Punkten initialisiert wird. Jedes Anstoßen einer Replikation kostet 10 Punkte. Jeder Durchlauf ohne Replikation ergibt 1 Punkt Bonus.

Daher kann das Script bis zu 100 Mal hintereinander die Replikation anstoßen, ehe das Guthaben verbraucht ist. Dann jedoch müssen mindestens 10 Zyklen ohne Replikation durchlaufen werden, ehe wieder eine Replikation versucht wird. Die Werte können Sie im Skript Natürlich problemlos auf ihre Bedürfnisse anpassen. Aber wenn der Mailserver "down" ist, dann wird nach 100 Versuchen (also nach 100) Minuten die Schlagzahl auf 1 Versuch alle 10 Minuten reduziert. Sobald die Mail versendet ist und keine weiteren Mails anstehen, "verdient" sich das Script wieder ein Guthaben, so dass nach kurzer Erholzeit auch wieder mehrere Versandaktionen in kurzer Zeit möglich sind.

Leider ist es aus VBScript nicht möglich, auf das Ende der Replikation zu warten und danach nachzuschauen, ob die Nachrichten noch da sind. Dann wäre es ein einfaches zwischen erfolgreichen und erfolglosen Übermittlungen zu unterscheiden.

Grenzen

Es gib noch einige weitere Dinge, die Sie vor dem Einsatz des Skripts können sollten:

  • Laufzeitfehler werde nicht abgefangen und beenden das Skript.
  • keine Behandlung von Fehlversuchen
  • Verbindungsaufbau und Abbau muss Outlook oder der Router/RRAS machen
  • Drosselfunktion. Jeder Sync kostet 10 Punkte. jeder Idle gibt 1 Punkt, d.h. bei sehr viele Syncs wird irgendwann das Konto verbraucht sein und weitere Syncs werden dann gebremst
  • Achtung: Logfile wächst (300k/Tag = 100MB/Jahr) wenn nicht deaktiviert.
  • Das Skript läuft mit den Berechtigungen des angemeldeten Benutzers
  • Outlook muss vorher gestartet sein'

Download

Das Script wurde von mit auf Windows XP SP2 mit Outlook 2003 getestet. Ich würde mich �ber eine Meldung freuen, auch welchem Betriebssystem und welcher Outlook Version das Script bei ihnen eingesetzt wird.

olksendnowv1.0.vbs.txt (3,5 KB)

Benennen Sie die Textdatei nach dem Download einfach um und starten Sie das Skript mit 

cscript OlkSendNowV1.0.VBS

Die Aktivität wird auf der Konsole und in der Protokolldatei ausgegeben. Outlook muss vor dem Start jedoch kaufen. Das Script könnte auch Outlook starten, aber viele Installationen nutzen mehrere Profile und wechseln zwischen online und offline, so dass ich der Einfachheit halber von einem gestarteten Outlook ausgehe.

Alternativen

Dieses Skript ist Natürlich nur erforderlich, wenn Sie Nachrichten mit Outlook versenden wollen und Outlook weder online ist noch eine periodische Nachrichtenübertragung möglich ist. Ansonsten gibt es einige Alternativen, die ich kurz aufzeigen will:

  • BLAT
    Der Klassiker ist sicherlich Blat, um Nachrichten per SMTP direkt zu versenden. Sie benötigen weder Outlook noch ein andere System, sondern starten einfach BLAT. Allerdings müssen Sie schon selbst dafür sorgen, dass die Verbindung auf und abgebaut wird. Zudem müssen Sie den Fall abdecken, dass eine Mail nicht versendet werden kann. BLAT hat keine Warteschlange.
  • Outlook Express
    Wie schon weiter oben genannt, können Sie auch mit Outlook Express eine Mail erstellen und versenden. Outlook Express kann eine neue Nachricht sofort übermitteln
  • Outlook mit SMTP-Server
    Eine dritte Option ist die Installation eines SMTP-Servers auf dem PC mit Outlook. Outlook könnte dann "quasi" Online sein und nutzt 127.0.0.1 als Mailserver. Eine in Outlook eingestellt Mail wird dann "sofort" an den Mailserver auf dem gleichen System übergeben. Diese könnte dann die Mail an das Ziel weiterleiten. Der Mailserver könnte die Verbindung selbständig auf und abbauen oder auf Routing und RAS (RRAS) von Windows bauen. Auch hier würden dann nur Verbindungen aufgebaut werden, wenn eine Mail zu Versand ansteht.

Weitere Links