Vba 在outlook中收到新电子邮件时执行脚本
我需要在outlook中创建某种触发器,当收件箱中收到新电子邮件时,将执行python脚本。我确实参考了此链接:并编写了以下脚本:Vba 在outlook中收到新电子邮件时执行脚本,vba,outlook,Vba,Outlook,我需要在outlook中创建某种触发器,当收件箱中收到新电子邮件时,将执行python脚本。我确实参考了此链接:并编写了以下脚本: Private WithEvents Items As Outlook.Items Private Sub Application_Startup() Dim olApp As Outlook.Application Dim objNS As Outlook.NameSpace Set olApp = Outlook.Application Set objNS
Private WithEvents Items As Outlook.Items
Private Sub Application_Startup()
Dim olApp As Outlook.Application
Dim objNS As Outlook.NameSpace
Set olApp = Outlook.Application
Set objNS = olApp.GetNamespace("MAPI")
default local Inbox
Set Items = objNS.GetDefaultFolder(olFolderInbox).Items
End Sub
Private Sub test_macro(ByVal item As Object)
On Error GoTo ErrorHandler
Dim Msg As Outlook.MailItem
If TypeName(item) = "MailItem" Then
Set Msg = item
Ret_Val = Shell("python <path-of-python-script>")
Debug.Print "Value: ", Ret_Val
If Ret_Val <> 0 Then
MsgBox "Couldn't run python script", vbOKOnly
End If
End If
ProgramExit:
Exit Sub
ErrorHandler:
MsgBox Err.Number & " - " & Err.Description
Resume ProgramExit
End Sub
Private,事件项作为Outlook.Items
私有子应用程序_启动()
Dim olApp作为Outlook.Application
将对象设置为Outlook.NameSpace
设置olApp=Outlook.Application
Set objNS=olApp.GetNamespace(“MAPI”)
默认本地收件箱
Set Items=objNS.GetDefaultFolder(olFolderInbox).Items
端接头
专用子测试_宏(ByVal项作为对象)
关于错误转到错误处理程序
将消息作为Outlook.mailtim
如果TypeName(item)=“MailItem”,则
设置Msg=item
Ret_Val=Shell(“python”)
调试。打印“值:”,返回值
如果返回值为0,则
MsgBox“无法运行python脚本”,仅vbOKOnly
如果结束
如果结束
程序退出:
出口接头
错误处理程序:
MsgBox错误编号&“-”&错误说明
恢复程序退出
端接头
虽然它没有给出任何错误,但由于某些原因,我的python脚本没有执行。我已在outlook中相应地配置了宏设置,并根据可用文档创建了新规则。但仍然无法达到预期的效果
非常感谢您的帮助。您需要将您的
test\u宏
sub重命名为Items\u ItemAdd
。在您复制代码的答案中使用该名称是有原因的Items\u ItemAdd
表示子项是名为Items
的对象的ItemAdd
事件的事件处理程序
两个注释:
- 确保将您的代码放入
模块,然后重新启动Outlook对其进行初始化。该代码在标准模块中不起作用ThisOutlookSession
- 运行此宏不需要设置任何规则。每当收到(或添加到收件箱)新项目时,它都将运行
- 我建议不要像您在
Private with events Items as Outlook.Items中那样,对类实例(对象)重用类名。这令人困惑
- 要测试这一点,只需从某个文件夹(Ctrl+C)复制一封电子邮件,并将其粘贴到您的收件箱(Ctrl+V)。宏应该运行
Private,事件项作为Outlook.Items
私有子应用程序_启动()
Dim olApp作为Outlook.Application
将对象设置为Outlook.NameSpace
设置olApp=Outlook.Application
Set objNS=olApp.GetNamespace(“MAPI”)
'默认本地收件箱
Set Items=objNS.GetDefaultFolder(olFolderInbox).Items
MsgBox“Items\u ItemAdd侦听器已初始化。”
端接头
私有子项\u ItemAdd(ByVal项作为对象)
关于错误转到错误处理程序
将消息作为Outlook.mailtim
如果TypeName(Item)=“MailItem”,则
设置Msg=Item
MsgBox“Python脚本现在将运行。”
Ret_Val=Shell(“python”)
调试。打印“值:”,返回值
如果返回值为0,则
MsgBox“无法运行python脚本”,仅vbOKOnly
如果结束
如果结束
程序退出:
出口接头
错误处理程序:
MsgBox错误编号&“-”&错误说明
恢复程序退出
端接头
您需要将test\u宏
sub重命名为Items\u ItemAdd
。在您复制代码的答案中使用该名称是有原因的Items\u ItemAdd
表示子项是名为Items
的对象的ItemAdd
事件的事件处理程序
两个注释:
- 确保将您的代码放入
模块,然后重新启动Outlook对其进行初始化。该代码在标准模块中不起作用ThisOutlookSession
- 运行此宏不需要设置任何规则。每当收到(或添加到收件箱)新项目时,它都将运行
- 我建议不要像您在
Private with events Items as Outlook.Items中那样,对类实例(对象)重用类名。这令人困惑
- 要测试这一点,只需从某个文件夹(Ctrl+C)复制一封电子邮件,并将其粘贴到您的收件箱(Ctrl+V)。宏应该运行
Private,事件项作为Outlook.Items
私有子应用程序_启动()
Dim olApp作为Outlook.Application
将对象设置为Outlook.NameSpace
设置olApp=Outlook.Application
Set objNS=olApp.GetNamespace(“MAPI”)
'默认本地收件箱
Set Items=objNS.GetDefaultFolder(olFolderInbox).Items
MsgBox“Items\u ItemAdd侦听器已初始化。”
端接头
私有子项\u ItemAdd(ByVal项作为对象)
关于错误转到错误处理程序
将消息作为Outlook.mailtim
如果TypeName(Item)=“MailItem”,则
设置Msg=Item
MsgBox“Python脚本现在将运行。”
Ret_Val=Shell(“python”)
调试。打印“值:”,返回值
如果返回值为0,则
MsgBox“无法运行python脚本”,仅vbOKOnly
如果结束
如果结束
程序退出:
出口接头
错误处理程序:
MsgBox错误编号&“-”&错误说明
恢复程序退出
端接头
Private WithEvents Items As Outlook.Items
Private Sub Application_Startup()
Dim olApp As Outlook.Application
Dim objNS As Outlook.NameSpace
Set olApp = Outlook.Application
Set objNS = olApp.GetNamespace("MAPI")
' default local Inbox
Set Items = objNS.GetDefaultFolder(olFolderInbox).Items
MsgBox "Items_ItemAdd listener initialized."
End Sub
Private Sub Items_ItemAdd(ByVal Item As Object)
On Error GoTo ErrorHandler
Dim Msg As Outlook.MailItem
If TypeName(Item) = "MailItem" Then
Set Msg = Item
MsgBox "Python script will run now."
Ret_Val = Shell("python <path-of-python-script>")
Debug.Print "Value: ", Ret_Val
If Ret_Val <> 0 Then
MsgBox "Couldn't run python script", vbOKOnly
End If
End If
ProgramExit:
Exit Sub
ErrorHandler:
MsgBox Err.Number & " - " & Err.Description
Resume ProgramExit
End Sub