Вызов процедуры Outlook с помощью VBScript

у меня есть процедура в Outlook, которая отправляет все сохраненные сообщения в .
Ниже код:

Public Sub SendMail()

Dim olApp As Outlook.Application
Dim olNS As Outlook.NameSpace
Dim olFolder As Outlook.MAPIFolder
Dim olDraft As Outlook.MAPIFolder
Dim strfoldername As String
Dim i As Integer

Set olApp = Outlook.Application
Set olNS = olApp.GetNamespace("MAPI")
Set olFolder = olNS.GetDefaultFolder(olFolderInbox)

strfoldername = olFolder.Parent

Set olDraft = olNS.Folders(strfoldername).Folders("Drafts")

If olDraft.Items.Count <> 0 Then
    For i = olDraft.Items.Count To 1 Step -1
        olDraft.Items.Item(i).Send
    Next
End If

End Sub

выше код работает нормально.

вопрос:

я хочу использовать Task Scheduler чтобы запустить эту процедуру в указанное время.
1. Где я помещу процедуру в Outlook, Module или ThisOutlookSession?
2. Я не хорош в vbscript так я тоже не знаю, как ее назвать Процедура Мировоззрение. Я сделал вызов процедуры Excel, но Outlook не поддерживает .Run собственность.

так что это не работает:

Dim olApp

Set olApp = CreateObject("Outlook.Application")
olApp.Run "ProcedureName"

Set olApp = Nothing

я также читал о Session.Logon такой:

Dim olApp

Set olApp = CreateObject("Outlook.Application")
olApp.Session.Logon
olApp.ProcedureName

Set olApp = Nothing

но он выдает ошибку, говоря object ProcedureName не поддерживается.
Надеюсь, кто-нибудь прольет свет.

устранение:

хорошо, я понял, что 2 работает, чтобы избежать или получить пройти это выскочить.

popup

1-я: как указал Казджав.

предполагая, что у вас есть другая программа (например. Excel, VBScript), который включает отправку почты через Outlook в порядок.
Вместо использования .Send, просто .Save почта.
Он будет сохранен в .
Затем, используя код ниже, отправьте черновик, который срабатывает с помощью Outlook Task Reminder.

Option Explicit
Private WithEvents my_reminder As Outlook.Reminders

Private Sub Application_Reminder(ByVal Item As Object)

Dim myitem As TaskItem

If Item.Class = olTask Then 'This works the same as the next line but i prefer it since it automatically provides you the different item classes.
'If TypeName(Item) = "TaskItem" Then
    Set my_reminder = Outlook.Reminders
    Set myitem = Item
    If myitem.Subject = "Send Draft" Then
        Call SendMail
    End If
End If

End Sub

Private Sub my_reminder_BeforeReminderShow(Cancel As Boolean)

Cancel = True
Set my_reminder = Nothing

End Sub

выше код пожары, когда Task Reminder показывает с темой "отправить проект".
Но мы не хотим, чтобы он показывался, так как весь смысл заключается в том, чтобы просто вызвать SendMail процедуры.
Поэтому мы добавили процедуру, которая Cancels отображение напоминания, которое имеет olTask класса или TaskItem тип.

для этого Outlook работает конечно.
Вы можете держать его работает 24 часа, как я сделал или, создать VBscript это открывает его по расписанию через Task Scheduler.

2-я: использовать API для программного нажатия на разрешить кнопка при появлении всплывающего окна безопасности.
Кредиты Сиддартруту за помощь.
Вот это ссылке, который поможет вам программно нажать на разрешить.
Конечно, вы должны немного подправить его.

3 ответов


Пробовал И Протестирован!

предполагая, что у вас всегда работает приложение Outlook (в соответствии с комментарием ниже вашего вопроса), Вы можете сделать то, что вам нужно, в следующих шагах:

  1. добавьте новую задачу в Outlook, задайте тему: "запустить макрос YourMacroName" и установите время (плюс циклы), когда должен запускаться макрос.

  2. перейдите в Редактор VBA, открыт ThisOutlookSession module и добавьте следующий код внутри (плюс см. комментарии внутри код):

    Private Sub Application_Reminder(ByVal Item As Object)
    
    If TypeName(Item) = "TaskItem" Then
        Dim myItem As TaskItem
        Set myItem = Item
        If myItem.Subject = "run macro YourMacroName" Then
    
            Call YourMacroName    '...your macro name here
    
        End If
    End If
    End Sub
    

где я помещу процедуру в Outlook, Module или ThisOutlookSession?

ни. Вставьте ниже код в текстовый файл и сохраните его как . Затем вызовите этот файл VBS из Планировщик Задач как показано здесь

Dim olApp, olNS, olFolder, olDraft, strfoldername, i

Set olApp = GetObject(, "Outlook.Application")
Set olNS = olApp.GetNamespace("MAPI")
Set olFolder = olNS.GetDefaultFolder(6)

strfoldername = olFolder.Parent

Set olDraft = olNS.Folders(strfoldername).Folders("Drafts")

If olDraft.Items.Count <> 0 Then
    For i = olDraft.Items.Count To 1 Step -1
        olDraft.Items.Item(i).Send
    Next
End If

Если вы используете Outlook Office ' 07 или новее, я обнаружил, что вы можете легко устранить всплывающее окно безопасности, упомянутое выше, при запуске сценария, выполнив следующие действия:

1) в Outlook 2007 Trust Center перейдите в раздел Безопасность макросов - выберите "Нет проверки безопасности макросов"

2) в центре доверия Outlook 2007 перейдите к Programatic Access - выберите "никогда не предупреждать меня о подозрительной деятельности.

конечно, это технически оставляет вас открытым для удаленного возможность для кого-то отправить вам по электронной почте какой-то вредоносный скрипт электронной почты или что-то в этом роде, я предполагаю. Я верю, что моя компания справилась, хотя и это работает для меня. Я могу использовать скрипты VBS в Outlook, Access, Excel для отправки писем с небезопасным всплывающим окном.

Другой Вариант: Если вы не хотите этого делать, еще один вариант, который хорошо работал для меня до этого здесь: http://www.dimastr.com/redemption/objects.htm

в основном перенаправление dll это не включает всплывающее окно. Он оставляет вашу другую безопасность по умолчанию на месте, и вы пишете \ вызываете свой VBA для него и sned mail без всплывающих окон безопасности.