【问题标题】:Quit Outlook object AFTER email is sent发送电子邮件后退出 Outlook 对象
【发布时间】:2015-08-25 03:37:12
【问题描述】:

这是我目前的代码:

Option Explicit

Call OpenOutlook()

Function OpenOutlook()
    Dim ObjShell

    Set ObjShell = CreateObject("WScript.Shell")
    ObjShell.Run("Outlook.exe")

    Call SendEmail()

    'I tried closing from here but this didn't work either
    'ObjShell.Quit
End Function

Function SendEmail()
    'Declaring variables used through out this function
    Dim ObjOutlook
    Dim objMail

    Set ObjOutlook = CreateObject("Outlook.Application")
    'CreateItem(0) opens a New Email window...MailItem
    set objMail = ObjOutlook.CreateItem(0)
    objMail.Display 

    'MailItem Options
    objMail.to = "test@mail.com.com"    
    'objMail.cc = "test2@mail.com"
    objMail.Subject = "Did it work!?"
    objMail.Body = "If you got this email, my VBs test worked!"
    'objMail.Attachments.Add("C:\Attachment\abc.jpg")
    objMail.Send

    'This didn't work either
    'If objMail.Sent = True Then 
    'ObjOutlook.Quit
    'End If

    'Quit closes Outlook like I want but it doesn't wait for the email to send 
    'ObjOutlook.Quit
End Function

我正在尝试使用 VBScript 自动化:

  1. 打开 Outlook
  2. 发送电子邮件
  3. 等待电子邮件发送(发件箱完成发送)
  4. 发送电子邮件后关闭 Outlook

我被困在哪里:

  1. 首先,我在打开 Outlook 时遇到了问题。下面是我用来创建 Outlook 对象的代码:

    Set ObjOutlook = CreateObject("Outlook.Application")
    'CreateItem(0) opens a New Email window...MailItem
    set objMail = ObjOutlook.CreateItem(0)
    objMail.Display 
    

    我做了什么(甚至不确定这是否是正确的做法):

    Set ObjShell = CreateObject("WScript.Shell")
    ObjShell.Run("Outlook.exe")
    

    为什么我不能在调用SendEmail() 函数后只做ObjShell.Quit?使用 .Quit 给我一个错误。

  2. 我只想在电子邮件发送后关闭 Outlook 应用程序,但不知道如何操作。

【问题讨论】:

  • 您需要使用 Outlook 吗?大多数 VBScripter 使用 CDO 库来发送电子邮件。见this

标签: vbscript outlook.application


【解决方案1】:

MailItem 有一个Sent 属性,用于指示消息的发送时间。试试这个:

...
objMail.Send

Do Until objMail.Sent
    WScript.Sleep 500
Loop

' Safe to close...
ObjOutlook.Quit

【讨论】:

  • 这永远行不通。消息在发送并移动到“已发送邮件”文件夹后即被发送。这将是与您发送的消息不同的消息。不仅如此,在调用 Send 后以任何方式触摸消息都会中止提交过程。
  • @DmitryStreblechenko 真的吗? MailItem 在发送过程中无法查看其属性?似乎很奇怪。猜猜这排除了我的下一个想法......检查MailItem的父文件夹是否是“已发送”文件夹。
  • 是的,在调用 Send 之后,对 MialItem 对象唯一允许的操作是释放它 - 消息现在属于 spooler。
【解决方案2】:

试试这个:

Option Explicit
Sub SendMail()
  Dim outobj, mailobj
  Set outobj = CreateObject("Outlook.Application")

  Set mailobj = outobj.CreateItem(0)

    With mailobj
        .To = "user@test.com"
        .Subject = "Testmail"
        .Body = "If you got this email, my VBs test worked!"
        .Send
    End With

    'Clear the memory
    Set outobj = Nothing
    Set mailobj = Nothing
End Sub
SendMail()
Msgbox("Done")

【讨论】:

  • 谢谢大家! @Bk,我尝试了您的代码,它运行良好!你能告诉我你的最后一段代码在做什么吗?
  • @Edrei 当然。 “SendMail()”行调用子例程“Sub Sendmail()”(第二行)。在“Sub Sendmail()”和“End Sub”(从上到下)之间处理代码后,它会再次返回倒数第二行“SendMail()”。下一行创建一个带有文本“完成”的消息框。
【解决方案3】:

首先,如果打开 Outlook 的是 用户 怎么办?我认为任何用户都不会欣赏您关闭 Outlook 的代码。在关闭 Outlook 之前,您可能需要检查 Application.Explorers.CountApplication.Inspectors.Count 是否都为零。如果没有打开的浏览器或检查器,即使您持有对 Outlook 对象的引用,最新版本的 Outlook 也将自动存在 - 这样做是为了保护泄露引用的年龄歧视行为不端的应用程序。为防止 Outlook 关闭,请保留对 Explorer 对象的引用(即使您不显示它) - 调用 Namespace.getDefaultFolder(olFolderInbox),然后保留对 MAPIFolder.GetExplorer 返回的对象的引用。

其次,调用 Send 后,使用 Namespace,SyncObjects 集合检索第一个 SyncObject。连接 SyncObject.SyncEnd 事件并调用 SyncObject.Start。当 SyncEnd 事件触发时,您将全部完成。但我不认为你可以在 VB 脚本中处理事件......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 2016-01-14
    • 2018-07-24
    • 1970-01-01
    相关资源
    最近更新 更多