smtpのセッティングが上手く行かず、XPのローカル環境では、いまだメール送信に成功していません。そのおかげでバグが分かりました。
(この記事は1.1についてです。)
(この記事の内容で、タイムアウトになるというのは間違いでした。厳密に言うと、stmpでの送信で、タイムアウトはサーバーとのコネクション時にしかチェックされておらず、メール送信時にチェックしていないため、ここでハングした場合、PHPのタイムアウトに到達してしまい、エラーが起きています。)
(追記:回避法としては、packages/email/classes/email/driver/smtp.phpを開き、fgetとfputの直前にstream_set_timeout($this->smtp_connection, タイムアウト秒);を入れるだけです。本来はこのあとにタイムアウトかどうか判断する処理が必要ですが、別の何かに引っかかり、結果例外を投げてくれるので、見かけ上は、正しく動作するようになります。)
ドキュメントによるメール送信の例です。
try {
$email->send();
}
catch(\EmailValidationFailedException $e) {
// バリデーション失敗
}
catch(\EmailSendingFailedException $e) {
// ドライバーがメールを送れなかった
}
まあ、私のプログラムはこの通りにコーディングしているのです。。今までセッテングが悪いのは2つの目のEmailSendingFailedExceptionで捕まれられていました。もしくは、サーバー側で受け取っり、キューに貯めているのか、メールはプログラムからは正常に送信したということに、なっていました。
色々手法を変え、再度セッティングに挑戦したら、少しは進んだのか、タイムウトになるようになりました。(ちなみに、本番の共有サーバー場では、何の問題もなく送信できていますから、コードに問題はありません。)
変化が起きて嬉しがっていましたし、本番環境で動いているので、問題ないと見過ごしていました。最近、時々動作させて、これがエラーになるので、うざったくなり、手を入れようとしたら、私のせいでなく、EmailSendingFailedExceptionがタイムアウトを受け取っていないという、パッケージのミスだと気づきました。
結構、タイムアウトの状況を作り出すというのは難しいからでしょう。テストしていないんですね。でも、メールのコンフィグファイルには、タイムアウトの項目あるんだし、形だけでもテストしていれば、こんなことは起きないはず。
結構、穴がありますね。FuelPHPにはまだ。
一応、Issueとして、Githubには投げておきましたが、通じるかな?私の英語。
can't catch exception at email package when time out.
(追記:このIssueはphpのタイムアウトだという指摘をもらったので、クローズしました。しかし、何かがおかしいと言う感じがして、仕方なくsmtp.phpを調べ、ググッているうちに、十分にタイムアウトの処理が行われていないため、メールタイムアウト時の例外が拾えないことに気づきました。そこで、フォーラムでお伺いを立ててみたら、Issueで投げろということでしたので、再度別件としてIssueを発行しました。
ここまで私の理解がごちゃごちゃになったのは、gmailをsmtpサーバーとして利用しようとすると、ハングするという情報を先に読んでしまったため、頭の中でこれが当たり前と思い込んでしまったからです。そのため、smtpタイムアウト5秒と設定しているのに、phpのタイムアウトでエラーになるまで、引っかからない状況に疑問も抱かず、そのうちphpのタイムアウトをメールのタイムアウトと思い出し、自分でタイムアウトを30秒に設定していたんだよな、と考えるようになりました。
誤った情報は恐ろしいですね。ですから、皆さん、このサイトの記事をそのまま信用しないでください。ご自身で試してくださいね。 ;) )
| NetBeansでFuelPHPのコードテンプレートを使う< 前 | 次 >FuelPHP、名前付きパラーメーターx2 + 404 |
|---|
| < 前 | 次 > |
|---|