2015-06-26 4 views
1

Вот код, который я до сих пор:Закройте объект Outlook, после электронной почты отправляется

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 = "[email protected]"  
    'objMail.cc = "[email protected]" 
    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") 
    

    Почему я не могу просто сделайте ObjShell.Quit после того, как я позвоню SendEmail() Функция? Использование .Quit дает мне ошибку.

  2. Я просто хочу закрыть приложение Outlook после отправки сообщения электронной почты, и я не могу понять, как это сделать.

+1

Нужно ли использовать Outlook? Большинство VBScripters используют библиотеку CDO для отправки электронной почты. См. [This] (http://stackoverflow.com/questions/7041938/vbscript-to-send-email-without-running-outlook). – Bond

ответ

1

MailItem имеет Sent свойство, которое указывает, когда сообщение было отправлено. Попробуйте это:

... 
objMail.Send 

Do Until objMail.Sent 
    WScript.Sleep 500 
Loop 

' Safe to close... 
ObjOutlook.Quit 
+0

Это никогда не сработает. Сообщение отправляется после его отправки и перемещения в папку «Отправленные». Это будет другое сообщение от того, которое вы отправили. Более того, прикосновение к сообщению каким-либо образом после вызова Отправить отменяет процесс отправки. –

+0

@DmitryStreblechenko Действительно?Вы не можете проверить свойства «MailItem», пока они находятся в процессе отправки? Кажется странным. Угадайте, что исключает мою следующую идею ... проверяя, является ли родительская папка 'MailItem' папкой« Отправлено ». – Bond

+1

Да, после вызова Отправить разрешена только разрешенная операция на объекте MialItem - сообщение теперь принадлежит диспетчеру очереди. –

0

Попробуйте это:

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

    Set mailobj = outobj.CreateItem(0) 

    With mailobj 
     .To = "[email protected]" 
     .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") 
+0

Спасибо всем! @Bk, я пробовал ваш код, и он отлично работал! Можете ли вы рассказать мне, что делает последний кусок кода? – Edrei

+0

@ Edrei Конечно. Строка «SendMail()» вызывает подпрограмму «Sub Sendmail()» (вторая строка). После обработки кода между «Sub Sendmail()» и «End Sub» (сверху вниз) он возвращается обратно во вторую строку «SendMail()». Следующая строка создает сообщение с текстом «Готово». –

0

Во-первых, то, что если бы это было пользователя, который открыл внешний вид? Я не думаю, что любой пользователь оценит ваш код, закрывающий Outlook. Вы можете проверить, что оба Application.Explorers.Count и Application.Inspectors.Count равны нулю перед закрытием Outlook. Новая версия Outlook будет автоматически существовать, если нет открытых исследователей или инспекторов, даже если вы держите ссылку на объект Outlook - это было сделано для защиты вредоносных приложений, которые не соответствуют действительности, которые содержат утечку ссылок. Чтобы предотвратить закрытие Outlook, hodl ссылку на объект Explorer t (даже если вы его не видите) - вызовите Namespace.getDefaultFolder (olFolderInbox), затем держите ссылку на объект, возвращенный MAPIFolder.GetExplorer.

Во-вторых, после вызова Send, используйте пространство имен, коллекцию SyncObjects, чтобы извлечь самый первый SyncObject. Подключите событие SyncObject.SyncEnd и вызовите SyncObject.Start. Когда произойдет событие SyncEnd, все будет сделано. Но я не думаю, что вы можете работать с событиями в сценарии VB ...