Poor man’s mail merge in Apple Mail

Back at work after some "virtual" vacation (where virtual equals being at sea, yet nailed to a phone for most of the day… busy times over here), I have been confronted with what seemed to be a brain dead issue, that is sending a sizable number of emails to a lot of recipients. I'm not fond of Bcc: lists, so I thought there would have been an easy way to do some sort of mail merge in Apple Mail.

Unless I'm seriously missing something, that's not the case: there is no built-in functionality I could find, and all I manage to scavenge on the Net were dubious crippleware packages. There is a remote possibility using Automator, but it seems to depend from addressbook entries, while all I had was a text file with a list of email addresses.

I thought that would make for a good chance to finally have a look at AppleScript and, to my surprise, it was way easier than I thought. I'm sure there are much better ways of coding this (I particularly hate how I had to build the From: address by hand, yet apparently there is no easy way to grab that from the AppleScript dictionary), but if all you have is a text file with your e-mail in it and another file with a list of email addresses, you might find this script useful. Or not. It floats my boat, so I thought I'd share it.

Enjoy!(or just download it)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
tell application "Mail" to set allAccounts to name of every account
choose from list allAccounts with title "Choose the Mail account to use..."
set theAccount to result as string
 
set subjectDialog to display dialog ¬
	"Enter the subject of the email to send" default answer "no subject"
set theSubject to text returned of subjectDialog
 
set sendOrPreview to the button returned of ¬
	(display dialog ¬
		"Send the messages right away or preview and send manually?" with title ¬
		"Send or Preview?" with icon caution ¬
		buttons {"Preview", "Send"} ¬
		default button 1)
 
set theText to (choose file with prompt "Pick a text file containing the email text")
 
set theContent to read theText
 
tell application "Finder"
	set addresses to paragraphs of ¬
		(read (choose file with prompt "Pick a text file containing email addresses, one by line"))
end tell
 
tell application "Mail"
	activate
	set activeAccount to account theAccount
	repeat with i from 1 to (the length of addresses)
		set newMessage to make new outgoing message ¬
			with properties {account:activeAccount, subject:theSubject, content:theContent}
		tell newMessage
			set sender to ¬
				((full name of activeAccount & " < " & email addresses of activeAccount as string) & ">")
			make new to recipient at end of to recipients ¬
				with properties {address:(a reference to item i of addresses)}
			set visible to true
		end tell
		if sendOrPreview is equal to "Send" then
			send newMessage
		end if
	end repeat
end tell

3 Responses to “Poor man’s mail merge in Apple Mail”


  1. 1 Michael Kreppein

    Gianugo,

    What perfect timing! I was looking to do this exact thing in Apple Mail and your post was at the top of the search list. THANK YOU!

    The one addition to your script I’d love to see is the ability add a unique salutation. For instance, if the text file of email addresses looked like:
    Michael, email@email.com
    Gianugo, email2@email2.com

    Then the body of the email could be:

    Dear XXXX,

    Where XXXX is replaced by Michael for the first email and Gianugo for the second email.

    I know Iknow, you offered up something for free and now someone wants to you add their feature. But I do think it’d be a useful feature for all.

    Thanks,
    Michael

  2. 2 Michael McCrystal

    I’m running into an error and was hoping you’ve already seen it and found a work around. When I run the script it works fantastic, however, it is messing with the message text. The start of the message looks like this”

    “{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
    {\fonttbl\f0\fswiss\fcharset0 Helvetica;}
    {\colortbl;\red255\green255\blue255;}
    {\info
    {\author Michael J. McCrystal}
    {\*\copyright Copryright 2006 Michael J. McCrystal }}\margl1440\margr1440\vieww9000\viewh8400\viewkind0
    \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural

    \f0\fs24 \cf0 Hey Everyone,\”

    Have I done something wrong in the process?

    Thanks so much for dreaming this up. I’ve been looking for a good way to do this for a long time.

  3. 3 Michael McCrystal

    I found the answer almost as soon as I posted the question. I had saved my email text as RTF and not as a text file.

    Thank you again for working through this.

Leave a Reply