エラーログ機能

2008/06/29 未分類 spok
Qdmailではエラーログを出力する機能があります。
$mailには、Qdmailのインスタンス(オブジェクト)が入っているものとします。

エラーログレベルの設定

  $mail->errorlogLevel( n );
n機能
0エラーログを出力しない(デフォルト)
1シンプルタイプ(エラーメッセージのみ)
2ヘッダー情報も含むエラーログ
3メール本文も含めたエラーログ
*ログレベル2,3は、メールアドレス、本文等の情報を含みますので、ログの管理は、一般の人がアクセスできないようにユーザー自身が管理する必要があります。

ログファイルのパス、ファイル名の設定

  $mail->errorlogPath( 'パス' ); // デフォルトは、'./'
  $mail->errorlogFilename( 'ファイル名' );  // デフォルトは、'qbmail_error.log'
パスは相対パスでも、絶対パスでも構いません。Qdmail内部では、$fp = fopen( $path.$filename , 'a' );などという形で使用します。

エラー時に何か処理をさせたい場合は、エラー処理をご参照下さい。

エラー処理

2008/06/29 未分類 spok
Qdmailでは、エラーは2種類あります。
  1. Qdmailが発するエラー
  2. PHP本体が発するエラー(PHPの文法間違い等)

Qdmailが発するエラー

Qdmailのエラーについては、内部で処理を行いエラーを画面に出力します。
このエラーメッセージは画面に出力しないこともできます。その場合に、エラーが起こったかどうかを判別するメソッドも用意してあります。
エラーを画面に出力しない
$mail には、Qdmailのインスタンス(オブジェクト)が入っているものとします。
  $mail -> errorDisplay( false );
エラー内容を把握する
メール送信に失敗した場合、easyText() や send()メソッドの返り値が false となります。
また、そのエラーの内容は、次のメソッドで取得できます。
  $mail -> errorStatment();
このメソッドは、以下の返り値をとります。
array()(空の配列)エラーがない時。or エラーを画面出力する設定になっているとき。
エラー内容が代入された配列エラーを画面に出力しない設定の時 & エラーが発生したとき
したがって、このような使い方もできます。
(細かい設定は省略します。)

例)
 $mail->errorDisplay(false);
 if(!$mail ->easyText('to@example.com','●●さん','タイトル','メッセージ','from@example.com')){
    // エラー処理
    $message = print_r($mail->errorStatment(false),true);
    @mail('admin@example.com','ErrorQdmail',$message,'From: from@example.com');
 };
ここでは、送信エラーがあった時に、PHP標準のmail関数を使って、エラーメールを管理者に送付するようにしています。Qdmailエラー時に、Qdmailでメール送信するのもナンですし、mail関数そのものは日本語を通さないので、このような例にしてみました。
エラー処理の内容は、ユーザーの事情に合わせて変更してみてください。
なお、エラー時にログを出力したい、というのであれば、Qdmailのエラーログ処理もご覧下さい。

PHP本体が発するエラー

PHP本体が発するエラーについては、Qdmailは何らの処理を行いません*1
PHPのエラー処理-PHP SPOTエラー処理-PHPマニュアルなどを参考にご自分でエラー処理をお願いいたします。

*1 : PHP5専用になった時には、try-catchを実装したいと思いますが。。。

任意のヘッダーの追加

2008/06/28 未分類 spok
ToやFromは、$mail->to()や$mail->from()で、ヘッダーを設定しますが、Qdmailでは、任意のヘッダーを追加することもできます。
to,from,cc,bcc,reply-toは、このaddHeaderメソッドは使用しないで、それぞれのコントロールメソッド、$mail->to();などをお使いください。

任意のヘッダーの設定(追加)

$mailには、Qdmailのインスタンスが入っているものとします。
$mail -> addHeader( 'header_name' , 'value' );

例) Return-Path を設定する

(消去しました)
この方法で、Return-Pathを指定しても無視されますので推奨しません。

例) X-sender を設定する

$mail -> addHeader( 'X-sender' , 'hoge@example.com' );

ユーザーが設定した addHeader の値を取得する。

addHeaderで設定したもののみを、返り値として返します。(to,from等は返さない)
$mail -> addHeader();

ユーザーが設定した addHeader を消去する

$mail -> addHeader( 'clear');

注意

$mail->easyText()を使用した場合でも、addHeaderの中身は保持されています。

半角カナの送信

2008/06/23 未分類 spok
インターネットの日本語メールでは半角カナは使わないのが一般的です。
なぜなら、文字セットiso-2022-jpでは半角カナをサポートしていないからです。

しかし、それでも半角カナを送りたい場合もあるでしょう。以下の方法を試して下さい。
  1. 本文を UTF-8 , BASE64 エンコードにする。参考 参考2
  2. mb_convert_kanaを使ってQdmailに渡す前にユーザーで対処する。mb_convert_kana-PHPマニュアル
  3. Qdmail0.8.7a以降を$mail->kana(true);モードで使う。または、Qdmailソースコードのvar $kana = false; を var $kana = true;に変更して使う。
1の方法は、悪くありません。他の言語やら、機種依存文字でもなんでもOKです。(のはずです)。この場合、UTF-8 & BASE64 にしてください。UTF-8のみ、または、iso-2022-jp & BASE64 では、たぶん文字化けします。
ただし、ヘッダーもUTF-8にした場合、au携帯の一部の端末では対応していないため文字化けするかも知れません。(件名や宛先等。)
UTF-8 & BASE64 であれば、下記の$kana = true;にする必要はありません。半角カナをそのまま送信できます。
もっとも一部のau機種対策としては、 「本文はUTF-8 + BASE64」「ヘッダーはiso-2022-jpで、$kana = true」とするのが、最強かと思います。


2の方法も悪くありません。半角カナを、全角カナに変換するようにするのです*1
ただし、mb_convert_kanaは、濁点も一文字として数えますので、スペックは、「スペック」でなく「スヘ゜ック」となってしまいます。(この問題は、0.8.8aにて解消の予定です。)


3の方法も悪くはありませんが、2と同じ問題点は残っています。また、半角カナは解決しても、機種依存文字は、これだけは解決しないでしょう*2
Qdmailで対応させる場合には、下記のようにします。
$mailには、Qdmailのインスタンス(オブジェクト)が入っているものとします。
$mail->kana(true);
qd_easy* を使用している場合には、ソースコードを以下のように変えて下さい。
エディタなどで、「$kana」を検索し、$kanaの定義部分を変更します。
var $kana = true;
var $kana = true;をデフォルトにしようかとも考えたのですが、以下の点で見送りました。
  • mb_convert_kana関数の他の言語体系への影響がよくわからない(マニュアルには日本語しか使えないと記載があるが、他の言語が混ざった場合のことに言及していない)
これが解決すれば、いつかデフォルトでtrueにするかも知れません。

1の方法のまとめ

本文UTF-8 + BASE64 , ヘッダーはiso-2022-jpで、$kana = ture にするには、以下のようにします。
OOP方式で送信している場合
$mail -> charsetBody( 'utf-8' , 'base64' ) ;
$mail -> kana(true);
Qdmailソースコード改変で対応する場合
下記のように変数定義を変更してください*3
var $charset_content = 'utf-8';

var $content_transfer_enc_text	= 'base64';
var $content_transfer_enc_html	= 'base64';

var $kana = true;

*1 : したがって、半角カナを送信できるわけではありません

*2 : 機種依存文字対策は、UTF-8+BASE64が最強です。

*3 : ソースコード内を変数名で検索してください。