从新到的邮件中获取信息

时间:2013-12-28 06:16:14

标签: outlook-vba

我正在开发一个VBA程序,该程序将在Outlook中为新到达的电子邮件触发。 (标准设置在Outlook的“规则和警报”中。)

预计电子邮件将包含: -

“subject”字段包含:“WO_name / Task_name”

“身体”的第一行包括:“操作”

“String_1”,“String_2”,“String_3”和发件人的电子邮件地址将被送入批处理文件(总共4个参数)

这是我的代码:

Sub ChangeSubjectThenSend(Item As Outlook.MailItem)

WO = readCommand(Item.Subject, 1)
Task = readCommand(Item.Subject, 2)

Dim olItem As Outlook.MailItem
Dim sText As String
For Each olItem In Application.ActiveExplorer.Selection
    sText = olItem.Body
Next olItem

Shell ("C:\warehouse\WO\checkInOutTask\taskOperations.bat " & WO & " " & Task & " " & Item.SenderEmailAddress & " " & sText), vbNormalFocus

End Sub

Public Function readCommand(str As String, position As Integer) As String
Dim Tempstr() As String
If position >= 1 Then
Tempstr = Split(str, "/")
readCommand = Tempstr(position - 1)
End If

End Function

它提供当前在Outlook中选择的电子邮件条目的内容,而不是新收到的电子邮件。

如何让脚本针对新到的电子邮件运行?

2 个答案:

答案 0 :(得分:1)

当您打开Outlook Visual Basic编辑器时,您将看到的最小项目浏览器是:

Minimum Project Explorer

如果您对“Project1(VbaProject.OTM)”进行加密,它将扩展为:

First level folders

您的初始视图很可能是表格(如果有)和已扩展的模块。但“Microsoft Office Outlook Objects”可能不会扩展。单击加号以获取:

Expanded Microsoft Office Outlook Objects

点击“ThisOutlookSession”选择它,你会得到:

ThisOutlookSession

“ThisOutlookSession”就像一个模块,但它有额外的权限。特别是,您可以在此处指定事件例程。你的将是空的,但在这里你可以看到我为你创建的代码。

登录过程完成后,将调用

Private Sub Application_MAPILogonComplete()。我已经包含了初始化Public WithEvents MyNewItems As Outlook.Items的代码。由于此初始化,每次将新项目添加到收件箱时都会调用Private Sub myNewItems_ItemAdd(ByVal Item As Object)。我的代码只是在即时窗口中显示新项目的主题,但是,如果你用你的代码替换我的代码,你应该能够获得你想要的效果。

将以下代码添加到“ThisOutlookSession”,然后退出并重新进入Outlook。无论如何,您可能会收到足够的新电子邮件,但如果没有,请发送一些电子邮件。

Option Explicit
Public WithEvents MyNewItems As Outlook.Items
Private Sub Application_MAPILogonComplete()

  Dim NS As NameSpace

  Set NS = CreateObject("Outlook.Application").GetNamespace("MAPI")

  With NS
    Set MyNewItems = NS.GetDefaultFolder(olFolderInbox).Items
  End With

End Sub
Private Sub myNewItems_ItemAdd(ByVal Item As Object)

  With Item
    Debug.Print "Item added to Inbox with Subject: " & .Subject
  End With

End Sub

答案 1 :(得分:0)

要将代码应用于新到达的邮件,请不要选择任何内容。

改为使用传入 Item(Item As MailItem)

Option Explicit

Sub ChangeSubjectThenSend(Item As MailItem)

WO = readCommand(Item.subject, 1)
Task = readCommand(Item.subject, 2)

Dim sText As String
sText = Item.body

Shell ("C:\warehouse\WO\checkInOutTask\taskOperations.bat " & WO & " " & Task & " " & Item.SenderEmailAddress & " " & sText), vbNormalFocus

End Sub


Public Function readCommand(str As String, position As Long) As String

Dim Tempstr() As String

If position >= 1 Then
    Tempstr = Split(str, "/")
    readCommand = Tempstr(position - 1)
End If

End Function