Bug(バグ) #1372
メールサーバーに接続できない場合の例外処理がキャッチされていないため500エラーになる
100%
説明
関連するチケット
関係しているリビジョン
(fixes #1372) fixed to catch mail send error exception on sending invitation
(fixes #1372) fixed to output error message on mail not sent
(fixes #1372) fixed no need error output
Revert "(fixes #1372) fixed to catch mail send error exception on sending invitation"
This reverts commit 2c0e95dc7743ef515e4fccc92e4492588c0344d9.
delete the incorrect description contained in the messages.ja.xml. (fixes #1372)
Revert "delete the incorrect description contained in the messages.ja.xml. (fixes #1372)"
This reverts commit 3586cc9458e4701d8d4bf3a6945a74a85a55bf8b.
Revert "Revert "(fixes #1372) fixed to catch mail send error exception on sending invitation""
This reverts commit 59aaaa6dfbe97dd893347af76d44a1db00a4a0dd.
Revert "(fixes #1372) fixed no need error output"
This reverts commit 17e886ec5d4ab06bcbe8942fae86ff4cab474318.
Revert "(fixes #1372) fixed to output error message on mail not sent"
This reverts commit 461564a2fcb13ad7fd6b426caadc8453f890fdd2.
Conflicts:
apps/mobile_frontend/i18n/messages.ja.xml
apps/pc_backend/i18n/messages.ja.xml
Revert "(fixes #1372) fixed to catch mail send error exception on sending invitation"
This reverts commit 2c0e95dc7743ef515e4fccc92e4492588c0344d9.
(refs #1372) cache Zend_Mail_Protocol_Exception in opExecutionFilter and forwad mailError action.
changed order of process in opMemberAction::executeConfig().
fixed to mail error template. (fixes #1372)
fixed to mail error template. (fixes #1372)
履歴
#1 Rimpei Ogawa が13年以上前に更新
- 3.6 で発生するか を Yes にセット
#2 Itsuro Tajima が13年以上前に更新
- ステータス を New(新規) から Accepted(着手) に変更
- 担当者 を Itsuro Tajima にセット
#3 Itsuro Tajima が13年以上前に更新
いくつか修正案を考えています。
- 単純にキャッチして何もせず、成功時と同じ画面遷移にする
- opMemberActionのエラーページに条件分岐でメールエラーを出す
- メール専用にエラーページを作り、そこにリダイレクトする
とりあえず、現在の方針としては1を考えています。
#4 Itsuro Tajima が13年以上前に更新
- ステータス を Accepted(着手) から Pending Review(レビュー待ち) に変更
- 進捗率 を 0 から 50 に変更
更新履歴 2c0e95dc7743ef515e4fccc92e4492588c0344d9 で適用されました。
#5 Shogo Kawahara が13年以上前に更新
- ステータス を Pending Review(レビュー待ち) から Rejected(差し戻し) に変更
差し戻しです。
- メール送信処理は lib/action/opMemberAction.class.php
だけでやっているわけではないので、ここで例外をキャッチするのは良くないです。
やるとすれば opMailSend::execute() でちょうどメールを送信している箇所が適切と言えるでしょう。
- もしエラーで例外をキャッチするならば、ログは残したほうが良いでしょう。
#6 Itsuro Tajima が13年以上前に更新
- ステータス を Rejected(差し戻し) から Accepted(着手) に変更
opMailSendでのメール送信はaction, task両方で使われているため、opMailSend.phpに
・ログを残す
・actionとtaskの判別
・taskの場合「Mail Send Error」と表示
・actionの場合、エラーページにリダイレクト
以上の例外処理を追加します。
#7 Itsuro Tajima が13年以上前に更新
- ステータス を Accepted(着手) から Pending Review(レビュー待ち) に変更
更新履歴 461564a2fcb13ad7fd6b426caadc8453f890fdd2 で適用されました。
#8 Itsuro Tajima が13年以上前に更新
taskかactionかの判別には、synfony 1.2では
http://blog.asial.co.jp/615
の方法がありますが、1.4では正常に動作しませんでした。
このため、アクションの名前を参照することで判別しています。
(未実装項目)
ログを残す部分
また、最初のopMemberAction固有のコミットはrevertしました。
#9 Itsuro Tajima が13年以上前に更新
更新履歴 59aaaa6dfbe97dd893347af76d44a1db00a4a0dd で適用されました。
#10 Itsuro Tajima が13年以上前に更新
更新履歴 17e886ec5d4ab06bcbe8942fae86ff4cab474318 で適用されました。
#11 Masato Nagasawa が約13年前に更新
- ステータス を Pending Review(レビュー待ち) から Rejected(差し戻し) に変更
3.4系(#1373) と修正内容が異なっているので、問題がないか確認をお願いします。
#12 Shingo Yamada がほぼ13年前に更新
- 優先度 を Normal(通常) から High(高め) に変更
#13 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 の修正 で「下さい>。」と句点の直前に不適切な文字が含まれていることを確認しました。
#15 Shingo Yamada がほぼ13年前に更新
- ステータス を Accepted(着手) から Pending Review(レビュー待ち) に変更
Minoru Takai は書きました:
ちなみに簡単にコードを確認してみましたが、 apps/mobile_frontend/i18n/messages.ja.xml の修正 で「下さい>。」と句点の直前に不適切な文字が含まれていることを確認しました。
上記指摘点のみ 3586cc9458e4701d8d4bf3a6945a74a85a55bf8b で修正しました。
#16 Shingo Yamada がほぼ13年前に更新
更新履歴 3586cc9458e4701d8d4bf3a6945a74a85a55bf8b で適用されました。
#17 Rimpei Ogawa が12年以上前に更新
- ステータス を Pending Review(レビュー待ち) から Rejected(差し戻し) に変更
opMailSend クラス内で例外を止めてリダイレクト処理までしてしまう変更は不適切だと思います。このような変更をしてしまうと、opMailSend クラスを利用するコード側でメール送信失敗時の例外処理を記述することができなくなります。
その意味では #1373 で行われた 3.4 向けの変更も不適切だと思います。(もちろん意図しない 500 エラーが発生しなくなったことはよいことですが、これまで利用可能であった例外が利用不可になっており、(バンドルにはありませんでしたが)プラグインやカスタマイズされたコードの動作に影響を与えている可能性があります)
メール送信専用の共通エラー画面を用意するのであれば、CSRFトークンエラー用のエラー画面と同じように opExecutionFilter のような opMailSend クラスを利用することが想定されるクラス(例えば、アクションクラス)よりも上位のクラスで例外をキャッチし、フォワード(もしくはリダイレクト)の処理を行うべきではないでしょうか。
タスク内からの呼び出し時に関してはエラー画面とは別の考慮が必要ですが、ログにエラーが記録されるのみでタスク内からメール送信処理の失敗が検知できないような変更よりは、仮にうまく共通化ができなかったとしても個別タスク内できちんと例外処理を行うように修正するほうがよいと思います。
#19 Shingo Yamada が12年以上前に更新
- 360対象 を beta13 にセット
#20 Shinichi Urabe が12年以上前に更新
呼び出されている箇所
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で対処
#21 Shinichi Urabe が12年以上前に更新
- ステータス を Rejected(差し戻し) から Pending Review(レビュー待ち) に変更
更新履歴 eb8b102cae887b84e8bfeca9c43e05fa7f2cdc73 で適用されました。
#22 Shinichi Urabe が12年以上前に更新
更新履歴 a568d894ecb91580b2d99d28f11963107a22ead1 で適用されました。
#23 Shinichi Urabe が12年以上前に更新
更新履歴 016e30d6bff01b3a4028f614b7a19d82c787755c で適用されました。
#24 Shinichi Urabe が12年以上前に更新
更新履歴 4a81cebbafc516e535c11588828e679fe2c02546 で適用されました。
#25 Shinichi Urabe が12年以上前に更新
更新履歴 22e2f57f5ebbcc1300ec5f53585cb22343802ba5 で適用されました。
#26 Shinichi Urabe が12年以上前に更新
いったん修正を戻し、クラス外から例外がわからないようにする修正は問題なので opMailSend::execute() では例外をキャッチしないように対処
- アクションは opExecutionFilter で例外をキャッチし、メール送信失敗のページにforwardされるように変更
- タスク(デイリーニュース、誕生日通知、メール投稿のリターンメール)については実行時にそのまま例外が表示できることが必要と判断し、例外をキャッチしていません
#27 Maki Takahashi が12年以上前に更新
- ステータス を 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と表示が異なるようです。
#28 Hiroshi Kato が12年以上前に更新
- ステータス を Rejected(差し戻し) から Pending Review(レビュー待ち) に変更
更新履歴 d89664564b08404f751f658b30dce2822bf5f525 で適用されました。
#29 Hiroshi Kato が12年以上前に更新
更新履歴 e099cc79c365f5d6ef96cf2e39e2002eab4d4961 で適用されました。
#30 Maki Takahashi が12年以上前に更新
- ステータス を Pending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
- 進捗率 を 50 から 70 に変更
#31 Mutsumi Imamura が12年以上前に更新
- ステータス を Pending Testing(テスト待ち) から Fixed(完了) に変更
- 進捗率 を 70 から 100 に変更