使用VBScript调用Outlook过程

时间:2014-01-17 07:00:38

标签: vba vbscript outlook-vba

我在Outlook中有一个程序,可以在Drafts文件夹中发送所有已保存的邮件 以下是代码:

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不擅长,所以我也不知道如何编写代码来调用Outlook程序。我已完成调用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

但它会引发错误,说不支持对象ProcedureName 希望有人可以解释一下。

SOLUTION:

好的,我已经找到了2个可以避免或者通过弹出窗口的工作。

popup

第一个:就像KazJaw指出的那样。

假设您有另一个程序(例如Excel,VBScript),其中包括在程序中通过Outlook发送邮件。
而不是使用.Send,只需.Save邮件 它将保存在Outlook's Draft文件夹中 然后使用下面的代码,使用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进行安排。

第二个:是在出现安全弹出窗口时使用API​​以编程方式单击允许按钮。
积分给SiddarthRout寻求帮助。
这是LINK,它将帮助您以编程方式单击允许按钮。
当然你需要调整一下。

3 个答案:

答案 0 :(得分:4)

尝试过&amp;测试<!/强>

假设您的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
    

答案 1 :(得分:2)

  

我将把程序放在Outlook,Module或ThisOutlookSession中?

都不是。将以下代码粘贴到文本文件中,并将其另存为.VBS文件。然后从任务计划程序调用此VBS文件,如图HERE

所示
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

答案 2 :(得分:1)

如果您正在使用Outlook Office '07或更新版本,我发现您可以通过执行以下操作轻松消除上面提到的安全性弹出窗口:

1)在Outlook 2007信任中心中,转到宏安全性 - 选择“无安全检查宏”

2)在Outlook 2007信任中心,转到Programatic Access - 选择“从不警告我可疑的活动。”

当然,从技术上讲,你可以通过电子邮件向某人发送一些恶意电子邮件脚本或我认为具有某种性质的东西。我相信我的公司有管理,这对我有用。我可以在Outlook,Access,Excel中使用VBS脚本发送非安全弹出的电子邮件。

另一种选择: 如果您不想这样做,那么在此之前对我有用的另一个选项是: http://www.dimastr.com/redemption/objects.htm

基本上是一个不包含弹出窗口的dll重定向。它保留了你的其他默认安全性,你可以编写\调用你的VBA和没有安全弹出窗口的sned邮件。