我有许多 Excel 工作表已导入 Access 以准备导入 Salesforce.com(将不同的字段名称统一并映射到 SFDC 将识别的字段名称),因此我可以从任何一个表(Excel 工作表)批量发送电子邮件通过 VBA 和 Outlook。
我在这里找到了非常适合我的代码:http : //www.jephens.com/2007/05/13/how-to-send-e-mail-from-ms-access-using-outlook/魅力。我特别喜欢它一一发送电子邮件,而不是作为一封大量信息发送给每个人都密件抄送。
我想做的是更改代码以充分利用此功能,但我对 VBA 的了解非常有限。
我的问题是两个方面。第一个是当我有一个表没有列表中每个条目的电子邮件地址时,查询会出错。我假设这是一个简单的问题,只需输入一些代码,告诉查询跳过丢失的电子邮件地址并转到下一个。但是,我不太了解 VBA,所以我希望有人可以帮助我解决我应该在什么地方以及在哪里放置代码以实现这一点。
第二件事是我设置了我的电子邮件,因此任何收到电子邮件的收件人都可以通过退回电子邮件取消订阅来选择退出。然后我返回到我发送电子邮件的表格(列表),并在我创建的“电子邮件退出”字段下的条目旁边放一个“1”(SFDC 也认识到这一点)。我还希望能够查询“电子邮件退出”字段并让 VBA 跳过它找到的任何带有 1 的条目,这样人们以后就不会收到电子邮件
希望我很清楚......我正在使用 Access 2013 和 Outlook 2010。
这是“SendMail”模块背后的 VBA 代码,当我启动“SendEMail”宏时,这一切都会发生:
Option Compare Database
Public Function SendEMail()
Dim db As DAO.Database
Dim MailList As DAO.Recordset
Dim MyOutlook As Outlook.Application
Dim MyMail As Outlook.MailItem
Dim Subjectline As String
Dim BodyFile As String
Dim fso As FileSystemObject
Dim MyBody As TextStream
Dim MyBodyText As String
Set fso = New FileSystemObject
' First, we need to know the subject.
Subjectline$ = InputBox$("Please enter the subject line for this mailing.", _
"We Need A Subject Line!")
' If there??s no subject, call it a day.
If Subjectline$ = "" Then
MsgBox "No subject line, no message." & vbNewLine & vbNewLine & _
"Quitting...", vbCritical, "E-Mail Merger"
Exit Function
End If
' Now we need to put something in our letter...
BodyFile$ = InputBox$("Please enter the filename of the body of the message.", _
"We Need A Body!")
' If there??s nothing to say, call it a day.
If BodyFile$ = "" Then
MsgBox "No body, no message." & vbNewLine & vbNewLine & _
"Quitting...", vbCritical, "I Ain??t Got No-Body!"
Exit Function
End If
' Check to make sure the file exists...
If fso.FileExists(BodyFile$) = False Then
MsgBox "The body file isn??t where you say it is. " & vbNewLine & vbNewLine & _
"Quitting...", vbCritical, "I Ain??t Got No-Body!"
Exit Function
End If
' Since we got a file, we can open it up.
Set MyBody = fso.OpenTextFile(BodyFile, ForReading, False, TristateUseDefault)
' and read it into a variable.
MyBodyText = MyBody.ReadAll
' and close the file.
MyBody.Close
' Now, we open Outlook for our own device..
Set MyOutlook = New Outlook.Application
' Set up the database and query connections
Set db = CurrentDb()
Set MailList = db.OpenRecordset("MyEmailAddresses")
' now, this is the meat and potatoes.
' this is where we loop through our list of addresses,
' adding them to e-mails and sending them.
Do Until MailList.EOF
' This creates the e-mail
Set MyMail = MyOutlook.CreateItem(olMailItem)
' This addresses it
MyMail.To = MailList("email")
'This gives it a subject
MyMail.Subject = Subjectline$
'This gives it the body
MyMail.HTMLBody = MyBodyText
'If you want to send an attachment
'uncomment the following line
'MyMail.Attachments.Add "c:myfile.txt", olByValue, 1, "My Displayname"
' To briefly describe:
' "c:myfile.txt" = the file you want to attach
' olByVaue = how to pass the file. olByValue attaches it, olByReference creates a shortcut.
' the shortcut only works if the file is available locally (via mapped or local drive)
' 1 = the position in the outlook message where to attachment goes. This is ignored by most
' other mailers, so you might want to ignore it too. Using 1 puts the attachment
' first in line.
' "My Displayname" = If you don??t want the attachment??s icon string to be "c:myfile.txt" you
' can use this property to change it to something useful, i.e. "4th Qtr Report"
'This sends it!
MyMail.Send
'Some people have asked how to see the e-mail
'instead of automaticially sending it.
'Uncomment the next line
'And comment the "MyMail.Send" line above this.
'MyMail.Display
'And on to the next one...
MailList.MoveNext
Loop
'Cleanup after ourselves
Set MyMail = Nothing
'Uncomment the next line if you want Outlook to shut down when its done.
'Otherwise, it will stay running.
'MyOutlook.Quit
Set MyOutlook = Nothing
MailList.Close
Set MailList = Nothing
db.Close
Set db = Nothing
End Function