【问题标题】:Send mail when Outlook is not already open在 Outlook 尚未打开时发送邮件
【发布时间】:2021-08-23 01:05:40
【问题描述】:

我的情况:

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

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

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

我的解决方法是在调用.Send 之前使用.Display(False)

调用.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

【问题讨论】:

  • 尝试将“While Outbox.Items.Count > 0”循环放入代码中,紧跟在“End With”行之后

标签: vba outlook


【解决方案1】:

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

这是截图:

试试这个,希望对你有帮助。

【讨论】:

  • 嗨@Busse 谢谢,但只有当我使用.Display.Send 组合时它才会卡住。我想要一个简单的.Send。如果我只使用.Send,我会收到运行时错误 287
  • 啊,对不起。你怎么称呼这个脚本? Outlook 已关闭,您调用此脚本,它会创建一个新邮件项目并尝试发送。由于它正在打开它应该发送的进程。我在某处读到这可能是一个计时问题,表明它试图发送太快,所以他们在发送前添加了 1 秒延迟。
  • 我在 Excel 中使用 VBA,但我的程序实际上是在 Python 中。我正在使用公开 COM 对象的pywin32 库。所以这就像在 Python 中运行 VBA 代码一样。我刚刚在 VBA 中创建了一个重复的代码,以确保它不是 Python 的问题。我尝试使用 F8 运行代码并在执行 .Send 行之前暂停了很长时间,但它仍然不起作用。我认为问题是当 Outlook 不可见时我不能使用.Send。类似于 Excel 中的.Paste。如果未激活目标字段,则无法使用它。
【解决方案2】:

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

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

更新

您可能还需要确保在创建和发送消息之前登录到 MAPI 配置文件。在 CreateObject 行之后,尝试添加以下内容

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

【讨论】:

  • 你知道为什么.Send在没有资源管理器对象的情况下不想工作吗?
  • 因为 Outlook 在有机会执行发送/接收之前退出。
  • 我认为这不是原因。尝试执行 .Send 时,我仍然可以在资源监视器中看到 Outlook.exe 正在运行
  • 什么时候退出?它接收电子邮件吗?当它处于隐藏状态时,你会看到新邮件通知吗?
  • 严格遵循我原来问题中的代码。与 Outlook 未打开。尝试执行 .Send 时会引发运行时错误 287。所以它不会退出。是的,即使在隐藏状态下我也会收到通知。如果我将代码留在 .Body 行,它将收到邮件和通知。
猜你喜欢
  • 1970-01-01
  • 2014-08-22
  • 2012-07-29
  • 2017-05-30
  • 2012-07-05
  • 2020-02-05
  • 2016-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多