▼ ログ機能
ログ機能があれば、万が一SPAMメールの踏み台にされたとしても、早期に気づくことができます。
常時管理者にBccモードもよろしければご利用ください。
$mailには、Qdmailのインスタンス(オブジェクト)が入っているものとします。
ログレベルの設定
$mail->logLevel( n );
n | 機能 |
0 | ログを出力しない(デフォルト) |
1 | シンプルタイプ(送信した または失敗した メールアドレスのみ) |
2 | ヘッダー情報も含むエラーログ |
3 | メール本文も含めたエラーログ |
ログファイルのパス、ファイル名の設定
$mail->logPath( 'パス' ); // デフォルトは、'./' $mail->logFilename( 'ファイル名' ); // デフォルトは、'qbmail.log'パスは相対パスでも、絶対パスでも構いません。Qdmail内部では、$fp = fopen( $path.$filename , 'a' );などという形で使用します。
- TB-URL http://hal456.net/qdmail/036/tb/
▼ エラーログ機能
$mailには、Qdmailのインスタンス(オブジェクト)が入っているものとします。
エラーログレベルの設定
$mail->errorlogLevel( n );
n | 機能 |
0 | エラーログを出力しない(デフォルト) |
1 | シンプルタイプ(エラーメッセージのみ) |
2 | ヘッダー情報も含むエラーログ |
3 | メール本文も含めたエラーログ |
ログファイルのパス、ファイル名の設定
$mail->errorlogPath( 'パス' ); // デフォルトは、'./' $mail->errorlogFilename( 'ファイル名' ); // デフォルトは、'qbmail_error.log'パスは相対パスでも、絶対パスでも構いません。Qdmail内部では、$fp = fopen( $path.$filename , 'a' );などという形で使用します。
エラー時に何か処理をさせたい場合は、エラー処理をご参照下さい。
# 2010年04月08日(木) 午後4時50分
いつも大変ありがたく使わせていただいております。
動作には全く影響ないのですが、、
デフォルトログファイル名は、q'd'mail_error.logではないでしょうか?
実際の出力も「qb」となっておりました。
ご確認宜しくお願いいたします。
- TB-URL http://hal456.net/qdmail/034/tb/
▼ エラー処理
- Qdmailが発するエラー
- 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年11月16日(日) 深夜1時57分
errorStatment は、
errorStat'e'ment の typo ですか?
# 2008年11月17日(月) 午前7時12分
マニュアルのtypoではありません。というか、ソースでタイポしたものが、そのままになっているので、errorStatmentで呼び出してください。
# 2008年11月17日(月) 午前11時51分
了解。
別な typo では allwaysBcc() てのがありました。
多分 alwaysBcc() を意図されていたと思います。
# 2008年11月17日(月) 午後9時34分
英語が弱いのですいません。
# 2008年11月18日(火) 午前11時36分
先日はありがとうございました。
先日ご教授いただきました部分を改修し、
ログを出力するようになりましたら、
メール送信は、うまくいくようになりました。
もう1つ質問をさせて下さい。
下記のようにメール送信をしているのですが、
時々、メールが重複して受信してしまう、という現象が発生しています。
ログを確認しますと、
重複して送られている記録は残されておらず、
どのように調査をすればよいか、悩んでいます。
現在、重複メールを受信した方から、
メールのヘッダー情報などを取得してもらっています。
メッセージIDなどを確認してみようかと・・・。
お忙しいところ、申し訳ありませんが、
ご確認を宜しくお願い致します。
■ユーザー1~5まで、登録されているメールアドレスにメールを送信するようにしています。
$param = array(
'host'=> 'XXXXXXXXXXXXXXXX',
'port'=> 25,
'from'=> $mailaddress,
'protocol'=>'POP_BEFORE',
'pop_host' =>'YYYYYYYYYYYYYYYY',
'pop_user' => $pop_user,
'pop_pass'=> $pop_pass
);
$mes =mb_convert_kana($mes,"KVa");
if($user_email_1)
{
$mail1 = & new Qdmail();
$mail1 -> smtp(true);
$mail1 -> smtpServer($param);
$mail1 -> logLevel(1);
$mail1 -> errorlogLevel(1);
$mail1 -> errorDisplay( false );
$mail1 -> smtpLoglevelLink( true );
$mail1 -> to($user_email_1, null, false );
$mail1 -> subject($subject);
$mail1 -> from($mailaddress);
$mail1 -> text($mes);
$return_flag = $mail1 -> send();
}
if($user_email_2)
{
$mail2 = & new Qdmail();
$mail2 -> smtp(true);
$mail2 -> smtpServer($param);
$mail2 -> logLevel(1);
$mail2 -> errorlogLevel(1);
$mail2 -> errorDisplay( false );
$mail2 -> smtpLoglevelLink( true );
$mail2 -> to($user_email_2, null, false );
$mail2 -> subject($subject);
$mail2 -> from($mailaddress);
$mail2 -> text($mes);
$return_flag = $mail2 -> send();
}
if($user_email_3)
{
$mail3 = & new Qdmail();
$mail3 -> smtp(true);
$mail3 -> smtpServer($param);
$mail3 -> logLevel(1);
$mail3 -> errorlogLevel(1);
$mail3 -> errorDisplay( false );
$mail3 -> smtpLoglevelLink( true );
$mail3 -> to($user_email_3, null, false );
$mail3 -> subject($subject);
$mail3 -> from($mailaddress);
$mail3 -> text($mes);
$return_flag = $mail3 -> send();
}
if($user_email_4)
{
$mail4 = & new Qdmail();
$mail4 -> smtp(true);
$mail4 -> smtpServer($param);
$mail4 -> logLevel(1);
$mail4 -> errorlogLevel(1);
$mail4 -> errorDisplay( false );
$mail4 -> smtpLoglevelLink( true );
$mail4 -> to($user_email_4, null, false );
$mail4 -> subject($subject);
$mail4 -> from($mailaddress);
$mail4 -> text($mes);
$return_flag = $mail4 -> send();
}
if($user_email_5)
{
$mail5 = & new Qdmail();
$mail5 -> smtp(true);
$mail5 -> smtpServer($param);
$mail5 -> logLevel(1);
$mail5 -> errorlogLevel(1);
$mail5 -> errorDisplay( false );
$mail5 -> smtpLoglevelLink( true );
$mail5 -> to($user_email_5, null, false );
$mail5 -> subject($subject);
$mail5 -> from($mailaddress);
$mail5 -> text($mes);
$return_flag = $mail5 -> send();
}
if($mailaddress)
{
$mail = & new Qdmail();
$mail -> smtp(true);
$mail -> smtpServer($param);
$mail -> logLevel(1);
$mail -> errorlogLevel(1);
$mail -> errorDisplay( false );
$mail -> smtpLoglevelLink( true );
$mail -> to($mailaddress, null, false );
$mail -> subject($subject);
$mail -> from($mailaddress);
$mail -> text($mes);
$return_flag = $mail -> send();
}
# 2008年11月19日(水) 深夜1時16分
SMTPのログをみて、重複して送信されていないのであれば、受信側の問題と思います。
ただし、重複といっても、メールのtoを重複して登録しているか、$user_email_2と他の$user_email_1などが同じメールアドレスが入っていないかなどを確認する必要があるかと思います。
どのような場合にメールが2つ送られるのか、状況とその変数の中身がわからないと、こちらもお手上げです。
問題の切り分けをしてみてください。
ただちょっと、あまりに冗長なソースコードような気がしますが。。。。。。
# 2009年04月01日(水) 深夜3時02分
Qdsmtpを使いeasyDecoで携帯向けにHTMLメールを送信しています。わざと存在しないメールアドレスを使って送信してもeasyDecoの返り値はtrueです。この場合はエラー検出しfalseを返してほしいのですがどうしたらよいでしょうか?今とても困っています。よろしくお願いいたします。
# 2009年04月08日(水) 午前8時49分
第三者中継を行っている限り、存在しないメールアドレスを送信してもtrueとなります。
ただし、当該SMTPサーバーが管理するドメインであれば、当該SMTPサーバーがエラーを返すはずです。その場合はfalseとなります。
SMTP送信の方法には複数あります。相手先のSMTPサーバーを探して、直接当該SMTPサーバーにQdmailがアクセスする方法であれば、wankoさんの希望も叶うかと思いますが、Qdmailはそのようにしていません。それは、相手先のサーバーを探すのが結構面倒で、安定したプログラムを作るのが難しいからです。なので、信頼できるSMTPサーバーに第三者中継をしてもらうことで安定的な送信を行うようになっています。
特にデコメの場合は、直接相手先サーバーに直接送信する場合、携帯キャリアが拒否する可能性がとても高いのです。皆さんのサーバー環境によるのですが。そのすべてのサーバー環境を再現することができない以上、そしておそらくは拒否される可能性が高い以上、特にデコメにおいてwankoさんの要望を実現することはできません。
UndeliverMailが返ってくるかどうかは、中継または相手方のSMTPサーバーの設定の問題であり、こちらではどうしようもできません。
# 2009年04月08日(水) 午前8時52分
なお、UndeliverMailは、通常return-pathヘッダのアドレスに返ってくるかと思いますので、それを設定しておくことは、有用かと思います。
# 2009年05月17日(日) 午後0時54分
CakePHPメールコンポーネントとして利用させていただいています。
エラーを画面に出力しないようにしたく、errorDisplay( false )を設定しました。
errorDisplay( true )の設定と比較して、以下のエラーメッセージは出力されなくなりましたが、その他のエラーメッセージは出力されてしまいます。
<<出力されなくなったエラーメッセージ>>
Qdmail error: recipient Header is not exsit line line -> 2072
Qdmail error: Send Error line -> 2115
その他のエラーメッセージは、Qdmailではなく、CakePHPが出力しているもので、どうしようもないということでしょうか?
もしくは設定方法が誤っているのでしょうか?
教えてください。
<<ソース>>
$this->Qdmail->to($this->to); //空白を事前に設定
$this->Qdmail->subject($this->subject);
$this->Qdmail->from('system@hoge.org', 'hoge' );
$this->Qdmail->cakeText($this->content, $this->template, $this->layout);
$this->Qdmail->toSeparate(true);
$this->Qdmail->errorDisplay(false);
$this->Qdmail->send();
※ エラーを発生させるために送信先のメールアドレスは、空白を設定して確認をしています。
<<エラー画面>>
Notice (8): Undefined offset: 0 [APP\controllers\components\qdmail.php, line 1933]
Qdmail error: Qdmail Version 1.2.6b ,PHP Version 5.2.8
Qdmail error: OS WINNT ; PHP Version 5.2.8 ; Qdmail version 1.2.6b
php.ini status: mb_language = neutral ; mb_internal_encoding = ISO-8859-1 ; mb_detect_order = ASCII,UTF-8
Qdmail Status debug: 0, log: 0, errorlog: 0
Qdmail error: Tyr Varidate Error by regex preg_match('/[^@]+@[^@]+/') the address is -> line -> 3699
Qdmail error: Illegal Mail AddressSystemValidete Address Method line -> 2770
# 2009年05月20日(水) 午後2時37分
easyTextでのエラー処理についてですが、説明があった下記のコードについて。
$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');
}
上記の方法を試してみたのですが、@抜けでエラー検出→管理者へ送信することは出来ましたが
.co.jp や .ne.jp などの"."抜けではエラーが検出されませんでした。
検出する方法はありますでしょうか?
# 2009年05月20日(水) 午後2時49分
補足ですが、ユーザーのメールアドレスの入力ミスを検出し、管理者に「自動返信が届いていません。ユーザーの入力ミスの可能性があります。」的なメールを送信したいので質問させてもらいました。
# 2012年12月14日(金) 午後4時57分
関数型での「エラーを画面に出力しない」方法は?
# 2017年07月13日(木) 午前11時55分
もう開発は止まっているようですが、備忘録的に
◆Qdsmtpのエラーが取得できない
Qdmail と Qdsmtp のエラーがリンクしていないため
errorStatment では Qdmail 側のエラーしか取得しない。
$this->error_stack
$this->smtp_object->error_stack ← これが取得できない
◆「PHP 5.4.16」では、errorDisplayでのオプション設定が機能しない
falseでも画面にecho表示されるが、そのバージョンからなのかは不明
それぞれのモジュールで「errorRender」にエラー表示機能があるので
そこのecho処理をコメントアウトしてしまうのが一番らく。
# 2017年07月13日(木) 午後0時00分
あまり深く追わなかったが、errorDisplayオプションもQdsmtp とリンクしていないってだけかもしれない
# custar 2008年12月19日(金) 午前11時56分
数ヵ月後、コードを見ると分からなくなるので、n = 0,1,2,3 ではなく、PHP
エラーレポートの E_ALL, E_ERROR のように見れば分かる形が嬉しいですね。
自分で定義してもいいですが、ライブラリー側でもってくれると、管理しやすい。
0 ... L_NOLOG .... ログを出力しない
1 ... L_SEND ..... シンプルタイプ(送信した または失敗した メールアドレスのみ)
2 ... L_HEADER ... ヘッダー情報も含むエラーログ
3 ... L_BODY ..... メール本文も含めたエラーログ
みたいに。
# spok 2008年12月20日(土) 午前8時01分
custarさん
ご提案ありがとうございます。確かにそうですね。次回更新時に対応しようと思います。
# mmmm 2009年09月30日(水) 午後0時32分
初心者なもので「Qdmailのインスタンス(オブジェクト)が入っているものとします」という意味がよく分からないのですが、qdmail.phpで「var $log_level= 1 ;」にしてログを取ることが出来るようになりました。
ここにある「$log_level_max = 3 ;」とはどのような意味になるのでしょうか。
# yuipapa 2011年05月22日(日) 深夜1時30分
ログレベル3でメール送信を行い、ログファイルを確認すると、ヘッダ情報までしか記録されていませんでした。
メール自体は、本文付きで飛んできています。
本文中に「http://~」を3行程含むメールを携帯に送信しようとしていて、1行だけならばメール送信できるのに、2行以上だとメールが飛ばないので、ログを確認しようとしています。