【问题标题】:Add CC and BCC with Mail Merge使用邮件合并添加抄送和密件抄送
【发布时间】:2014-10-28 15:34:32
【问题描述】:

我正在尝试将 cc 功能添加到邮件合并中。换句话说,我不仅需要将电子邮件个性化到不同的电子邮件地址。我还希望每封电子邮件都包含一个抄送,向多个收件人显示同一封电子邮件。

示例:发给 John Doe 的同一封电子邮件可以自动抄送给他的经理。

我尝试添加 , 和 ;以及将excel中的两个单元格与地址合并并出现错误。

我还阅读了一篇文章,其中介绍了如何将附件发送给多个收件人并对其进行修改以使抄送工作。请参阅下面的文章。

http://word.mvps.org/FAQs/MailMerge/MergeWithAttachments.htm

我想出的代码如下所示。它允许我抄送,但是,它只通过第一行电子邮件,其余的都没有。消息的正文也没有显示出来。

任何指针?

Sub emailmergewithattachments()

'Global Config Variables
    Dim saveSent As Boolean, displayMsg As Boolean, attachBCC As Boolean
    saveSent = True 'Saves a copy of the messages into the senders "sent" box
    displayMsg = False 'Pulls up a copy of all messages to be sent - WARNING, do not use on long lists!
    attachBCC = False 'Adds third column data into the BCC field. Will throw error if this column does not exist.

    Dim Source As Document, Maillist As Document, TempDoc As Document
    Dim Datarange As Range
    Dim i As Long, j As Long
    Dim bStarted As Boolean
    Dim oOutlookApp As Outlook.Application
'Dim oOutlookApp As Application
    Dim oItem As Outlook.MailItem
'Dim oItem As MailMessage
    Dim mysubject As String, message As String, title As String
    Set Source = ActiveDocument
' Check if Outlook is running.  If it is not, start Outlook
    On Error Resume Next
    Set oOutlookApp = GetObject(, "Outlook.Application")
    If Err <> 0 Then
        Set oOutlookApp = CreateObject("Outlook.Application")
        bStarted = True
    End If
' Open the catalog mailmerge document
    With Dialogs(wdDialogFileOpen)
        .Show
    End With
    Set Maillist = ActiveDocument
' Show an input box asking the user for the subject to be inserted into the email messages
    message = "Enter the subject to be used for each email message."    ' Set prompt.
    title = " Email Subject Input"    ' Set title.
' Display message, title
    mysubject = InputBox(message, title)
' Iterate through the Sections of the Source document and the rows of the catalog mailmerge document,
' extracting the information to be included in each email.
    For j = 0 To Source.Sections.Count - 1
        Set oItem = oOutlookApp.CreateItem(olMailItem)

' modification begins here

        With oItem
            .Subject = mysubject
.body = ActiveDocument.Content
            .Body = Source.Sections(j).Range.Text

            Set Datarange = Maillist.Tables(1).Cell(j, 1).Range
            Datarange.End = Datarange.End - 1
            .To = Datarange

            Set Datarange = Maillist.Tables(1).Cell(j, 2).Range
            Datarange.End = Datarange.End - 1
            .CC = Datarange

            If attachBCC Then
                Set Datarange = Maillist.Tables(1).Cell(j, 3).Range
                Datarange.End = Datarange.End - 1
                .CC = Datarange
            End If

            For i = 2 To Maillist.Tables(1).Columns.Count
                Set Datarange = Maillist.Tables(1).Cell(j, i).Range
                Datarange.End = Datarange.End - 1
                .Attachments.Add Trim(Datarange.Text), olByValue, 1
                Next i

                If displayMsg Then
                    .Display
                End If
                If saveSent Then
                    .SaveSentMessageFolder = mpf
                End If

                .Send
            End With
            Set oItem = Nothing
            Next j
            Maillist.Close wdDoNotSaveChanges
'  Close Outlook if it was started by this macro.
            If bStarted Then
                oOutlookApp.Quit
            End If
            MsgBox Source.Sections.Count - 1 & " messages have been sent."
'Clean up
            Set oOutlookApp = Nothing
End Sub

