发送电子邮件后退出Outlook对象

时间:2015-06-26 17:11:47

标签: vbscript outlook.application

这是我到目前为止的代码:

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
  5. 我被困的地方:

    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")
      

      在调用ObjShell.Quit函数后,为什么我不能SendEmail()执行此操作?使用.Quit会给我一个错误。

    2. 我只想在发送电子邮件后关闭Outlook应用程序,我无法弄清楚如何。

3 个答案:

答案 0 :(得分:1)

MailItem具有Sent属性,用于指示邮件何时发送。试试这个:

...
objMail.Send

Do Until objMail.Sent
    WScript.Sleep 500
Loop

' Safe to close...
ObjOutlook.Quit

答案 1 :(得分:0)

试试这个:

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")

答案 2 :(得分:0)

首先,如果 用户 打开Outlook会怎么样?我认为任何用户都不会感谢您关闭Outlook的代码。在关闭Outlook之前,您可能希望检查Application.Explorers.CountApplication.Inspectors.Count都为零。如果没有打开的资源管理器或检查程序,即使您持有对Outlook对象的引用,也会自动存在最新版本的Outlook - 这样做是为了防止泄露引用的老年人行为不端的应用程序。为防止Outlook关闭,请对Explorer对象t进行引用(即使您没有显示它) - 调用Namespace.getDefaultFolder(olFolderInbox),然后保存对MAPIFolder.GetExplorer返回的对象的引用。

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