如何为Excel VBA批量发送的邮件添加默认签名?
解决Excel VBA批量邮件中自动填充默认Outlook签名的问题
你的代码里直接引用Signature变量但未定义,而且Outlook的默认签名不会在创建邮件实例时自动加载,必须先调用.Display方法触发邮件显示,才能获取到签名内容。以下是修正后的代码:
Sub send_mass_email() Dim i As Integer Dim Greeting, email, body, subject, business, Website As String Dim OutApp As Object Dim OutMail As Object Dim signature As String ' 定义签名变量 body = ActiveSheet.TextBoxes("TextBox 1").Text i = 2 ' 只创建一次Outlook实例,避免重复创建影响性能 Set OutApp = CreateObject("Outlook.Application") Do While Cells(i, 1).Value <> "" Greeting = Cells(i, 2).Value email = Cells(i, 3).Value body = ActiveSheet.TextBoxes("TextBox 1").Text subject = Cells(i, 4).Value business = Cells(i, 1).Value Website = Cells(i, 5).Value ' 替换占位符 body = Replace(body, "B2", Greeting) body = Replace(body, "A2", business) body = Replace(body, "E2", Website) Set OutMail = OutApp.CreateItem(0) With OutMail .To = email .Subject = subject ' 先显示邮件,触发Outlook加载默认签名 .Display ' 获取当前邮件的签名内容(纯文本格式) signature = .Body ' 将自定义正文与签名拼接,添加换行保证格式整洁 .Body = body & vbCrLf & vbCrLf & signature '.Attachments.Add ("") ' 可在此添加附件 '.Send ' 取消注释直接发送,否则保持显示状态 End With ' 重置正文文本 body = ActiveSheet.TextBoxes("TextBox 1").Text i = i + 1 Loop Set OutMail = Nothing Set OutApp = Nothing MsgBox "邮件已生成/发送!" End Sub
关键改动说明:
- 新增
signature变量用于存储签名内容 - 将
OutApp的创建移到循环外,避免重复创建Outlook实例,提升性能 - 先调用
.Display触发签名加载,再获取签名内容 - 用
vbCrLf添加换行,保证自定义正文和签名之间的格式分隔清晰
如果你的默认签名是HTML格式(包含图片、样式),需要改用.HTMLBody处理,代码调整如下:
With OutMail .To = email .Subject = subject .Display ' 获取HTML格式的签名 signature = .HTMLBody ' 将自定义正文转为HTML格式并与签名拼接 .HTMLBody = "<p>" & Replace(body, vbCrLf, "<br>") & "</p><br>" & signature End With
内容的提问来源于stack exchange,提问作者Adam Humphries
相关产品推荐
相关产品推荐

