1

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

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. 打开展望
  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")
    

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

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

4

3 回答 3

1

MailItem具有Sent指示消息何时发送的属性。尝试这个:

...
objMail.Send

Do Until objMail.Sent
    WScript.Sleep 500
Loop

' Safe to close...
ObjOutlook.Quit
于 2015-06-26T17:22:49.477 回答
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")
于 2015-06-26T17:27:58.207 回答
0

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

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

于 2015-06-26T17:43:05.007 回答