Becky!で定型文のメールを大量に送信

一昨日のエントリで、Beckyにmailtoを渡すと、渡した内容で新規メール送信画面が生成されると書きましたが、同じメールを大量にBecky!で送信したいときに便利なスクリプトを書いてみた。

Becky!でやる事自体に意味はないですww

宛先リストと、メールテンプレを作れば、宛先リストからデータを取ってきてmailto:をB2.exeに渡すというものです。

欲しい人はこちらからだうぞ。
適当に改変してくださってかまいません。
使い方はダウンロードしたやつの「README」に書いておいた。PHPで書いてあるので、PHP5以上と、当然Becky!がひつようになりますよ。あとコレ使って何かあっても責任は負えないので自己責任でお使いください。
ソースはこんな感じだよ。

■追記(2009/02/01)
* 誰にも指摘されてないけど、途中でWindowがMAXになったらyesとかnoとかコマンドを打つ部分でnoとかやってもそのまま処理が続いてしまっていたの修正。。。orz

<?php
/**
 * BekckyToMail.php
 * 
 * Becky!で大量にメールを作成するときのツール。
 * @since      PHP5.2
 * @copyright  Copyright(C) tell-k All Rights Reserved.
 * @author tell-k <ffk2005@gmail.com>
 * @example CLI "php AllianceToMail.php "
 * @todo
 *  - 設定のやつが何かヒドイのでYAMLで記述できるようにしたい。
 *  - targetディレクトリをコマンドラインオプションで渡す。
 *  - 実行ログとか残そうかと思ったけどメンドイからやめた。
*/

// 設定
define(BATCH_PATH,  realpath(dirname(__file__)));
define(TARGET_PATH, BATCH_PATH.DIRECTORY_SEPARATOR.'target');
define(TEMPLATE_PATH, TARGET_PATH.DIRECTORY_SEPARATOR.'template');
define(ADDRESSBOOK, TARGET_PATH.DIRECTORY_SEPARATOR.'addressbook.csv');
define(DELIMITER, ',');
define(TEMPLATE_FILE_EXT, '.tpl');
define(READ_LINE_SIZE, 1000);
define(DEFAULT_CC, 'hogehoge@hogehogehoge.jp, hogesuke@hoge.co.jp');
define(SUBJECT, '【 %s様 】 こんにちわ!こんにちわ!');
//B2.exeのパス
define(BECKEY_EXE, 'C:\Program Files\RimArts\B2\B2.exe');
//Becky!が同時に20個までしか、Windowが立ちあがらないので、20個立ち上げたら、入力待ちになるようした。
define(MAX_WINDOW, '20'); 


//アドレスファイル探索
if(!file_exists(ADDRESSBOOK))
{
    exit('>> not found ['.ADDRESSBOOK."]\n");
}
echo ">> found [".ADDRESSBOOK."] \n";

//アドレスファイルオープン
$handle = fopen(ADDRESSBOOK, "r");
if(!$handle)
{
    exit(">> can't file open");
}
echo ">> file open \n";

//ヘッダレコード(先頭行)の読み出し。カラム種別判別のため。
if(!($head_record = fgetcsv($handle, READ_LINE_SIZE, DELIMITER)))
{
    exit(">> \can't read header column \n");
}
$column_array = array_flip($head_record);
echo ">> read header column \n";

echo ">> get csv data \n";
$window_count=0;
while (($data = fgetcsv($handle, READ_LINE_SIZE, DELIMITER)))
{    
    if(++$window_count > MAX_WINDOW)
    {
        echo ">> proccess is continue? 'yes' or 'no' [no] /";
        $in = trim(fgets(STDIN));
        switch($in)
        {
            case 'yes':
            case 'y':
                echo ">> '$in' command accepted. this program is continue\n";
                break;
            case 'no':
            case 'n':
                echo ">> '$in' command accepted. this program is exit\n";
                exit; //break;から変更
            default:
                echo ">> invalid command '$in'  this program is force exit!\n";
                exit; // break;から変更
        }
        $window_count = 1;//カウント初期化
    }

    $num = count($data);
    echo ">> ------------------------- \n";
    echo ">> $num fields in line $row: \n";
    $row++;
    $row = $search_array = $replace_array = array();
    for ($c=0; $c < $num; $c++) 
    {
       $row[$head_record[$c]] .= (array_key_exists($head_record[$c], $row)) ? ", ".$data[$c] : $data[$c] ;
       $search_array[]         = '/{'.$head_record[$c].'}/';
       $replace_array[]        = $data[$c]; 
       if($head_record[$c] == 'to') echo ">> mailto => ".$row['to']." \n";
    }

    echo ">> file open mail template \n";
    $mail_template = file_get_contents(TEMPLATE_PATH.DIRECTORY_SEPARATOR.$row['genre'].'_'.$row['method'].TEMPLATE_FILE_EXT);
    $mail_body     = preg_replace($search_array, $replace_array, $mail_template);
    $subject       = sprintf(SUBJECT, $row['subject']);
    $row['cc']    .= (array_key_exists('cc', $row)) ? ", ".DEFAULT_CC : DEFAULT_CC ;
    $triggerMail   = sprintf("\"%s\" mailto:%s?cc=%s?subject=%s?body=%s", BECKEY_EXE, $row['to'], $row['cc'], urlencode($subject), urlencode($mail_body));
    //echo $triggerMail ."\n";
    system($triggerMail, $result);
    
    echo ">> exec becky.exe \n";
    if( $result !== 0 )
    {
        print_r($result);
        exit(">> failed becky.exe!!!");
    }
    echo ">> ------------------------- \n";
}
//ファイルクローズ
fclose($handle);
echo ">> file close \n";
exit("exit!");