Add CC and BCC with Mail Merge

I am trying to add a cc function to a merge. In other words, I need to do more than personalize emails to different email addresses. I would also like every email to include a CC that shows the same email to multiple recipients.

Example: The same email to John Doe can be automatically sent to his manager.

I tried to add, and; and also merge two cells in excel with addresses and errors.

I also read an article showing how to send attachments to multiple recipients and modify it to make cc work. See the article below.

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

The code I have provided is shown below. This allowed me to cc, however, it only goes through with the first row of letters and no one else. Also, the message body is not displayed.

Any pointers?

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

      

+3


source to share


2 answers


First, I would highlight your email code and the code to iterate over your spreadsheet. Here I am taking the email code for the look and feel (remember to set links -> Outlook object model, as I used an earlier suggestion)

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

      

Note. Recipients, CC, and BCC expect arrays of values, which can also be just one value. This means that we can perhaps send a raw range to it, or we can load that range into an array and send it to that.

Now that we've created a good generic way to send emails (which is easy to reuse), we can think about the logic of what we email. I built the following email but didn't spend a lot of time on it (or tested it as it is pretty specific to your tables). I believe it should be very close though.



While writing this, I think you will see a major trick for editing yours, however - the key was the separator text in cell CC, used by the separator. This creates an array of addresses that can then be iterated over and added to the recipient, CC, or BCC.

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

      

This turned into a longer post than I expected. Good luck with your project!

+2


source


I had the same problem as CC using mail merge from Excel and also wanted to use the BCC field and have subjects that are variables for each email message) and also didn't find a good tool, so I created my own tool and just released it to others. Let me know if this solves your problem: http://emailmerge.cc/

It doesn't handle attachments yet, but I was planning on adding this soon.



EDIT: EmailMerge.cc now also handles attachments, high / low priority, read receipts [unfortunately some people still want this;)]

I hope this is helpful to you, I intend not to spam SO;)

0


source







All Articles