Outlookzugriff aus Scheduled Task
22.04.2020 11:55:33
Michael
ich habe hier ein Problem, bei dem ich irgendwie nicht weiterkomme.
Die Situation ist die folgende:
Eine Excel-Datei prüft auf einer Datenbank bestimmte Datensätze ab und soll beim Überschreiten bestimmter Fristen eine E-Mail an spezifizierte Empfänger senden. Bislang wurde die Exceldatei in regelmäßigen Abständen durch eine C#.NET-Anwendung geöffnet und hat dann automatisch die Prüfung begonnen.
Das funktioniert alles wunderbar. Auch wenn ich die Excel-Datei manuell öffne und den Prüfprozess abfeuere. Kein Problem.
In einem Klassenobjekt habe ich mir ein Outlook-Objekt konstruiert. Dort wird beim Initialisieren regulär die lokale Outlook-Instanz angesprochen.
Das Outlook-Objekt dazu wird über die folgende Funktion geholt:
Public Function g_startOutlook() As Object
Dim oOutlook As Object
Dim sAPPPath As String
Dim objOutlook As Outlook.Application
On Error GoTo Error_Handler_Exit
Call g_writeToProcessTracking(ThisWorkbook.Path & "log.txt", Now() & ": Start Outloook" & _
_
_
vbCrLf, True)
If Not g_objOutlookObject Is Nothing Then
Set oOutlook = g_objOutlookObject
Else
'sAPPPath = g_GetAppExePath("outlook.exe")
'Call Shell(sAPPPath, vbMaximizedFocus)
If oOutlook Is Nothing Then Call g_writeToProcessTracking(ThisWorkbook.Path & "log.txt", _
_
_
Now() & ": clsOutlookMail: Try to create Outlook-Object" & vbCrLf, True)
Set oOutlook = CreateObject("Outlook.Application")
Set g_objOutlookObject = oOutlook
If oOutlook Is Nothing Then Call g_writeToProcessTracking(ThisWorkbook.Path & "log.txt", _
_
_
Now() & ": clsOutlookMail: oOutlook is nothing" & vbCrLf, True)
End If
If oOutlook Is Nothing Then Call g_writeToProcessTracking(ThisWorkbook.Path & "log.txt", _
Now() & ": clsOutlookMail: oOutlook is nothing - return value" & vbCrLf, True)
Set g_startOutlook = oOutlook
Call g_writeToProcessTracking(ThisWorkbook.Path & "log.txt", Now() & ": Outloook started" & _
_
_
vbCrLf, True)
'On Error Resume Next
'Set oOutlook = Nothing
Exit Function
Error_Handler_Exit:
On Error Resume Next
'Set oOutlook = Nothing
Call g_writeToProcessTracking(ThisWorkbook.Path & "log.txt", Now() & ": Start Outloook - _
Error (" & Err.Description & ")" & vbCrLf, True)
Exit Function
End Function
Klappt auch wie gesat alles wunderbar. Nun gibt es das folgende Problem:
Die Anwendung läuft auf einem Server. Dieser kann aber aufgrund von Wartung öfter mal neu gestartet werden. Daher haben wir zunächst versucht die C#-Anwendung über ein Scheduled Task zu starten und zwar bei System-Startup. Also ohne, dass sich ein User einloggen muss. Die Anwendung startet dann zwar auch, öffnet auch Excel, aber aus Excel heraus wird dann offenbar kein Outlook geöffnet. Ok soweit.
Also sind wir hergeganen und haben die Excel-Datei mittels bat-Datei geöffnet, wobei die bat-Datei ebenfalls über eine Scheduled Task geöffnet wird. Das funktioniert auch soweit.
Nun gibt es zwei Probleme: Wenn Outlook irgendwie über eine Scheduled Task geöffnet wird, kann Excel über
GetObject(,"Outlook.Application")
nicht auf die Outlook-Instanz zugreifen. Liegt das evtl. daran, dass Outlook hier irgendwie nicht greifbar für Excel ist?
Über
CreateObject("Outlook.Application")
kann seltsamerweise keine Outlook-Instanz erzeugt werden. Mittels
Set oOutlook = new Outlook.Application
funktioniert es zwar, dann bleibt er aber beim Versuch ein neues Mailitem über
Set m_objMailObject = oOutlook.CreateItem(0)
zu erzeugen hängen und läuft nicht weiter. Ein Debug ist hier nicht möglich, da die Anwendung ja auch nicht sichtbar ist. Deshalb werden bestimmte Code-Schritte über
g_writeToProcessTracking
auch in ein Log geschrieben.
Ich habe auch versucht Outlook über die Shell zu öffnen. Funktioniert auch, aber ich kann die Outlook-Instanz nicht abgreifen.
Bei der anzen Scheduled-Task-Sache laufen die Anwendungen alle im Hintergrund. Sie müssen halt auch funktionieren, wenn kein User angemeldet ist.
Habt ihr vielleicht eine Idee, woran das liegen könnte? Oder ob man irgendwie auch auf die Outlook-Instanz zugreifen könnte, die im Hinterrund gestartet oder erzeugt wurde?
Vielen Dank im Voraus und bleibt gesund!