いろいろと、PEARのMail_Queueで苦労させられたので忘れないようにここに書いておきます。
まず、PEARはPHPの便利なライブラリ群です。Excelへの出力から、ページング処理や、CGIフォームを簡単に作れたりと、かなり使えるツールが詰まったライブラリの総称です。
PEARのサイト
pearコマンドが使える場合は、pear listで現在インストールされているモジュール一覧が出力される(ものすごい時間かかる)ので、そこから必要なモジュール名を調べて足りない場合は
pear install Mail
(Mailモジュールのインストール)
Upgradeの場合は、
pear upgrade Mail
とすれば、勝手にインストールしてくれます。
そもそもpearコマンドがない場合もあると思いますので、このあたりを参考にしてください。
もちろん、pearっていう名前のモジュールがあるわけではないので、ひとつひとつ自分でダウンロードしてくればそれだけで独立して使うことができます。
たとえば、Mail_Queueは、ここからダウンロードできますので、ダウンロード、展開して require(include)して使えばいいと思います。
一番書いておきたいのは、Mail_Queueです。
問題がたくさんありますので、列挙しておきます。
Mail_Queueは、膨大な数のメールを効率よく送信できるとても便利なツールだけど、結構バグがあるらしい。。
■問題
1. いろんなサイトで出回っているだろうサンプルはJIS(ISO-2022-JP)でエンコードすれば、漢字が使えます、とかいっているんだけど、実際は文字化けして使い物にならない。
2. Bcc、Ccがそのまま使えない。ヘッダーとしては出力されるが実際には使えない。
■解決策
1.これについては、すでに解決した人がいらっしゃいます。
こちらをご覧ください。単なるバグのようですが。。
ちなみに、私はEUC-JPをエンコード指定しました。本当はいけないと思いますし、昔のメーラーでは恐らく動かない可能性もありますが、取り急ぎこれで解決しました。
— 追記:2006/08/15 —
Bodyを下記のようにしても、どうしても文字化けしちゃっていたのですが、
$bd1 = mb_convert_encoding($bd1,”ISO-2022-JP”,”EUC-JP”);
下記の設定を加えることで、文字化けせずに送ることが出来ました。
$body=$o_mime->get(array(“text_charset”=>”ISO-2022-JP”,”head_charset”=>”ISO-2022-JP”,”text_encoding”=>”base64″));
text_encodingにbase64を設定します。恐らく、通常のメールは7bitだと思われます。推測ですが、Mail_QueueのライブラリでBodyを格納するときに、どこかで文字が化けちゃっているのではないかと。。なので、化けようがないbase64でエンコードしたときだけうまくいっているのではないかと思います。
ちょっと昔は、base64をサポートしていませんというメーラーがたくさんあったような気がしますが、この昨今、そんなことは少なくなっている・・だろう。。
2.こ、これです。問題は。。。。。
 header = array(‘Cc’=>’aa@co.jp’, ‘Bcc’=>’hhh@com’)
 などとして実際に記述して、キューにためてそのあと送信もできるのですがCc、Bccは機能せず。。。で、かなり調べたのですがどこをどうみても、headerにかけばうまくいくという記述。。。
で、しばらく調べていくうちに、本家PEARのサイトに同様の問題で悩んでいる人発見。
バグ5987
なるほど、同じですねと。なにやら、ご自分でパッチをあてたと書いてある。。同じようにやってみるも、ぜんぜん解決してない。。
うーむ、ということで、さらに調べるとというか、上記にも書いてあるのですが、CVSディレクトリから最新版をとってくれば動くよ!という情報をこれまた発見。
PEAR CVS
上記から最新版を1個1個手で取ってきて、インストールするもやっぱり結果変わらず。。。(実際は、Mail_Mime, Mail_Queueが必要)
で。。もしかしたら、そういう知識があれば気づくのかもしれないけど。。
recipientが怪しい。もしかしたら、ここの直接書けば行くんじゃないか?
結果はビンゴでした。
$to1 = “To: aaa@gmail.com;”;
$to1 .= “Cc: bbb@bbb.co.jp;”;
$to1 .= “Bcc: ccc@ccc.com,fff@aaa.com”;
(複数設定する場合は、コンマで区切る。Bccの記述の最後にセミコロンは書かない)
$result=$o_queue->put(“aaa@hotmail.com”,$to1,$headers,$body);
こうやったら、うまくいきました。
二日ぐらい思いっきり考えましたよ。。
もしかしたら、常識なのかもしれない。メールについて詳しい知識があれば、こんなに悩まずにすんだのかもしれないが。。
■結論
PEARのサイトやほかのサイトが書いている手法で、ヘッダだけにCc,Bccを書いてもうまくいかない。あくまでも、情報として書かれるだけで実際に稼動しないので、これに加えて、recipientに同じ情報(Bcc,Cc)を書いてあげる。
いやー疲れた。
同じ現象で悩んでいる人、いませんか?
いたら、コメントしてくれるととってもうれしいです。
こういう事を書いておかないと、同じ悩みの人が同じ時間を無駄に使ってしまう可能性があり、それは不幸ですよね。
いやーよかった。。。っていうか、無知だっただけか。。