关闭时,Windows身份验证的Outlook客户端的邮件项目发送方法失败

时间:2014-08-25 03:22:17

标签: vba email outlook ms-office outlook-vba

我目前在通过excel vba自动发送电子邮件时遇到问题? 我有一个简单的例子:

Sub sendOutlookEmail()

Dim oApp As Outlook.Application
Dim oMail As MailItem
Set oApp = CreateObject("Outlook.application")

Set oMail = oApp.CreateItem(olMailItem)
oMail.Body = "Body of the email"
oMail.Subject = "Test Subject"
oMail.To = "someone@somewhere.com"

oMail.Send

Set oMail = Nothing
Set oApp = Nothing

End Sub

当Outlook客户端打开时,这可以正常工作。当outlook关闭时,我收到以下错误:

  

错误287:应用程序定义或对象定义的错误

现在,如果我在oMail.Send命令上面添加一行无关紧要的代码:

Debug.Print oApp.Session.Accounts.Item(1).DisplayName

现在,无论Outlook打开还是关闭,代码都能正常运行。

我知道当Outlook关闭并使用LDAP时,需要Windows身份验证才能通过OLE自动发送电子邮件,但由于额外的代码是不变的子例程。我相信这是关于Outlook.application.Session.Account默认对象初始化的某种错误。

你能帮忙解决这个问题吗?这是一个LDAP问题还是一个Outlook.Application类问题,这是一个来自VB应用程序的复制错误,我无权访问源代码,但行为方式和报告方式相同同样的错误。

谢谢

2 个答案:

答案 0 :(得分:3)

此处说明了此行为的原因:

http://msdn.microsoft.com/en-us/library/office/ff861594%28v=office.15%29.aspx

代码示例 -

' Start Outlook.
Dim olApp As Outlook.Application
Set olApp = CreateObject("Outlook.Application")

' Get a session object. 
Dim olNs As Outlook.NameSpace
Set olNs = olApp.GetNamespace("MAPI")

' Create an instance of the Inbox folder. 
' If Outlook is not already running, this has the side
' effect of initializing MAPI.
Dim mailFolder As Outlook.Folder
Set mailFolder = olNs.GetDefaultFolder(olFolderInbox)

' Continue to use the object model to automate Outlook.

“从Outlook 2010开始,如果您有多个配置文件,您已将Outlook配置为始终使用默认配置文件,并且使用登录方法登录默认配置文件而不提示用户,则用户将收到提示无论如何都要选择配置文件。要避免此行为,请不要使用Logon方法;请使用前面的InitializeMAPI示例中建议的解决方法。“*

Microsoft称之为“解决方法”的方法是简单地向Namespace对象发出声明。这初始化MAPI。看来,当通过OLE接口远程通信时,Outlook应用程序对象可能不可见,并且可能不会显示选择配置文件的提示,从而显示没有任何事情发生。

感谢Mark帮我确定问题。

Tom Feuerstake

答案 1 :(得分:0)

尝试添加对Namespace.Logon的调用:

Set oApp = CreateObject("Outlook.application")
set oNS = oApp.GetNamespace("MAPI")
oNS.Logon