我制作了一个小宏来计算我的收件箱中有多少未读电子邮件。然后我将一些数据发送到串口并控制交通灯。
我的宏有问题,它有一个while循环,并不断检查收件箱。循环中有一个DoEvents,它们都很顺利。除了宏运行时的所有内容;
- 如果我点击未读电子邮件阅读,然后点击另一封电子邮件,之前的电子邮件现在应标记为已读。这不会发生,我必须手动将其标记为已读或双击以打开电子邮件。
- 我无法使用搜索功能,它只会等到我停止运行宏。
- 在我停止宏之前,我无法更改我正在查看的文件夹。
如何在不使用宏的循环的情况下定期计算我有多少未读电子邮件?
我看过创建一个新线程(在outlook中不可能),并且使用定时器(经常崩溃,定时器似乎无法预测)。
'Checks for unread email and sets Trafic Light color
Sub CheckMail()
runner = 1
MailTemp = -1
While (runner)
Const olFolderInbox = 6
Set objOutlook = CreateObject("Outlook.Application")
Set objNamespace = objOutlook.GetNamespace("MAPI")
objNamespace.Logon "Default Outlook Profile", , False, True
Set objFolder = objNamespace.GetDefaultFolder(olFolderInbox)
If MailTemp <> objFolder.UnReadItemCount Then
MailTemp = objFolder.UnReadItemCount
If objFolder.UnReadItemCount = 0 Then
Shell "C:\Users\cave\Desktop\Miles Cave\TrafficLight\USB\Mail_0.bat", vbMinimizedNoFocus
End If
If objFolder.UnReadItemCount = 1 Then
Shell "C:\Users\cave\Desktop\Miles Cave\TrafficLight\USB\Mail_1.bat", vbMinimizedNoFocus
End If
If objFolder.UnReadItemCount > 1 Then
Shell "C:\Users\cave\Desktop\Miles Cave\TrafficLight\USB\Mail_2.bat", vbMinimizedNoFocus
End If
End If
DoEvents
Wend
End Sub
'Sets Trafic Light to off and stops CheckMail
Sub StopMail()
Shell "C:\Users\cave\Desktop\Miles Cave\TrafficLight\USB\Lights off.bat", vbMinimizedNoFocus
runner = 0
End Sub
这是我的代码。在CheckMail()中,有5行代码可以获取未读电子邮件的数量,然后是if,以检查未读电子邮件的数量是否已更改,以及3个选项,根据电子邮件的数量进行操作。
StopMail()只需在CheckMail()中停止While循环。
答案 0 :(得分:0)
您需要使用Items类的Find / FindNext或Restrict方法来查找所有未读项目。例如,Restrict方法将过滤器应用于Items集合,返回一个新集合,其中包含原始中与过滤器匹配的所有项目。那么您可以简单地使用Items类的Count属性。
另请注意Namespace类的AdvancedSearch方法。它允许在另一个线程上运行搜索,并轻松获取多个文件夹中的未读项目数。
使用以下搜索条件= "[UnRead] = true"
。
您可能会发现以下文章有用:
答案 1 :(得分:0)
您可以通过至少两种方式在没有计时器或while循环的情况下触发。
1 - 使用ItemAdd收到邮件
或
2 - 当邮件的未读状态更改为使用ItemChange事件读取时,如此
在ThisOutlookSession
中Private WithEvents checkMailItems As Items
Private Sub Application_Startup()
Dim ns As Namespace
Set ns = Application.GetNamespace("MAPI")
Set checkMailItems = ns.GetDefaultFolder(olFolderInbox).Items
End Sub
Private Sub checkMailItems_ItemChange(ByVal Item As Object)
If TypeOf Item Is mailItem And Item.UnRead = False Then CheckMail
End Sub
在常规模块中
Sub CheckMail()
Dim objNameSpace As Namespace
Dim objFolder As Folder
Dim uIC As Long
Set objNameSpace = Application.GetNamespace("MAPI")
Set objFolder = objNameSpace.GetDefaultFolder(olFolderInbox)
uIC = objFolder.UnReadItemCount
Select Case uIC
Case 0
Debug.Print "Inside CheckMail - uIC = " & uIC
'Shell "C:\Users\cave\Desktop\Miles Cave\TrafficLight\USB\Mail_0.bat", vbMinimizedNoFocus
Case 1
Debug.Print "Inside CheckMail - uIC = " & uIC
'Shell "C:\Users\cave\Desktop\Miles Cave\TrafficLight\USB\Mail_1.bat", vbMinimizedNoFocus
Case Is > 1
Debug.Print "Inside CheckMail - uIC = " & uIC
'Shell "C:\Users\cave\Desktop\Miles Cave\TrafficLight\USB\Mail_2.bat", vbMinimizedNoFocus
End Select
ExitRoutine:
Set objNameSpace = Nothing
Set objFolder = Nothing
Debug.Print "Procedure CheckMail is done."
End Sub