こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

PEAR の Mail/Queue.php で文字化け。

タイトル通り、文字化けが解消できません。
いつも他の事は全てUTF-8 でやっているのですが
メールは [ISO-2022-JP] を使わないといけないみたいですね。

PEAR を使わないで [mb_send_mail] を使っていた時は何もトラブルは無かったのですが。
以下、長いですが宜しくお願いいたします。

CENTOS 5
Mysql 5.0.45 MySQL の文字セット: UTF-8 Unicode (utf8)
PHP 5.0
PEAR 以下の通りで運用しています。
DB 1.7.13 stable
Mail 1.1.14 stable
Mail_Mime 1.5.2 stable
Mail_Queue 1.2.2 stable
Mail_mimeDecode 1.5.0 stable
PEAR 1.4.9 stable

メールを複数人に送る為に [Mail/Queue.php] を
利用しようとしています。
(ほぼ、サンプルで公開しているものをそのまま使わせてもらっています。)
http://php.atpedia.jp/pear/ja/package.mail.mail-queue.mail-queue.tutorial.html

メールを作成するPHPは、[UTF-8] にしています。
メールをデータベースに入れるときに [ISO-2022-JP] に変換しています。

取り出して送信する時にも変換しなくてはいけないのか?
初めてPEARを使うのもあって、動作自体が良く分からない為
文字化けに対処できずにいます。

お分かりになる方、宜しくお願いいたします。


キューに入力前に本文作成用ページ

このページは、UTF-8 です。
$subject $message 送信対象のID をこのページから下のページに [POST] で送信


キューに入力用ページ *サンプルを元に

<?php
mb_language("Ja");
mb_internal_encoding("utf8");

include './config.php';

/* db_options と mail_options をここで使用する */
$mail_queue =& new Mail_Queue($db_options, $mail_options);

/*-----PEARでデータベースに接続しているが理解できないので、再度接続。。 ココから---------*/
require_once("dbini.php");
$con = mysql_connect($DBSERVER, $DBUSER, $DBPASSWORD);
$selectdb = mysql_select_db($DBNAME, $con);
mysql_query('set character set utf8');
/*----------------------------------データベースに接続 ココまで----------------------------*/

/*----------------------------------この変換のタイミングがおかしいのでしょうか?-----------------*/
$subject = mb_encode_mimeheader($subject,'ISO-2022-JP');
$message = mb_convert_encoding($message,'ISO-2022-JP','UTF-8');
/*----------------------------------ここまで変換-----------------------------*/
$sql = "SELECT * FROM member WHERE **************";
$rst = mysql_query($sql, $con);
//件数を数える
$recmax = mysql_num_rows($rst);

//ループでID、名前、メールアドレスを取り出す
while($rows = mysql_fetch_array($rst)){

$id = $rows["customerID"];
$name = $rows["name"];
$mail = $rows["mail"];


$from = '***@*******.net';
$to = $mail;

$hdrs = array( 'From' => $from,
'To' => $to,
'Subject' => $subject );

/* 有効なメールを構築するため、Mail_mime() を使用する */
$mime =& new Mail_mime();

//文字コード変換する

$mime->setTXTBody($message);
$body = $mime->get();
$hdrs = $mime->headers($hdrs);

/* メッセージをキューに追加する */
$mail_queue->put( $from, $to, $hdrs, $body );
}
$con = mysql_close($con);
?>


送信用ファイル *サンプルそのまま
<?php
include './config.php';
/* スクリプトがコールされるたびに何通のメールを送信するか */
$max_amount_mails = 50;
/* 設定から db_options と mail_options を再び使用する */
$mail_queue =& new Mail_Queue($db_options, $mail_options);
/* メッセージを実際に送信する */
$mail_queue->sendMailsInQueue($max_amount_mails);
?>

投稿日時 - 2009-06-02 21:42:32

QNo.5011864

すぐに回答ほしいです

質問者が選んだベストアンサー

メッセージをキューに追加する前の部分の記述ですが、
こちらは、Mail_mimeクラスとのことで、
恐らく、通常の文字列から有効なmimeヘッダを作成するものと思います。
それに加えてその前段階で、mb_encode_mimeheaderを行っておられる様子ですので、まずはそちらをはずしたほうがよいかと思います。(多重でエンコードを行ってる)

その上で、$message/$subjectはUTF-8からISO-2022-JPへ変換(中ほどの$message=mb_convert_encodingはそのままで、$subjectをmb_encode_mimeheaderからmb_convert_encodingへ書き換え)
$mime->get()
の部分を、
$param = array();
$param["text_charset"] = 'ISO-2022-JP';
$mime->get($param)
と変更し、getに引数を与える

と、これで文字化けは解消されそうです。
http://peardoc.xole.net/package.mail.mail-mime.get.html
こちらが、Mail_mime::get()メソッドのマニュアルになります。

いかがでしょうか。

投稿日時 - 2009-06-02 22:12:28

お礼

ありがとうございました。

何事も無かったかのように、ピシッと動きましたm(__)m
とりあえずはソースまで書いていただいたので、そのまま書き換えて
うまく動く事を確認後、教えていただいたマニュアルとソースを見ています。

本当にありがとうございました。

投稿日時 - 2009-06-02 22:40:22

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問