おサルさんでもわかる?ホームページ作り!
| htmlタグ辞典+css


◆Chapter 4 - メールマガジンのプログラムを作る
リストに登録されているメールアドレスに一斉にメール送信をするプログラムを作成してみます。
一般的にメールマガジン(メルマガ)といわれるもので、ご自身で登録したことが一度はあるでしょう。
ゲームサイトを利用するとよく勝手に送られてくることがありますね・・・。
ここで作成するプログラムは、CSV に登録されたリストを読み込み送信するというとてもシンプルなもので次の機能は割愛しています。
大量のメール送信には向いていません。
- メールアドレスの登録・削除
- 時間・曜日の指定
- 分割送信
大まかなプログラムの流れは次の通りです。
メールアドレスの登録・削除は、『 CSV対応のログファイルを作る 1 』を参照に入力フォームでアドレスの追加・削除できるようにすれば、CSV ファイルで管理することも可能になります。
個人的には、SQLite などのデータベースで運用された方が登録、修正、削除、検索が便利に使えると思います。
時間・曜日指定であるファイルを動作させるには cron(クーロン) を利用します。
cron は、crontab とも言われジョブ(スクリプト)の自動実行をサーバー側で設定できる機能なのです。
例えば毎週金曜日の 5 時、毎月 1 日の 10 時などの設定ができます。
サーバーは常に時間を管理しているわけですから指定時間になればファイルを実行させるのは容易なわけですね。
運営されているサイトが比較的、アクセスが多いのなら cron を使わなくともページに仕込んでおけば時間指定の動作は可能です。
ちなみフリーのレンタルサーバーでは cron が使えないことが多く、有料の場合でも使えないことがあります。
分割送信とは大量メールを分割して送信することです。
PHP のページの実行時間はデフォルトで 30 秒とされてます。
大量にメールを送信するとなると、30 秒で収まらないこともあり処理を中断することになります。
その為、処理を分割するなどの対応が必要になります。
また大量のメールを一斉に送信するとスパムと判断されることがあります。
分割送信をさせることはスパムと判断されないようにする為の対応でもあり、サーバー負荷の軽減でもあります。
レンタルサーバーによっては 1 日のデータ送信量、トラフィック制御などが制限されていることがありますので注意しましょう。
ちなみに携帯キャリアでは規定数以上のメールが一度に送られてくるとスパムとされてしまいます。
規定数は公開されていませんが、1 秒に 1 通とすると問題はないようです。
スクリプトの実行可能な時間を変更するには、『 Tip10 - タイムアウトを延長する 』を参照ください。
サンプルプログラムを用意しました。
こちらのプログラムに沿って説明していきます。
【Mailmagazine.php】
01|<?php
02| # 日本語が読み込まれない場合に記述
03| setlocale(LC_ALL,'ja_JP.UTF-8');
04|
05| # 内部環境設定
06| mb_language("ja");
07| mb_internal_encoding("UTF-8");
08|
09| #送信内容の設定
10| $from = "xxxxxxx@yourdomain.net";
11| $title = "メルマガテスト";
12| $header = "From: {$from}";
13|
14| # リストの読み込み
15| $file = "list.csv";
16| $data = file_get_contents($file);
17|
18| # 文字コードを変換する
19| $data = mb_convert_encoding($data,'UTF-8','sjis-win');
20|
22| # 一時ファイルを作成して文字コードを変換したデータを書き込む。
23| $temp = tmpfile();
24| $csv = array();
25|
26| fwrite($temp,$data);
27| rewind($temp);
28|
29| # 一時ファイルのデータを再度CSVとして読み込む
30| while(($data=fgetcsv($temp,0,",")) !== false){
31|   $csv[] = $data;
32| }
33| fclose($temp);
34|
35| # 送信処理
36| for($i=0; $i<count($csv); $i++){
37|   $to = $csv[$i][1];
38|   $name = $csv[$i][0];
39|   $body = <<<EOM
40|こんにちは、{$name}さん。
41|
42|いつも○○ショッピングをご利用ありがとうございます。
43|最新ニュースをお届けします。
44|
45|**********
46|**********
47|**********
48|*****
49|EOM;
50|   mb_send_mail($to, $title, $body, $header);
51| }
52|?>
▶ソースを表示する
3行目の setlocale 関数は、CSV ファイルに日本語などマルチバイト文字が含まれる場合に fgetcsv() 関数で配列に入れるとき、日本語の文字が消えるまたは一部消えることがあるために記述します。
これは PHP5~起こる現象で PHP4 以下では必要のない記述です。
文字コード変換( SJIS ⇒ UTF-8 )が必要なければ記述も必要ないでしょう。
Windows サーバでは PHP5 でも発生しないことがあるようです。
fgetcsv() 関数の文字コードの指定は、mb_language("ja") や mb_internal_encoding("UTF-8") ではできません。
6~7行は3行目で setlocale 関数を設定しているので必要ないのかと思うのですが文字化けを起こしてしまうので設定しています。
ご利用の環境で表示に問題があれば調整してみてください。
10行目は送信に必要なメールアドレスを設定します。ドメインと違うアドレスを設定するとエラーになります。
11行目では、$title にメールのタイトルを設定します。
15行目では送信情報となる CSV ファイルを指定します。
16行目でそのファイルを file_get_contents 関数で $data の変数に格納しています。
19行目では $data に格納されたものを文字コード変換しています。
23~27行、30~33行は一度、CSV ファイルを読み込み一時ファイルとして CSV ファイルを作成しています。
SJIS のCSV ファイルを UTF-8 の PHP ファイルで扱うには、この処理をしないと上手く読み込めないようです・・・。
31行目では $CSV に一時ファイルのデータを配列として格納しています。
36~52行はメルマガを配信する為の処理です。
37行目の $to にはリストに対応したアドレスを代入しています。
38行目の $name には名前を代入しています。
39~49行はヒアドキュメントでメールマガジンの内容を記述しています。
改行などはそのままメール内容に反映されますので体裁を整えて設定してください。
50行の mb_send_mail 関数でリストにあるアドレス宛に送信を繰り返しています。
送信テストをする場合には複数のメールアドレスを用意してお試しください。
Mailmagazine.php のファイルを読み込むと一連の処理が実行されます。
単純にメール送信をするプログラムですが、CSVファイルの読み込み(ロード)についての対応が学べるのでプログラムでもあります。
一度、チャレンジしてみてください。

>>>警告が出る場合

|