Outlook尚未打开时发送邮件

时间:2017-07-06 12:58:43

标签: vba outlook-vba

我的情况:

我正在尝试在Outlook未打开时发送电子邮件。如果Outlook正在运行,此代码将起作用。如果Outlook已关闭,则代码将创建一个不可见的进程,您可以在任务管理器中看到该进程。

代码在.Send期间遇到错误。它返回运行时错误287.

根据我的经验,某些VBA方法仅在对象可见或活动时才有效。

我的工作是在致电.Display(False)之前使用.Send

调用.Send后,它会立即终止Outlook进程。 (请指出正确的方向。)然后电子邮件卡在发件箱中。

我必须通过调用另一个CreateObject("Outlook.Application")并循环通过发件箱While Outbox.Items.Count > 0

来应用其他工作

循环SyncObjects并手动呼叫.Start以在发件箱上运行发送/接收。

我的问题:

有没有办法直接使用.Send方法而不是使用解决方法,同时也无需打开Outlook。

我的代码:

Sub emailer()

Dim OutApp As Object
Dim OutMail As Object

Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)

With OutMail
    .to = "f@r.com"
    .CC = ""
    .BCC = ""
    .Subject = "This is the Subject line"
    .Body = "Hi there"
    .Send   'or use .Display
End With

Set OutMail = Nothing
Set OutApp = Nothing

End Sub

2 个答案:

答案 0 :(得分:2)

可以通过更改发送/接收的设置来解决Outlook关闭的.send问题的解决方法。转到文件 - >选项 - >高级 - >找到Send/Receive...并按下它。在“为群组设置”下,“所有帐户”是Perform an automatic send/receive when exiting的复选框。请选中此选项,它可以解决“卡在您遇到的发件箱问题”。

以下是截图:

尝试一下,希望它有所帮助。

答案 1 :(得分:0)

使用Namespace.SendAndReceive。请记住,发送/接收是异步的,您需要完成同步。您可以使用Namespace.SyncObjects集合,使用SyncObject.Start开始同步,然后等待SyncObject.SyncEnd事件。

要阻止Outlook关闭,您需要保持对Outlook资源管理器或Inspector对象的实时引用。您可以使用Namespace.GetDefaultFolder检索收件箱文件夹,然后使用MAPIFolder.GetExplorer方法获取指向Explorer对象的指针。

<强>更新

您可能还希望确保在创建和发送邮件之前登录到MAPI配置文件。在CreateObject行之后,尝试添加以下

set NS = OutApp.GetNamespace("MAPI") 
NS.Logon