Единственное решение, которое я могу придумать, заключается в запуске некоторого VBA, который запускает функцию «Отправить / Получить» каждые х минут.
Основываясь на этом ответе от переполнения стека, этом ответе на MSDN и нескольких незначительных изменениях, я думаю, что это решение должно работать.
Поместите следующий код в модуль ThisOutlookSession
(Инструменты -> Макросы -> Редактор VB):
Private Sub Application_Quit()
If TimerID <> 0 Then Call DeactivateTimer 'Turn off timer upon quitting **VERY IMPORTANT**
End Sub
Private Sub Application_Startup()
Call ActivateTimer(30) 'Set timer to go off every 30 minutes
End Sub
И следующий код в новом модуле VBA:
Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerfunc As Long) As Long
Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Public TimerID As Long 'Need a timer ID to eventually turn off the timer. If the timer ID <> 0 then the timer is running
Public Sub ActivateTimer(ByVal nMinutes As Long)
nMinutes = nMinutes * 1000 * 60 'The SetTimer call accepts milliseconds, so convert to minutes
If TimerID <> 0 Then Call DeactivateTimer 'Check to see if timer is running before call to SetTimer
TimerID = SetTimer(0, 0, nMinutes, AddressOf TriggerTimer)
If TimerID = 0 Then
MsgBox "The timer failed to activate. Checking of email will not happen."
End If
End Sub
Public Sub DeactivateTimer()
Dim lSuccess As Long
lSuccess = KillTimer(0, TimerID)
If lSuccess = 0 Then
MsgBox "The timer failed to deactivate."
Else
TimerID = 0
End If
End Sub
Public Sub TriggerTimer(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idevent As Long, ByVal Systime As Long)
'keeps calling every X Minutes unless deactivated
If idevent = TimerID Then Call SyncOL
End Sub
Public Sub SyncOL()
' Synchronizes (ie sends/receives) OL folders.
' Ref: http://msdn.microsoft.com/en-us/library/ff863925.aspx
Dim appOL As Outlook.Application, objNsp As Outlook.NameSpace
Dim colSyc As Outlook.SyncObjects, objSyc As Outlook.SyncObject
Dim i As Integer
On Error GoTo SyncOL_Err
' Use late binding to avoid the "Reference" issue.
If isAppThere("Outlook.Application") = False Then
Set appOL = CreateObject("Outlook.Application") ' OL not open
Else
Set appOL = GetObject(, "Outlook.Application") ' OL already open
End If
Set objNsp = appOL.Application.GetNamespace("MAPI")
Set colSyc = objNsp.SyncObjects
For i = 1 To colSyc.Count
Set objSyc = colSyc.Item(i)
' Debug.Print objSyc.Name
objSyc.start
Next
' Call MsgBox("Outlook synchronization initiated ...", vbInformation)
SyncOL_Exit:
Set appOL = Nothing: Set objNsp = Nothing: Set colSyc = Nothing: Set objSyc = Nothing
Exit Sub
SyncOL_Err:
MsgBox "error=" & Err.Number & " " & Err.Description & " in SyncOL()"
Resume SyncOL_Exit
End Sub
После запуска (и отключения push или любых существующих таймеров) этот код будет запускаться каждые 30 минут и инициировать отправку и получение. Поскольку у меня нет Outlook, подключенного к Exchange, я не могу проверить, действительно ли это работает.