ようこそゲストさん

Qdmail - PHP::Mail Library , Quick and Detailed for Multibyte

エラー処理

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を実装したいと思いますが。。。

# custar 2008年11月16日(日) 深夜1時57分

errorStatment は、
errorStat'e'ment の typo ですか?

# spok 2008年11月17日(月) 午前7時12分

マニュアルのtypoではありません。というか、ソースでタイポしたものが、そのままになっているので、errorStatmentで呼び出してください。

# custar 2008年11月17日(月) 午前11時51分

了解。

別な typo では allwaysBcc() てのがありました。
多分 alwaysBcc() を意図されていたと思います。

# spok 2008年11月17日(月) 午後9時34分

英語が弱いのですいません。

# TW 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();
}

# spok 2008年11月19日(水) 深夜1時16分

SMTPのログをみて、重複して送信されていないのであれば、受信側の問題と思います。
ただし、重複といっても、メールのtoを重複して登録しているか、$user_email_2と他の$user_email_1などが同じメールアドレスが入っていないかなどを確認する必要があるかと思います。

どのような場合にメールが2つ送られるのか、状況とその変数の中身がわからないと、こちらもお手上げです。
問題の切り分けをしてみてください。

ただちょっと、あまりに冗長なソースコードような気がしますが。。。。。。

# wanko 2009年04月01日(水) 深夜3時02分

Qdsmtpを使いeasyDecoで携帯向けにHTMLメールを送信しています。わざと存在しないメールアドレスを使って送信してもeasyDecoの返り値はtrueです。この場合はエラー検出しfalseを返してほしいのですがどうしたらよいでしょうか?今とても困っています。よろしくお願いいたします。

# spok 2009年04月08日(水) 午前8時49分

第三者中継を行っている限り、存在しないメールアドレスを送信してもtrueとなります。
ただし、当該SMTPサーバーが管理するドメインであれば、当該SMTPサーバーがエラーを返すはずです。その場合はfalseとなります。

SMTP送信の方法には複数あります。相手先のSMTPサーバーを探して、直接当該SMTPサーバーにQdmailがアクセスする方法であれば、wankoさんの希望も叶うかと思いますが、Qdmailはそのようにしていません。それは、相手先のサーバーを探すのが結構面倒で、安定したプログラムを作るのが難しいからです。なので、信頼できるSMTPサーバーに第三者中継をしてもらうことで安定的な送信を行うようになっています。

特にデコメの場合は、直接相手先サーバーに直接送信する場合、携帯キャリアが拒否する可能性がとても高いのです。皆さんのサーバー環境によるのですが。そのすべてのサーバー環境を再現することができない以上、そしておそらくは拒否される可能性が高い以上、特にデコメにおいてwankoさんの要望を実現することはできません。

UndeliverMailが返ってくるかどうかは、中継または相手方のSMTPサーバーの設定の問題であり、こちらではどうしようもできません。

# spok 2009年04月08日(水) 午前8時52分

なお、UndeliverMailは、通常return-pathヘッダのアドレスに返ってくるかと思いますので、それを設定しておくことは、有用かと思います。

# swing 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

# kado 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 などの"."抜けではエラーが検出されませんでした。
検出する方法はありますでしょうか?

# kado 2009年05月20日(水) 午後2時49分

補足ですが、ユーザーのメールアドレスの入力ミスを検出し、管理者に「自動返信が届いていません。ユーザーの入力ミスの可能性があります。」的なメールを送信したいので質問させてもらいました。

# bbit 2012年12月14日(金) 午後4時57分

関数型での「エラーを画面に出力しない」方法は?

# celaeno 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処理をコメントアウトしてしまうのが一番らく。

# celaeno 2017年07月13日(木) 午後0時00分

あまり深く追わなかったが、errorDisplayオプションもQdsmtp とリンクしていないってだけかもしれない


#  非公開コメント   
  • TB-URL  http://hal456.net/qdmail/033/tb/
  • エラーログ機能 Qdmail - PHP::Mail Library , Quick and Detailed for Multibyte spok
    Qdmailではエラーログを出力する機能があります。$mailには、Qdmailのインスタンス(オブジェクト)が入っているものとします。エラーログレベルの設定 $mail->errorlogLevel( n ); n機能 0エラーログを出力しない(...