编辑:我只是要使用一个事件监听器。我会删除这篇文章,但也许有人会找到一种非eventlistener的方式来保存已发送的邮件,然后再将其发送到已发送的邮件收件箱中。
问题:Outlook在宏完成之前不会接收VBA发送的电子邮件。如果我使用wait, sleep, while循环或其他方法,电子邮件将不会收到。我不能使用Sent Items事件监听器,因为我只想将特定的电子邮件保存到文件夹中,而不是全部。我个人知道如何从发送的项目中保存,我知道如何发送消息。问题是用VBA发送电子邮件和它出现在我的发送项目框之间的延迟。如果我在等待之前保存,保存的电子邮件是之前的电子邮件,但如果你尝试等待,发送的项目文件夹永远不会更新。任何想法或简单的解决方案。我可能只是笨。
我读了每个论坛,但还没有找到解决方案,我在另一家公司运行,但不再记得如何。我使用宏来发送非常具体的电子邮件和执行许多其他任务。然后,我想抓住我刚刚发送的电子邮件,并将其保存到使用vba的文件夹。问题是接收我的"已发送项目"中的邮件。文件夹被延迟。如果我尝试捕获它或等待接收它,我的代码永远不会完成。我在论坛上看到的所有解决方案都是一个发送项目侦听器/收件箱事件侦听器,但我不需要,我知道哪些电子邮件可以触发它。
无论如何,您需要等待一些事件触发,可能是Sent Items文件夹上的Items.ItemAdd
,或者SyncObject
上的SyncObject.SyncEnd
-消息提交是异步的,因此没有多少sleep
或while循环可以帮助您。你不能只是停止你的VBA脚本,并在消息实际发送时恢复它,因为你的代码是在主Outlook线程上运行的-如果你的脚本暂停,Outlook也是如此。
您可以尝试使用命名空间。SendAndReceive方法,它启动当前会话中提交的所有未传递的消息的立即传递,并立即接收当前配置文件中所有帐户的邮件。注意,调用SendAndReceive
方法是异步的。SendAndReceive
提供了与Send/Receive All
命令等效的编程命令,当您单击Tools
然后单击Send/Receive
时可用。
如果不需要同步所有对象,可以使用SyncObjects集合对象来选择特定的对象。有关详细信息,请参见NameSpace.SyncObjects
。
在你的VBA代码中,你也可以考虑使用DoEvents函数,它产生执行,以便操作系统可以处理其他事件。DoEvents
将控制传递给操作系统。当操作系统处理完队列中的事件,并且SendKeys
队列中的所有键都被发送(如果有的话)后,返回控制权。
DoEvents
对于一些简单的事情非常有用,比如允许用户在进程启动后取消进程,例如搜索文件。
解决方案,不是过去使用的解决方案,而是我解决的。
- 基本上只是所有论坛中每个人建议的事件侦听器解决方案。我在我的Sent Items中创建了一个单独的文件夹,并使用myNameSpace。为VBA发送的项目设置该文件夹。我只把电子邮件发送到那个文件夹,我只把监听器添加到那个文件夹。这允许我分开发送的项目和这个特定的VBA发送的电子邮件,然后自动保存它们。我仍然在寻找一种方法来保存发送的邮件项目之前,发送的项目收件箱显示它,但我已经放弃了这一点。谢谢大家的帮助。如果我找到更好的答案,我会尝试将其与代码一起发布。