Отправка электронной почты Outlook 2013 в качестве фонового процесса - PullRequest
0 голосов
/ 11 октября 2018

Я написал небольшой макрос для отправки электронной почты каждую пятницу примерно 20 людям из разных отделов в офисе.Я сделал так, чтобы у меня была электронная таблица с именем и адресом электронной почты, а затем циклически просматривая ее, изменяя соответствующую информацию.Я хочу, чтобы электронное письмо отправлялось каждому человеку, поэтому нет, другие получатели не должны быть CC или BCC'd.

Это работает.Однако, чтобы избежать проблем, я поставил паузу, чтобы каждое электронное письмо отправлялось каждые 6 секунд, по 10 блоков с паузой около 10 секунд между блоками.Я полагаю, что пауза создает задержку, и, хотя задание завершено, я не могу использовать Outlook (для проверки других сообщений электронной почты или задач).

Есть ли способ заставить Outlook отправлять каждое письмо в некотором роде "Тихий режим "?

Здесь код:

Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)

Sub PrepareEmail()
.
.'A bunch of variable and simple data manipulation is done here.
.
For emailLooper = 0 To BrokerForm.LstBoxBrokers.ListCount - 1
Set oMail = CreateObject("CDO.Message")
Set iConf = CreateObject("CDO.Configuration")

iConf.Load -1    ' CDO Source Defaults
Set Flds = iConf.Fields
With Flds
    .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
    .Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
    .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mySMTPserver"
    .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
    .Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "username"
    .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "password"
    .Update
End With

With oMail

Set .Configuration = iConf
.Subject = asunto
.HTMLBody = emailText & signatureEmail

    destName = BrokerForm.LstBoxBrokers.List(emailLooper, 0)
    emailAddress = BrokerForm.LstBoxBrokers.List(emailLooper, 1)

    .HTMLBody = Replace(.HTMLBody, "#name#", destName)
    .To = emailAddress
    .From = senderEmail
    .Send

    emailsSent = emailsSent + 1

    Sleep (6000)

    If emailLooper / 10 = Fix(emailLooper / 10) Then

        Sleep (11000)

    End If

End With


Set oMail = Nothing
Set iConf = Nothing
Set Flds = Nothing

Next emailLooper

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Как упоминалось в K.D., вы можете использовать Loop вместо Sleep ().

Outlook будет блокировать вас, пока не закончится период сна, если вы используете Sleep().Вы можете использовать CTRL+BREAK для прерывания макроса, но Outlook не будет принимать ввод с клавиатуры или мыши.

Для получения дополнительной информации вы можете обратиться по этой ссылке:

Приостановка или задержка VBA с использованием режима ожидания, сна или цикла

0 голосов
/ 11 октября 2018

Вместо использования функции API Sleep() вы можете попробовать создать таймер цикла с помощью функции DoEvents.

Попробуйте посмотреть, поможет ли это:

Dim startTimer as single, sleepTime as single
sleepTime = 6

With oMail

Set .Configuration = iConf
.Subject = asunto
.HTMLBody = emailText & signatureEmail

    destName = BrokerForm.LstBoxBrokers.List(emailLooper, 0)
    emailAddress = BrokerForm.LstBoxBrokers.List(emailLooper, 1)

    .HTMLBody = Replace(.HTMLBody, "#name#", destName)
    .To = emailAddress
    .From = senderEmail
    .Send

    emailsSent = emailsSent + 1

    startTimer = Timer
    Do While Timer < startTimer + sleepTime
        DoEvents
    Loop

    If emailLooper / 10 = Fix(emailLooper / 10) Then

        startTimer = Timer
        Do While Timer < startTimer + sleepTime
            DoEvents
        Loop

    End If

End With
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...