Bug(バグ) #1372
完了メールサーバーに接続できない場合の例外処理がキャッチされていないため500エラーになる
Shinichi Urabe さんが14年以上前に追加. 約9年前に更新.
100%
説明
Itsuro Tajima さんが約14年前に更新
いくつか修正案を考えています。
- 単純にキャッチして何もせず、成功時と同じ画面遷移にする
- opMemberActionのエラーページに条件分岐でメールエラーを出す
- メール専用にエラーページを作り、そこにリダイレクトする
とりあえず、現在の方針としては1を考えています。
Itsuro Tajima さんが約14年前に更新
- ステータス を Accepted(着手) から Pending Review(レビュー待ち) に変更
- 進捗率 を 0 から 50 に変更
更新履歴 2c0e95dc7743ef515e4fccc92e4492588c0344d9 で適用されました。
Shogo Kawahara さんが約14年前に更新
- ステータス を Pending Review(レビュー待ち) から Rejected(差し戻し) に変更
差し戻しです。
- メール送信処理は lib/action/opMemberAction.class.php
だけでやっているわけではないので、ここで例外をキャッチするのは良くないです。
やるとすれば opMailSend::execute() でちょうどメールを送信している箇所が適切と言えるでしょう。
- もしエラーで例外をキャッチするならば、ログは残したほうが良いでしょう。
Itsuro Tajima さんが約14年前に更新
- ステータス を Rejected(差し戻し) から Accepted(着手) に変更
opMailSendでのメール送信はaction, task両方で使われているため、opMailSend.phpに
・ログを残す
・actionとtaskの判別
・taskの場合「Mail Send Error」と表示
・actionの場合、エラーページにリダイレクト
以上の例外処理を追加します。
Itsuro Tajima さんが約14年前に更新
- ステータス を Accepted(着手) から Pending Review(レビュー待ち) に変更
更新履歴 461564a2fcb13ad7fd6b426caadc8453f890fdd2 で適用されました。
Itsuro Tajima さんが約14年前に更新
taskかactionかの判別には、synfony 1.2では
http://blog.asial.co.jp/615
の方法がありますが、1.4では正常に動作しませんでした。
このため、アクションの名前を参照することで判別しています。
(未実装項目)
ログを残す部分
また、最初のopMemberAction固有のコミットはrevertしました。
Masato Nagasawa さんが13年以上前に更新
- ステータス を Pending Review(レビュー待ち) から Rejected(差し戻し) に変更
3.4系(#1373) と修正内容が異なっているので、問題がないか確認をお願いします。
Minoru Takai さんが13年以上前に更新
このチケットの状況を確認したのでコメントしておきます。
3.4.x 向けチケットでは http://redmine.openpne.jp/issues/1373#note-6 の通り、「メールサーバに接続できない場合には500エラーとならないようにする」という修正となっています。そして master 向けチケットでは http://redmine.openpne.jp/issues/1372#note-6 の通り、「メールサーバに接続できない場合には、500エラーとならないようにすることに加え、メール送信が失敗したことを示すためのエラーページに遷移させる」という修正となっています。
修正方針は良いと思いますので、メールサーバに接続できない状態でSNSからメールを送信した場合に、動作が不自然でないか、エラーページの表示は不自然でないかを確認できれば、この修正で問題を解消したと判断して良いと思います。
ちなみに簡単にコードを確認してみましたが、 apps/mobile_frontend/i18n/messages.ja.xml の修正 で「下さい>。」と句点の直前に不適切な文字が含まれていることを確認しました。
Shingo Yamada さんが13年以上前に更新
- ステータス を Accepted(着手) から Pending Review(レビュー待ち) に変更
Minoru Takai は書きました:
ちなみに簡単にコードを確認してみましたが、 apps/mobile_frontend/i18n/messages.ja.xml の修正 で「下さい>。」と句点の直前に不適切な文字が含まれていることを確認しました。
上記指摘点のみ 3586cc9458e4701d8d4bf3a6945a74a85a55bf8b で修正しました。
Rimpei Ogawa さんが13年以上前に更新
- ステータス を Pending Review(レビュー待ち) から Rejected(差し戻し) に変更
opMailSend クラス内で例外を止めてリダイレクト処理までしてしまう変更は不適切だと思います。このような変更をしてしまうと、opMailSend クラスを利用するコード側でメール送信失敗時の例外処理を記述することができなくなります。
その意味では #1373 で行われた 3.4 向けの変更も不適切だと思います。(もちろん意図しない 500 エラーが発生しなくなったことはよいことですが、これまで利用可能であった例外が利用不可になっており、(バンドルにはありませんでしたが)プラグインやカスタマイズされたコードの動作に影響を与えている可能性があります)
メール送信専用の共通エラー画面を用意するのであれば、CSRFトークンエラー用のエラー画面と同じように opExecutionFilter のような opMailSend クラスを利用することが想定されるクラス(例えば、アクションクラス)よりも上位のクラスで例外をキャッチし、フォワード(もしくはリダイレクト)の処理を行うべきではないでしょうか。
タスク内からの呼び出し時に関してはエラー画面とは別の考慮が必要ですが、ログにエラーが記録されるのみでタスク内からメール送信処理の失敗が検知できないような変更よりは、仮にうまく共通化ができなかったとしても個別タスク内できちんと例外処理を行うように修正するほうがよいと思います。
Shinichi Urabe さんが13年以上前に更新
呼び出されている箇所
urabe@mac OpenPNE3$ ack opMailSend 11-08-09 apps/pc_backend/modules/member/lib/ReissuePasswordForm.class.php 36: opMailSend::sendTemplateMail('reissuedPassword', $to, opConfig::get('admin_mail_address'), $params); →アクション上で呼び出されているので、opExecutionFilterで対処 apps/pc_frontend/modules/member/lib/registerMobileForm.class.php 41: $mail = new opMailSend(); →アクション上で呼び出されているので、opExecutionFilterで対処 lib/action/opAuthAction.class.php 45: opMailSend::sendTemplateMailToMember('registerEnd', $member, $params); →アクション上で呼び出されているので、opExecutionFilterで対処 lib/action/opCommunityAction.class.php 454: opMailSend::sendTemplateMailToMember('joinCommunity', $community->getAdminMember(), $params, $options); →アクション上で呼び出されているので、opExecutionFilterで対処 lib/action/opMemberAction.class.php 413: $mail = new opMailSend(); 420: opMailSend::sendTemplateMailToMember('leave', $member, $param); →アクション上で呼び出されているので、opExecutionFilterで対処 lib/form/doctrine/InviteForm.class.php 137: opMailSend::sendTemplateMail('requestRegisterURL', $to, opConfig::get('admin_mail_address'), $params); →アクション上で呼び出されているので、opExecutionFilterで対処 lib/form/MemberConfigForm/MemberConfigMobileAddressForm.class.php 58: opMailSend::sendTemplateMail('changeMailAddress', $to, opConfig::get('admin_mail_address'), $params); →継承している registerMobileFormはアクション上で呼び出されているので、opExecutionFilterで対処 lib/form/MemberConfigForm/MemberConfigPcAddressForm.class.php 58: opMailSend::sendTemplateMail('changeMailAddress', $to, opConfig::get('admin_mail_address'), $params); →継承している InviteFormはアクション上で呼び出されているので、opExecutionFilterで対処 lib/model/doctrine/MemberRelationshipTable.class.php 200: opMailSend::sendTemplateMailToMember('friendLinkComplete', $toMember, $params); → MemberRelationshipTable::processFriendConfirm() はイベントで呼び出されるが、アクションないの処理となるので、opExecutionFilterで対処 lib/task/opBaseSendMailTask.class.php 33: // opMailSend requires Zend コメント lib/task/openpneExecutemailactionTask.class.php 58: opMailSend::execute($subject, $to, $from, $retval); → タスクでリターンメールを送信する際に呼び出される、例外をキャッチして別処理を追加する必要はないと考える lib/task/openpneSendBirthDayMailTask.class.php 58: opMailSend::sendTemplateMailToMember('birthday', $member, $params, array(), $context); → タスクで誕生日通知メールを送信する際に呼び出される、例外をキャッチして別処理を追加する必要はないと考える lib/task/openpneSendDailyNewsTask.class.php 80: opMailSend::sendTemplateMail('dailyNews', $address, opConfig::get('admin_mail_address'), $params, $context); → タスクでデイリーニュースを送信する際に呼び出される、例外をキャッチして別処理を追加する必要はないと考える
urabe@mac OpenPNE3$ ack sfOpenPNEMailSend 11-08-09 lib/util/sfOpenPNEMailSend.class.php 23:class sfOpenPNEMailSend extends opMailSend plugins/opAuthMailAddressPlugin/lib/form/opAuthMailAddressPasswordRecoveryForm.class.php 102: sfOpenPNEMailSend::sendTemplateMail('passwordRecovery', $this->member->getEMailAddress(), opConfig::get('admin_mail_address'), $params); →アクション上で呼び出されているので、opExecutionFilterで対処
Shinichi Urabe さんが13年以上前に更新
- ステータス を Rejected(差し戻し) から Pending Review(レビュー待ち) に変更
更新履歴 eb8b102cae887b84e8bfeca9c43e05fa7f2cdc73 で適用されました。
Shinichi Urabe さんが13年以上前に更新
いったん修正を戻し、クラス外から例外がわからないようにする修正は問題なので opMailSend::execute() では例外をキャッチしないように対処
- アクションは opExecutionFilter で例外をキャッチし、メール送信失敗のページにforwardされるように変更
- タスク(デイリーニュース、誕生日通知、メール投稿のリターンメール)については実行時にそのまま例外が表示できることが必要と判断し、例外をキャッチしていません
Maki Takahashi さんが13年以上前に更新
- ステータス を Pending Review(レビュー待ち) から Rejected(差し戻し) に変更
- note-16 までの修正が取り消されていることを確認しました。
- 69791cd8 について
- pc_frontendおよび、pc_backendでのエラー画面(mailErrorSuccess.php)についてloginError.phpと表示が異なるようです。
- ただし、csrfErrorSuccess.phpとも画面が違うので「統一されてない」というわけではないです。が、loginError.phpにあわせた方が見栄えが良いように思います。
- 携帯メールアドレス設定(member/config?category=mobileAddress)でメール送信に失敗してmailErrorSuccess.phpが表示されてもFlashでセットされたデータ「メールを送信しました。・・・・」と出てしまいます(PCメールアドレス設定も同様かと思われます)。
- pc_frontendおよび、pc_backendでのエラー画面(mailErrorSuccess.php)についてloginError.phpと表示が異なるようです。
Hiroshi Kato さんが13年以上前に更新
- ステータス を Rejected(差し戻し) から Pending Review(レビュー待ち) に変更
更新履歴 d89664564b08404f751f658b30dce2822bf5f525 で適用されました。
Mutsumi Imamura さんが約13年前に更新
- ステータス を Pending Testing(テスト待ち) から Fixed(完了) に変更
- 進捗率 を 70 から 100 に変更