0

У меня есть макросы и планировщик задач, которые должны: Запустить Excel в указанное время, обновить некоторые таблицы, создать PDF-документы из этих таблиц, а затем отправить эти документы в PDF выберите отдельных лиц.Электронная почта, отправленная через VBA с помощью Task Scheduler, застревает в Outbox

Все работает до создания PDF-документа и электронной почты. Однако иногда это письмо застревает в папке исходящих сообщений и не отправляется, пока я не открою Outlook.

Кто-нибудь знает причину для этой проблемы?

Вот код для отправки электронной почты:

Option Explicit 

Public strFileName As String 

Sub EmailPDFAsAttachment() 
'This macro grabs the file path and stores as a concatenation/variable. Then it emails the file to whomever you specify. 
' Works in Excel 2000, Excel 2002, Excel 2003, Excel 2007, Excel 2010, Outlook 2000, Outlook 2002, Outlook 2003, Outlook 2007, Outlook 2010. 
' This example sends the last saved version of the Activeworkbook object . 

    Dim OutApp As Object 
    Dim OutMail As Object 
    Dim FilePath As String 

    'This part is setting the strings and objects to be files to grab with their associated filepath. (e.g. FilePath is setting itself equal to the text where we plan to set up each report) 

    FilePath = "\\"ServerNameHere"\UserFolders\_AutoRep\DA\PDFs\SealantsVS1SurfaceRestore\" _ 
    & strFileName & ".pdf" 

    With Application 
     .EnableEvents = True 
     .ScreenUpdating = True 
    ' End With 

    'Below is where it creats the actual email and opens up outlook. 
    Set OutApp = CreateObject("Outlook.Application") 
    Set OutMail = OutApp.CreateItem(0) 

    On Error Resume Next 
    ' ******Make sure to set the .To to only recipients that are required to view it. Separate email addresses with a semicolon (;). 
    ' Current distribution list: 
    ' 

    With OutMail 
     .To = "[email protected]" 
     .CC = "" 
     .BCC = "" 
     .Subject = strFileName 

     .HTMLBody = "Hello all!" & "<br>" & _ 
     "Here is this month's report for the Sealants vs Surface Restore. It goes as granular as to by show results by provider." & "<br>" & _ 
     "Let me know what you think or any comments or questions you have!" & "<br>" & _ 
     vbNewLine & .HTMLBody 
     'Here it attached the file, saves the email as a draft, and then sends the file if everything checks out. 
     .Attachments.Add FilePath 
     .Send 

    End With 
    On Error GoTo 0 

    ' With Application 
    ' .EnableEvents = True 
    ' .ScreenUpdating = True 
    End With 
'This closes out the Outlook application. 
    Set OutMail = Nothing 
    Set OutApp = Nothing 

End Sub 

'After this completes, the Private sub jumps back to the macros in this workbook and quits MS Excel with the CloseWorkbook Application. 

Я также мои настройки, указанных на рисунке ниже для моих инструментов справочной библиотеки в настройках VBA Outlook, ниже:

Tools Reference Library settings

И мои целевые настройки:

E-Mail Security Settings

Параметры макросов:

«Включить все макросы» выбраны

«Применить параметры безопасности макросов в установленные надстройки» выбраны

Любых идеи, чтобы подтолкнуть их через область сходящей вместо того, чтобы застрять? Идея состоит в том, чтобы эта программа запускалась ранним утром и имела эти электронные письма во входящих почтовых ящиках отдельных лиц к моменту их поступления на работу.

+0

'не отправляет, пока я не открою Outlook' делает [это] (http://stackoverflow.com/questions/28936757/excel-vba-to-detect-if-outlook-is-open-if-its- not-then-open-it) help? – findwindow

+0

Не уверен, что вы имеете в виду ..... но идея состоит в том, чтобы отправить его, не открывая Outlook. У меня есть планировщик задач, открывающий файл Excel, файл запускается для запуска, он создает файл PDF, создает электронную почту, но электронная почта попадает в папку исходящих сообщений, пока я не открою excel, а затем Outlook отправит что-нибудь в папке «Исходящие» I хотите, чтобы он отправил файл без моего личного открытия Outlook или без открытия Outlook с помощью планировщика заданий. –

+0

'им отправлять, не открывая Outlook', это похоже на желание водить машину, не запустив ее? – findwindow

ответ

0

Outlook, как и любое другое приложение Office, не может работать в службе (например, Планировщик). При этом вам необходимо заставить Outlook выполнить SebdRecieve и дождаться его завершения. Позвоните по телефону Namespace.SendAndReceiive или заберите первый объект SyncObject из коллекции Namespace.SyncObjects, позвоните по телефону SyncObject.Start и дождитесь события SyncObject.SyncEnd.

+0

Как это работает в Excel VBA или это нужно написать в Outlook VBA, и если да, то как? Я не совсем уверен, как это написать. Кроме того, не уверен, что это имеет значение, но я использую учетную запись электронной почты IMAP (а не MAPI). –

+1

Вы можете сделать это в Excel VBA, вам просто нужно убедиться, что переменные приложения Outlook и SyncObject объявлены в глобальной области, чтобы они не выходили за рамки и не были выпущены. –

+0

Итак, я нашел этот код, который подталкивает Outlook оставаться открытым или снова открывать, что, в свою очередь, позволяет все, что находится в папке «Исходящие»: http://www.rondebruin.nl/win/s1/outlook/openclose.htm Однако сейчас У меня возникает следующая проблема: задача выполняется отлично, когда я открываю ее вручную (при включенном макросы), но через планировщик задач код останавливается. Кто-нибудь знает о решении? –