VBA Outlook SendUsingAccount 不返回任何内容
Posted
技术标签:
【中文标题】VBA Outlook SendUsingAccount 不返回任何内容【英文标题】:VBA Outlook SendUsingAccount returns Nothing 【发布时间】:2021-09-02 12:35:53 【问题描述】:在我们公司,我们使用 Outlook Exchange 桌面版。我们中的一些人有多个帐户来发送/接收电子邮件。我创建了一个 VBA 宏,用于在按下“发送”按钮时检查每封电子邮件从哪个帐户发送邮件,然后创建一个处理程序来检查该邮件是否到达“已发送邮件”文件夹。到达后,它会接收此邮件并将其保存到预定义的文件夹中。
起初我创建了这个宏,只使用默认帐户和默认文件夹来发送邮件。它工作得很好。现在我添加了一些代码来检查它在正确的“已发送项目”文件夹中发送的帐户(正确帐户之一)。因此我使用了MailItem.SendUsingAccount
属性。
应用此宏时,10 次中有 8 次,我得到正确的帐户并且宏工作正常。另外两次,SendUsingAccount
属性返回“Null”或“Nothing”(我不知道这两者之间的区别)。我发现另一个线程here 另一个用户建议将帐户分配给 Mailitems 并不总是可靠的,但它并没有说明我的问题的正确解决方案。为什么有时我什么也得不到作为返回值,而其他时候它工作得很好?当它不起作用时,它总是与代码行有关:ZendAcc = Item.SendUsingAccount
。这里 ZendAcc 变量不能存储空的SendUsingAccount
返回。
VBA:
Public WithEvents myOlItems As Outlook.Items
'Sub triggered when pressing the send button in outlook email
Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
Dim ZendAcc As String
'Checking for multiple accounts
If Application.Session.Accounts.Count > 1 Then
'Check if the itemtype is MailItem. (normally it will always be correct)
If TypeName(Item) <> "MailItem" Then
MsgBox "There is no MailItem"
Exit Sub
Else
'Store AccountName in String
ZendAcc = Item.SendUsingAccount
If ZendAcc = "" Then
Exit Sub
End If
'Create the handler and give it the Accountname String
Call Initialize_handler(ZendAcc)
End If
Else
'When there is only one account, the Accountname doesn't matter, but you need a String
Call Initialize_handler("Useless")
End If
End Sub
Public Sub Initialize_handler(ByVal zendAccount As String)
Dim Store As Store
Dim Folder As Folder
'If there are multiple accounts, check for the right sent mails folder, otherwise use the default one.
If Application.Session.Accounts.Count > 1 Then
For Each oAccount In Application.Session.Accounts
If oAccount.SmtpAddress = zendAccount Then
Set Store = oAccount.DeliveryStore
Set acFolder = Store.GetDefaultFolder(olFolderSentMail)
Exit For
End If
Next
Set myOlItems = acFolder.Items
Else
Set myOlItems = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderSentMail).Items
End If
End Sub
'Catch the added mail and save to folder
Private Sub myOlItems_ItemAdd(ByVal ObjectSent As Object)
'Code to do something with this mail. In my case: store to defined folder.
End Sub
【问题讨论】:
【参考方案1】:如果帐户被显式设置并且没有首先保存消息,您可能会得到 null(在 VB 中也称为 Nothing)。在这种情况下,假设将使用 Application.Session.Accounts
集合中的第一个帐户。
【讨论】:
德米特里,感谢您的评论。发送邮件的帐户是在发送前在邮件顶部手动选择的。我们通常不会在发送之前保存我们的消息。由于所用帐户的“随机性”,假设我们使用标准帐户并没有真正的帮助。我可能会在发送之前尝试保存,这样帐户将不再返回 null。如果有帮助,我会告诉你。 下拉菜单必须显示一些东西,所以它默认显示默认帐户。只有当用户明确设置它时,才能保证在消息上设置它。以上是关于VBA Outlook SendUsingAccount 不返回任何内容的主要内容,如果未能解决你的问题,请参考以下文章
从 MS Access 2016 VBA 启动 Outlook 2016 触发“另一个程序正在使用 Outlook”并死掉