作为后台进程发送电子邮件 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)