【问题讨论】:

    标签: excel vba email mailmerge


    【解决方案1】:

    首先,我将您的电子邮件代码和用于迭代您的电子表格的代码分开。 这是我对 Outlook 的电子邮件代码的看法(请务必设置引用->outlook 对象模型,因为我使用了提前投标)

    Sub SendMessage(recipients As Variant, subject As String, body As String, Optional ccRecips As Variant, Optional bccRecips As Variant, Optional DisplayMsg As Boolean, Optional AttachmentPath As Variant)
              Dim objOutlook As Outlook.Application
              Dim objOutlookMsg As Outlook.MailItem
              Dim objOutlookRecip As Outlook.Recipient
              Dim objOutlookAttach As Outlook.Attachment
              Dim item As Variant
              ' Create the Outlook session.
              On Error Resume Next
                 Set objOutlook = GetObject(, "Outlook.Application")
                 If Err <> 0 Then
                     Set objOutlook = CreateObject("Outlook.Application")
                 End If
              On error goto 0
    
              ' Create the message.
              Set objOutlookMsg = objOutlook.CreateItem(olMailItem)
    
              With objOutlookMsg
                  ' Add the To recipient(s) to the message.
                  For Each item In recipients
                    Set objOutlookRecip = .recipients.Add(item)
                    objOutlookRecip.Type = olTo
                  Next
                  ' Add the CC recipient(s) to the message.
                  If Not IsMissing(ccRecips) Then
                    For Each item In ccRecips
                      Set objOutlookRecip = .recipients.Add(item)
                      objOutlookRecip.Type = olTo
                    Next
                  End If
                 ' Add the BCC recipient(s) to the message.
                  If Not IsMissing(bccRecips) Then
                    For Each item In bccRecips
                      Set objOutlookRecip = .recipients.Add(item)
                      objOutlookRecip.Type = olBCC
                    Next
                  End If
                 ' Set the Subject, Body, and Importance of the message.
                 .subject = subject
                 .body = body 'this can also be HTML, which is great if you want to improve the look of your email, but you must change the format to match
    
                 ' Add attachments to the message.
                 If Not IsMissing(AttachmentPath) Then
                     Set objOutlookAttach = .Attachments.Add(AttachmentPath)
                 End If
    
                 ' Resolve each Recipient's name -this may not be necessary if you have fully qualified addresses.
                 For Each objOutlookRecip In .recipients
                     objOutlookRecip.Resolve
                 Next
    
                 ' Should we display the message before sending?
                 If DisplayMsg Then
                     .Display
                 Else
                     .Save
                     .Send
                 End If
              End With
              Set objOutlook = Nothing
     End Sub
    

    注意:收件人、抄送人和密件抄送人需要数组值,这些值也可能只有一个值。这意味着我们可能可以向它发送一个原始范围,或者我们可以将该范围加载到一个数组中,然后发送它。

    现在我们已经构建了一个很好的通用发送电子邮件的方式(它可以方便地重复使用),我们可以考虑一下我们发送电子邮件的逻辑。我已经建立了下面的电子邮件,但我没有花很多时间在它上面(或测试它,因为它非常特定于你的表)。我相信它应该非常接近。

    在撰写本文时,我想您会看到编辑自己的主要技巧 - 关键是通过您使用的分隔符拆分 CC 单元格中的文本。这会创建一个地址数组,然后您可以对其进行迭代并添加到收件人、抄送或密送。

    Sub DocumentSuperMailSenderMagicHopefully()
    Dim Source As Document, Maillist As Document, TempDoc As Document
    Dim mysubject As String, message As String, title As String
    Dim datarange As Range 'word range I'm guessing...
    Dim body As String
    Dim recips As Variant
    Dim ccs As Variant
    Dim bccs As Variant
    Dim j As Integer
    Dim attachs As Variant
    Set Source = ActiveDocument
    With Dialogs(wdDialogFileOpen)  'Hey, I'm not sure what this does, but I'm leaving it there.
        .Show
    End With
    Set Maillist = ActiveDocument
    ' Show an input box asking the user for the subject to be inserted into the email messages
    message = "Enter the subject to be used for each email message."    ' Set prompt.
    title = " Email Subject Input"    ' Set title.
    ' Display message, title
    mysubject = InputBox(message, title)
    ' Iterate through the Sections of the Source document and the rows of the catalog mailmerge document,
    ' extracting the information to be included in each email.
    
    'IMPORTANT: This assumes your email addresses in the table are separated with commas!
    For j = 0 To Source.Sections.Count - 1
        body = Source.Sections(j).Range.Text
        'get to recipients from tables col 1 (I'd prefer this in excel, it's tables are much better!)
        Set datarange = Maillist.tables(1).Cell(j, 1).Range
        datarange.End = datarange.End - 1
        recips = Split(datarange.Text)
        'CC's
        Set datarange = Maillist.tables(1).Cell(j, 2).Range
        datarange.End = datarange.End - 1
        ccs = Split(datarange.Text)
        'BCC's
        Set datarange = Maillist.tables(1).Cell(j, 3).Range
        datarange.End = datarange.End - 1
        bccs = Split(datarange.Text)
    
        'Attachments array, should be paths, handled by the mail app, in an array
        ReDim attachs(Maillist.tables(1).Columns.Count - 3) 'minus 2 because you start i at 2 and minus one more for option base 0
        For i = 2 To Maillist.tables(1).Columns.Count
            Set datarange = Maillist.tables(1).Cell(j, i).Range
            datarange.End = datarange.End - 1
            attachs(i) = Trim(datarange.Text)
        Next i
    
       'call the mail sender
       SendMessage recips, subject, body, ccs, bccs, False, attachs
       Next j
    Maillist.Close wdDoNotSaveChanges
    MsgBox Source.Sections.Count - 1 & " messages have been sent."
    End Sub
    

    这篇文章比我预期的要长。祝项目顺利!

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,无法使用 Excel 中的邮件合并进行抄送,并且还想使用密件抄送字段并为每封电子邮件设置可变主题),但也没有找到好的工具,所以我构建了自己的工具,并刚刚发布它供其他人受益。如果这也解决了您的问题,请告诉我:http://emailmerge.cc/

      它还不能处理附件,但我计划尽快添加。

      编辑:EmailMerge.cc 现在还处理附件、高/低优先级、已读回执 [不幸的是,有些人仍然想要这些 ;)]

      我希望这对您有用,我的目的不是发送垃圾邮件 SO ;)

      【讨论】:

        猜你喜欢
        • 2013-01-01
        • 2017-08-28
        • 2011-04-02
        • 1970-01-01
        • 1970-01-01
        • 2013-12-22
        • 2013-06-08
        • 1970-01-01
        • 2015-01-02
        相关资源
        最近更新 更多