作为后台进程发送电子邮件 Outlook 2013

Posted

技术标签:

【中文标题】作为后台进程发送电子邮件 Outlook 2013【英文标题】:Send email Outlook 2013 as a background process 【发布时间】:2018-10-10 22:05:35 【问题描述】:

我写了一个小宏,每周五向办公室不同部门的大约 20 人发送一封电子邮件。 我这样做的方法是创建一个带有名称和与之关联的电子邮件的电子表格,然后循环通过它更改适当的信息。我希望电子邮件发送给每个人,所以不,其他收件人不应该是抄送或密件抄送。

它有效。但是,为了避免出现问题,我暂停了每封电子邮件每 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

【问题讨论】:

【参考方案1】:

您可以尝试使用DoEvents 函数创建循环计时器,而不是使用Sleep() API 函数。

试试看是否有帮助:

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

【讨论】:

【参考方案2】:

正如 K.Dᴀᴠɪs 提到的,您可以使用 Loop 而不是使用 Sleep()。

如果您使用Sleep(),Outlook 将锁定您直到睡眠期结束。您可以使用CTRL+BREAK 中断宏,但 Outlook 不会接受来自键盘或鼠标的输入。

更多信息,你可以参考这个链接:

Pausing or Delaying VBA Using Wait, Sleep or A Loop

【讨论】:

以上是关于作为后台进程发送电子邮件 Outlook 2013的主要内容,如果未能解决你的问题,请参考以下文章

使用 Outlook 2010 和 2013 C# 从 winform 实现发送邮件

如何在 Outlook 2013 中更改默认发送为电子邮件(不同别名)?

无法在使用 python smtplib/email 发送的 Outlook 2013 电子邮件中显示嵌入图像

通过outlook发送R Markdown输出作为正文电子邮件(RDCOMclient)

在 Send 方法失​​败的情况下使用 Outlook 发送邮件

将我的 HTML 放入电子邮件 [关闭]