VBA 脚本不保存第一封邮件
VBA script not saving first mail
首先我会说我不是编码专家,但我有基本的了解。
我有一个脚本可以将所有未读邮件保存为 txt 并将它们标记为已读。
它工作正常,但是当我每次从特定人收到邮件时将它设置为 运行 的规则时,它不会影响第一封邮件。
示例:我收到一封邮件,脚本 运行s 但不保存任何内容(只要没有来自同一个人的其他邮件并且不是未读邮件)。
然后我从同一个人那里收到第二封邮件,脚本将 运行 并保存上一封邮件,但不保存最新邮件。
这里是代码示例:
Public Sub TestEnvMacro()
Set objOutlook = CreateObject("Outlook.Application")
Set objNamespace = objOutlook.GetNamespace("MAPI")
Set objMailbox = objNamespace.Folders("your email goes here")
Set objFolder = objMailbox.Folders("Inbox")
Set colItems = objFolder.Items
Dim NewMsg
Dim dtDate As Date
Dim sName As String
Const OLTXT = 0
Pause (5)
For Each objMessage In colItems.Restrict("[Unread] = True")
If objMessage.UnRead = True Then
Pause (5)
Set NewMsg = objMessage
sName = NewMsg
dtDate = NewMsg.ReceivedTime
sName = Format(dtDate, "yyyymmdd", vbUseSystemDayOfWeek, _
vbUseSystem) & Format(dtDate, "-hhnnss", _
vbUseSystemDayOfWeek, vbUseSystem) & "-" & sName & ".txt"
NewMsg.SaveAs "G:\" & sName, OLTXT
NewMsg.UnRead = False
End If
Next
End Sub
我没有包括暂停子,因为它的作用很容易解释,而且我在让脚本显示在 "Rules" 中时遇到了问题,所以我添加了这个子:
Public Sub SaveAsTextMod(msg As MailItem)
Dim strID As String
Dim olNS As NameSpace
Dim olMail As MailItem
strID = msg.EntryID
Set olNS = Application.GetNamespace("MAPI")
Set olMail = olNS.GetItemFromID(strID)
Call TestEnvMacro
Set olMail = Nothing
Set olNS = Nothing
End Sub
当您创建规则以应用传入电子邮件时,邮件项目将作为参数传递给宏子。无需在 Outlook 中搜索未读邮件。您只需要定义一个带有 MailItem 参数的函数,就可以对该对象执行所需的操作。
Public Sub SaveAsTextMod(msg As MailItem)
Dim dtDate As Date
Dim sName As String
dtDate = msg.ReceivedTime
sName = Format(dtDate, "yyyymmdd", vbUseSystemDayOfWeek, _
vbUseSystem) & Format(dtDate, "-hhnnss", _
vbUseSystemDayOfWeek, vbUseSystem) & "-" & msg.Subject & ".txt"
msg.SaveAs "G:\" & sName, OLTXT
msg.UnRead = False
End Sub
您可能会发现 Getting Started with VBA in Outlook 2010 文章很有帮助。
首先我会说我不是编码专家,但我有基本的了解。 我有一个脚本可以将所有未读邮件保存为 txt 并将它们标记为已读。 它工作正常,但是当我每次从特定人收到邮件时将它设置为 运行 的规则时,它不会影响第一封邮件。 示例:我收到一封邮件,脚本 运行s 但不保存任何内容(只要没有来自同一个人的其他邮件并且不是未读邮件)。 然后我从同一个人那里收到第二封邮件,脚本将 运行 并保存上一封邮件,但不保存最新邮件。
这里是代码示例:
Public Sub TestEnvMacro()
Set objOutlook = CreateObject("Outlook.Application")
Set objNamespace = objOutlook.GetNamespace("MAPI")
Set objMailbox = objNamespace.Folders("your email goes here")
Set objFolder = objMailbox.Folders("Inbox")
Set colItems = objFolder.Items
Dim NewMsg
Dim dtDate As Date
Dim sName As String
Const OLTXT = 0
Pause (5)
For Each objMessage In colItems.Restrict("[Unread] = True")
If objMessage.UnRead = True Then
Pause (5)
Set NewMsg = objMessage
sName = NewMsg
dtDate = NewMsg.ReceivedTime
sName = Format(dtDate, "yyyymmdd", vbUseSystemDayOfWeek, _
vbUseSystem) & Format(dtDate, "-hhnnss", _
vbUseSystemDayOfWeek, vbUseSystem) & "-" & sName & ".txt"
NewMsg.SaveAs "G:\" & sName, OLTXT
NewMsg.UnRead = False
End If
Next
End Sub
我没有包括暂停子,因为它的作用很容易解释,而且我在让脚本显示在 "Rules" 中时遇到了问题,所以我添加了这个子:
Public Sub SaveAsTextMod(msg As MailItem)
Dim strID As String
Dim olNS As NameSpace
Dim olMail As MailItem
strID = msg.EntryID
Set olNS = Application.GetNamespace("MAPI")
Set olMail = olNS.GetItemFromID(strID)
Call TestEnvMacro
Set olMail = Nothing
Set olNS = Nothing
End Sub
当您创建规则以应用传入电子邮件时,邮件项目将作为参数传递给宏子。无需在 Outlook 中搜索未读邮件。您只需要定义一个带有 MailItem 参数的函数,就可以对该对象执行所需的操作。
Public Sub SaveAsTextMod(msg As MailItem)
Dim dtDate As Date
Dim sName As String
dtDate = msg.ReceivedTime
sName = Format(dtDate, "yyyymmdd", vbUseSystemDayOfWeek, _
vbUseSystem) & Format(dtDate, "-hhnnss", _
vbUseSystemDayOfWeek, vbUseSystem) & "-" & msg.Subject & ".txt"
msg.SaveAs "G:\" & sName, OLTXT
msg.UnRead = False
End Sub
您可能会发现 Getting Started with VBA in Outlook 2010 文章很有帮助。