首页 > 解决方案 > 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

标签: ms-accessoutlookvba

解决方案


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")

推荐阅读