2011.05.23

Macで、メール一括送信プログラムを作る

 プログラミングのTips

automatorアイコン例えば取引先にイベントのお知らせをしたいときとか、サークル仲間10名以上に飲み会のお知らせをしたいときなど、アドレスブックに登録した人に一気にメールを送りたいときって、ありませんか?

そんなときに役立つプログラムを、Macに付属のAutomatorとカンタンなApplescriptで作ってみました。

アドレスブックからグループを選んで実行すると、そのグループ内全員に宛名つきのメールを送ります。

対象はAutomator2.1(MacOS 10.6 Snow Leopard)です。
Automatorには触ったことがない、という方も多いようですが、面白いのでぜひ試してみてください。

ところで、Automatorのライブラリには「グループメーラー」というものが用意されています。実はこれを利用すると、一分もかからず、メールを一括送信できるようになります。

automatorでメール一括送信(プログラム書かない!)


こうすると、一行のプログラムも必要ありません。

ただ、オプションのあいさつが英語仕様っぽく、名前が呼び捨てになってしまったり、本文が入らなかったりと、少し足りない感じがします。

というわけで、私はこうしてみました。

選択されたアドレスブックのグループを取得
グループのカード情報をとって、次のアクションへ渡します。
アドレス情報を取得
ここで、名前・メールアドレス・会社名を選んでおきます。すると次のアクションへは、グループ全員のそれらのリストを流します。
Applescriptを実行
ここだけ、プログラムを書きます。メールを送信する動作をここで作ります。

以上が肝の部分です。
これに、使い回ししやすいよう、前半に件名と本文の入力部分をつけると、こんな感じになりました。

automatorでメール一括送信

件名と本文は、最初のほうで入力部分を作っておいて、あとで「変数を取得」します。

「アドレス情報を取得」で「Applescript配列」のオプションを選んでおくと、次のアクションへはアドレス情報の配列が渡されます。それに続いて「変数を取得」すると、そこまで流れてきた情報の後にその内容がつらなるみたいです。

次の画像を見てください。アドレスの配列のあとに、「変数を取得」で取り戻した本文がくっついている様子が分かります。

変数が後ろにくっつく。


こんな風にして後ろへ情報を流していって、最後にApplescriptで処理をします。

on run {array}

    set i_title to end of array--arrayの最後の要素を取って、i_titileにセットする
    set array to reverse of array--arrayの順番をさかさまに。これで、i_titleにセットした値は先頭へ。
    set array to rest of array--先頭の要素をすてて、残りの要素をarrayにセットする。#お尻の要素をすてる関数はナイのかしら??
    
    --もうひとつも、同じように。
    set i_body to item 1 of array --arrayの先頭の要素を取って、i_bodyにセットする。#1からはじまります
    set array to rest of array --先頭の要素をすてて、残りの要素をarrayにセットする。
    set array to reverse of array --arrayの順番をさかさまに。アドレスブックのデータだけ残りました。
    
    --アドレスの一件一件に対してループ
    repeat with person in array
        --名前、メルアドをセット
        if item 1 of person is not equal to missing value then
            set i_company to item 1 of person --会社名
        end if
        
        set i_name to item 2 of person --名前(結合済み)
        
        if item 3 of person is not equal to missing value then
            set i_address_biz to item 3 of person --勤務先メール
        end if
        
        if item 4 of person is not equal to missing value then
            set i_address_per to item 4 of person --自宅メール
        end if
        
        
        --送信先を決定
        if i_address_biz is not equal to missing value then --もし、勤務先メールが空じゃなければ、
            set i_address to i_address_biz --送信先を勤務先へセット。
        else if i_address_per is not equal to missing value then --勤務先メールが空で、自宅メールがあれば
            set i_address to i_address_per --送信先を自宅へセット。
        end if
        
        --display dialog i_address --表示テスト
        
        --宛名を決定
        set i_forname to i_name & "さま:

"
        if i_company is not equal to "" then
            set i_forname to i_company & "
" & i_forname
        end if
        
        try
            tell application "Mail"
                set newMessage to make new outgoing message with properties ¬
                    {subject:i_title, content:i_forname & i_body, visible:true}
                tell newMessage to make new to recipient at end of to recipients with properties ¬
                    {address:i_address}
                --send newMessage --そのまま送信してしまう場合は、先頭のコメントを外す
            end tell
        end try
    end repeat
    
    
    return true
end run

書きなれてないから、スマートじゃないと思うけど、まあ動くから...。

サンプルスクリプトを置いておきます。
もしよろしければ参考になさってください。
automator_addressbook-to-mail.zip

Merch d"avance!

読んでくれてありがとう!
もし記事が良かったと思ったら、いいね!やTweet、お願いします。

Factory 70 制作者イラストレーターとIT系エンジニアの二足のわらじで活動中。イラストでは一般書挿絵から教材図版まで、エンジニアとしてはネットショップ向けアプリケーションの開発など、幅広く仕事をこなすフリーランスワーカー。お酒とタイガースの町を拠点に精力的に活動中。

イラストレーションのことやプログラミングのことなど、ざっくばらんにいろいろつづっていきます。

Factory70 イラスト制作 制作例&ご依頼はこちら

 

イラスト制作のFactory 70(ファクトリーななじゅう)