ms-access - Access 2016 通过 VBA 处理重复邮件到 Outlook
问题描述
我有一个 Access 2016 数据库,其中包含保存学生数据的表。我已经成功地使用 VBA-Outlook 向每个收件人发送了一封电子邮件(代码有效),但是,它似乎已经多次将电子邮件发送给相同的收件人(每个收件人随机重复 1 到 4 封电子邮件)。
我可以确认表格中没有任何重复[E-mail Address]
内容。Student
当我使用.Display
而不是.Send
在 myoEmailItem
中时,似乎没有任何重复。也许我应该在循环中包含 1 秒的等待时间?
On Error Resume Next
用于绕过空白电子邮件字段返回的空值;不是每个人都有[E-mail Address]
这个表
为什么此代码向收件人发送随机重复的电子邮件?
Private Sub SendEmail_Click()
Dim rS As DAO.Recordset
Dim dbS As DAO.Database
Dim Filepath As String
Dim Folderpath As String
Dim oOutlook As Outlook.Application
Dim oEmailItem As MailItem
Dim myemail As String
Dim Subjectline As String
Subjectline$ = InputBox$("Please enter the subject line for this mailing.", _
"We need a Subject Line!")
Set dbS = CurrentDb()
Set rS = dbS.OpenRecordset("SELECT * FROM Students")
Do While Not rS.EOF
On Error Resume Next
myemail = rS![E-mail Address]
If oOutlook Is Nothing Then
Set oOutlook = New Outlook.Application
End If
'Set the email template
Set oEmailItem = oOutlook.CreateItemFromTemplate("C:\MailTemplate\Mail1.oft")
With oEmailItem
.To = [myemail]
.Subject = Subjectline$
.Send
End With
'End of emailing
rS.MoveNext
Loop
Set oEmailItem = Nothing
Set oOutlook = Nothing
Set rS = Nothing
Set dbS = Nothing
End Sub
更新:
感谢 HiPierr0t。您的回答表明我没有在循环结束时清空变量;[E-mail Address]
因此在遇到空或空白电子邮件字段时分配以前使用的。
我确实必须保持
Set oEmailItem = oOutlook.CreateItemFromTemplate("C:\MailTemplate\Mail1.oft")
然而,在循环内部(奇怪,必须是 MS 的东西)。
我最终删除了On Error Resume Next
,因为它确实会产生更多问题,并使用
myemail = Nz(rS![Email Address], vbNullString)
将任何 null 或空白字段更改为""
. 这样,我不需要每次都清空变量,因为查找将其更改为""
无论如何它是否为空。If..Else 负责其余的工作。
Do While Not rS.EOF
'On Error Resume Next
myemail = Nz(rS![Email Address], vbNullString)
Set oEmailItem = oOutlook.CreateItemFromTemplate("C:\MailTemplate\Mail1.oft")
If myemail = "" Then
rS.MoveNext
Else
With oEmailItem
.To = [myemail]
.Subject = Subjectline$
.Display
End With
'End of my emailing report
rS.MoveNext
End If
Loop
解决方案
On Error Resume Next
往往会产生比解决的问题更多的问题。
如果不存在电子邮件,您的代码将继续。但是,您的变量myemail仍然充满了您发送电子邮件的上一封电子邮件。
myemail = ""
1- 确保在使用或发送电子邮件后清空变量myemail = vbNullString
。
2-在发送电子邮件之前,请检查myemail是否为空并带有If
声明。
3-您可能希望将代码放在循环之外。它不会有很大的不同,但不需要每次都处理这部分代码。
If oOutlook Is Nothing Then
Set oOutlook = New Outlook.Application
End If
'Set the email template
Set oEmailItem = oOutlook.CreateItemFromTemplate("C:\MailTemplate\Mail1.oft")
推荐阅读
- rx-java - RxJava:为 varargs 参数创建未经检查的泛型数组
- rest - REST API - 处理 PATCH 中的空正文
- mongodb - 无法在 Beaglebone Green 上安装 MongoDB
- javascript - Javascript中的严格模式
- graph - CYPHER 存储 count() 值以供进一步使用
- omnet++ - 静脉:错误:无法解析主机/地址“sumo.dlr.de”
- ios - IOS Guess mime 类型
- extjs - sencha 多个过滤器在一个属性中
- windows - 是什么导致产生 Python 提示符?
- javascript - Laravel 中的 AJAX 调用 - 点赞按钮