Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba Outlook尚未打开时发送邮件_Vba_Outlook - Fatal编程技术网

Vba Outlook尚未打开时发送邮件

Vba Outlook尚未打开时发送邮件,vba,outlook,Vba,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

我的处境:

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
我正在尝试在Outlook未打开时发送电子邮件。如果Outlook正在运行,此代码将正常工作。如果关闭Outlook,代码将创建一个不可见的进程,您可以看到该进程正在任务管理器中运行

代码在
.Send
过程中遇到错误。它返回运行时错误287

根据我的经验,某些VBA方法只有在对象可见或处于活动状态时才有效

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

调用
.Send
后,它会立即终止Outlook进程。(请给我指出正确的方向,为什么。)然后电子邮件就卡在发件箱里了

我必须调用另一个
CreateObject(“Outlook.Application”)
并在发件箱
中循环,而发件箱.Items.Count>0

循环通过
SyncObjects
并手动调用
.Start
在发件箱上运行发送/接收

我的问题:

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
有没有一种方法可以直接使用
.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

Outlook关闭时.send问题的解决方法可能是更改发送/接收设置。进入文件->选项->高级->查找
发送/接收…
,然后按它。在“设置组“所有帐户”下,有一个复选框,用于在退出时执行自动发送/接收。。选中此复选框,可能会解决“您遇到的发件箱问题”

以下是一个屏幕截图:


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

使用
名称空间。发送和接收
。请记住,发送/接收是异步的,您需要等待同步完成。您可以使用
名称空间。SyncObjects
集合,使用
SyncObject.start
启动同步,然后等待
SyncObject.SyncEnd
事件

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

更新

您可能还希望确保在创建和发送邮件之前登录到MAPI配置文件

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

Hi@Busse谢谢,但如果我使用
.Display
组合,它只会卡住。我想要一个简单的
.Send
。如果我只使用
.Send
,我会遇到运行时错误287Ah,对不起。您如何调用此脚本?Outlook已关闭,您调用此脚本,它会创建一个新邮件项目,并尝试发送。S因为它正在打开它应该发送的进程。我在某个地方读到,这可能是一个计时问题,表明它试图发送得太快,所以他们在发送前增加了1秒的延迟。我在Excel中使用VBA,但我的程序实际上是用Python编写的。我在使用公开COM对象的
pywin32
库。因此,这就像在Excel中运行VBA代码一样Python。我刚刚在VBA中创建了一个重复的代码,以确保它不是Python的问题。我尝试使用F8来运行代码,并在执行
.Send
行之前暂停了很长时间,但它仍然不起作用。我想问题是,当Outlook不可见时,我无法使用
。Send
。类似于Exce中的
。粘贴
l、 如果目标字段未激活,则无法使用。请尝试将“While Outbox.Items.Count>0”循环放在代码的“End With”后面“Line您知道为什么在没有资源管理器对象的情况下,
.Send
不想工作吗?因为Outlook在有机会执行发送/接收之前就退出了。我不认为这是原因。当尝试执行.Send时,我仍然可以在资源监视器中看到Outlook.exe running它何时退出?它接收电子邮件吗?当新邮件处于隐藏状态时,您看到新邮件通知了吗?严格按照我原始问题中的代码操作。Outlook未打开时。当尝试执行.Send时,它将引发运行时错误287。所以它不会退出。是的,即使在隐藏状态下,我也会收到通知。如果我将代码保留在.Body行,它将接收邮件和通知。