如何使用Outlook和Excel生成带有附件的电子邮件,并保留格式?

如何使用Outlook和Excel生成带有附件的电子邮件,并保留格式?,excel,vba,outlook,email-attachments,Excel,Vba,Outlook,Email Attachments,我有一个名为“Test.xlsx”的Excel文档: 我有以下VBA代码: Sub Send_multiple_Email() Dim sh As Worksheet Dim sPath As String Dim sName As String Dim OA As Object Dim msg As Object Dim i As Integer Dim last_row As Integer Set sh = ThisWorkbook.Sheets("Ark1") S

我有一个名为“Test.xlsx”的Excel文档:

我有以下VBA代码:

Sub Send_multiple_Email()
Dim sh As Worksheet
Dim sPath As String
Dim sName As String
Dim OA As Object
Dim msg As Object
Dim i As Integer
Dim last_row As Integer

Set sh = ThisWorkbook.Sheets("Ark1")
Set OA = CreateObject("Outlook.Application")
last_row = Application.WorksheetFunction.CountA(sh.Range("A:A"))

For i = 2 To last_row
Set msg = OA.createitem(0)

msg.to = sh.Range("A" & i).Value
msg.cc = sh.Range("B" & i).Value
msg.Subject = sh.Range("C" & i).Value
msg.body = sh.Range("D" & i).Value

If sh.Range("E" & i).Value <> "" Then
msg.attachments.Add sh.Range("E" & i).Value
End If

sPath = Environ("UserProfile")

'msg.display
'msg.send
msg.SaveAs "C:\Users\xx\Desktop\Save_emails_in_this_folder\" & msg.Subject & ".msg", 3

Next i

End Sub
Sub-Send\u multiple\u Email()
将sh设置为工作表
像细绳一样暗淡
像绳子一样模糊
将OA作为对象
将msg作为对象
作为整数的Dim i
将最后一行变暗为整数
Set sh=ThisWorkbook.Sheets(“Ark1”)
设置OA=CreateObject(“Outlook.Application”)
最后一行=Application.WorksheetFunction.CountA(sh.Range(“A:A”))
对于最后一行的i=2
Set msg=OA.createitem(0)
msg.to=sh.Range(“A”&i).值
msg.cc=sh.Range(“B”和i).值
msg.Subject=sh.Range(“C”&i).Value
msg.body=sh.Range(“D”和i).值
如果为sh.Range(“E”和i).Value“”,则
msg.attachments.Add sh.Range(“E”&i).Value
如果结束
sPath=环境(“用户配置文件”)
'msg.display
“msg.send
msg.SaveAs“C:\Users\xx\Desktop\Save\u emails\u in_this\u folder\”&msg.Subject&“.msg”,3
接下来我
端接头
(我从Excel电子表格运行VBA。)

我保存电子邮件而不是发送它们,这样我可以检查它们是否正确

它使用自定义邮件文本和自定义附件将电子邮件保存在正确的位置,但格式不会保留。(胖文本不是胖文本,作为图像的徽标也会消失。)


解决方法是在Word或Outlook中写入“正文”,但我无法使其正常工作。

您正在设置纯文本属性:

msg.body = sh.Range("D" & i).Value
要保留任何格式和嵌入图像,您需要使用
HTMLBody
属性或处理Word对象模型以直接粘贴Excel中的所有内容。该属性返回正在显示的邮件的Microsoft Word文档对象模型。因此,基本上,您可以利用复制/粘贴操作


Outlook对象模型支持三种自定义邮件正文的主要方式:

  • 属性返回或设置表示Outlook项目的明文正文的字符串
  • MailItem类的属性返回或设置表示指定项的HTML正文的字符串。设置HTMLBody属性将始终立即更新Body属性。例如:
  • Sub-CreateHTMLMail()
    '创建新的电子邮件项目并修改其属性。
    将objMail设置为Outlook.MailItem
    '创建电子邮件项目
    Set objMail=Application.CreateItem(olMailItem)
    用objMail
    '将正文格式设置为HTML
    .BodyFormat=olFormatHTML
    .HTMLBody=“在此处输入消息。”
    .展示
    以
    端接头
    
  • Word对象模型可用于处理消息体。有关更多信息,请参阅

  • 注意,该属性允许您以编程方式更改用于项目正文的编辑器。

    您正在设置纯文本属性:

    msg.body = sh.Range("D" & i).Value
    
    要保留任何格式和嵌入图像,您需要使用
    HTMLBody
    属性或处理Word对象模型以直接粘贴Excel中的所有内容。该属性返回正在显示的邮件的Microsoft Word文档对象模型。因此,基本上,您可以利用复制/粘贴操作


    Outlook对象模型支持三种自定义邮件正文的主要方式:

  • 属性返回或设置表示Outlook项目的明文正文的字符串
  • MailItem类的属性返回或设置表示指定项的HTML正文的字符串。设置HTMLBody属性将始终立即更新Body属性。例如:
  • Sub-CreateHTMLMail()
    '创建新的电子邮件项目并修改其属性。
    将objMail设置为Outlook.MailItem
    '创建电子邮件项目
    Set objMail=Application.CreateItem(olMailItem)
    用objMail
    '将正文格式设置为HTML
    .BodyFormat=olFormatHTML
    .HTMLBody=“在此处输入消息。”
    .展示
    以
    端接头
    
  • Word对象模型可用于处理消息体。有关更多信息,请参阅

  • 注意,该属性允许您以编程方式更改用于项目正文的编辑器。

    是否有不使用内置邮件合并功能的原因?是的,标准内置功能无法添加附件。此外,我希望每个邮件都有不同的附件,我希望将邮件保存在计算机上,以便在手动发送邮件之前进行检查。如果它们看起来不错,我可以再次运行VBA并直接发送它们。VBA更灵活,可以根据特定目的进行调整和修改。是否有理由不使用内置邮件合并功能?是的,标准内置功能无法添加附件。此外,我希望每个邮件都有不同的附件,我希望将邮件保存在计算机上,以便在手动发送邮件之前进行检查。如果它们看起来不错,我可以再次运行VBA并直接发送它们。VBA更灵活,可以根据特定目的进行调整和修改。您使用的是后期绑定,因此您需要声明一个常量
    Const olFormatHTML=2
    ,或者将其替换为
    2
    ,似乎什么都不起作用。我还尝试了基于.oft模板的方法,但也不起作用。您尝试使用了什么代码?我仍然可以在代码中看到
    Body
    属性。您正在使用后期绑定,因此您需要声明一个常量
    Const olFormatHTML=2
    ,或者将其换成
    2
    似乎没有任何效果。我还尝试了基于.oft模板的方法,但也不起作用。您尝试使用了什么代码?我仍然可以在代码中看到
    Body
    属性。