プロジェクト

全般

プロフィール

Bug(バグ) #1372

完了

メールサーバーに接続できない場合の例外処理がキャッチされていないため500エラーになる

Shinichi Urabe さんが14年以上前に追加. 約9年前に更新.

ステータス:
Fixed(完了)
優先度:
High(高め)
担当者:
対象バージョン:
開始日:
2010-07-18
期日:
進捗率:

100%

予定工数:
3.6 で発生するか:
Yes
3.8 で発生するか:
Unknown (未調査)

説明

現象

  • config/OpenPNE.yml の mail_smtp_host に接続できないメールサーバーのホストを記述し、招待メールを送信すると500エラーになる
  • メールサーバーの障害の対処がされていない (エラー表示やログ出力などの対処が必要)

    バージョン:3.6beta1

原因

Zend_Mail_Protocol_Exception の例外がキャッチされていない

修正内容


関連するチケット 6 (1件未完了5件完了)

関連している OpenPNE 3 - Backport(バックポート) #1373: メールサーバーに接続できない場合の例外処理がキャッチされていないため500エラーになるFixed(完了)Shinichi Urabe2010-07-18

操作
関連している OpenPNE 3 - Backport(バックポート) #1374: メールサーバーに接続できない場合の例外処理がキャッチされていないため500エラーになるInvalid(無効)Itsuro Tajima2010-07-18

操作
関連している OpenPNE 3 - Backport(バックポート) #1407: メールサーバーに接続できない場合の例外処理がキャッチされていないため500エラーになるFixed(完了)Maki Takahashi2010-07-18

操作
関連している OpenPNE 3 - Bug(バグ) #2328: DB接続障害発生時などにメール投稿をした際に「現在、サーバが混み合っているか〜」のHTML形式の文言がリターンメールとして送信されるNew(新規)2011-07-31

操作
関連している OpenPNE 3 - Bug(バグ) #2360: #1373 で実施したメール投稿の例外を受ける処理が不適切であるFixed(完了)Shinichi Urabe2011-08-192011-10-06

操作
関連している OpenPNE 3 - Backport(バックポート) #2521: メールサーバーに接続できない場合の例外処理がキャッチされていないため500エラーになるInvalid(無効)Yuya Watanabe2010-07-18

操作

Rimpei Ogawa さんが14年以上前に更新

  • 3.6 で発生するかYes にセット

Itsuro Tajima さんが14年以上前に更新

  • ステータスNew(新規) から Accepted(着手) に変更
  • 担当者Itsuro Tajima にセット

Itsuro Tajima さんが14年以上前に更新

いくつか修正案を考えています。

  1. 単純にキャッチして何もせず、成功時と同じ画面遷移にする
  2. opMemberActionのエラーページに条件分岐でメールエラーを出す
  3. メール専用にエラーページを作り、そこにリダイレクトする

とりあえず、現在の方針としては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しました。

Itsuro Tajima さんが約14年前に更新

更新履歴 59aaaa6dfbe97dd893347af76d44a1db00a4a0dd で適用されました。

Itsuro Tajima さんが約14年前に更新

更新履歴 17e886ec5d4ab06bcbe8942fae86ff4cab474318 で適用されました。

Masato Nagasawa さんがほぼ14年前に更新

  • ステータスPending Review(レビュー待ち) から Rejected(差し戻し) に変更

3.4系(#1373) と修正内容が異なっているので、問題がないか確認をお願いします。

Shingo Yamada さんが13年以上前に更新

  • 優先度Normal(通常) から High(高め) に変更

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年以上前に更新

  • ステータスRejected(差し戻し) から Accepted(着手) に変更

対応します。

Shingo Yamada さんが13年以上前に更新

  • ステータスAccepted(着手) から Pending Review(レビュー待ち) に変更

Minoru Takai は書きました:

ちなみに簡単にコードを確認してみましたが、 apps/mobile_frontend/i18n/messages.ja.xml の修正 で「下さい>。」と句点の直前に不適切な文字が含まれていることを確認しました。

上記指摘点のみ 3586cc9458e4701d8d4bf3a6945a74a85a55bf8b で修正しました。

Shingo Yamada さんが13年以上前に更新

更新履歴 3586cc9458e4701d8d4bf3a6945a74a85a55bf8b で適用されました。

Rimpei Ogawa さんが13年以上前に更新

  • ステータスPending Review(レビュー待ち) から Rejected(差し戻し) に変更

opMailSend クラス内で例外を止めてリダイレクト処理までしてしまう変更は不適切だと思います。このような変更をしてしまうと、opMailSend クラスを利用するコード側でメール送信失敗時の例外処理を記述することができなくなります。

その意味では #1373 で行われた 3.4 向けの変更も不適切だと思います。(もちろん意図しない 500 エラーが発生しなくなったことはよいことですが、これまで利用可能であった例外が利用不可になっており、(バンドルにはありませんでしたが)プラグインやカスタマイズされたコードの動作に影響を与えている可能性があります)

メール送信専用の共通エラー画面を用意するのであれば、CSRFトークンエラー用のエラー画面と同じように opExecutionFilter のような opMailSend クラスを利用することが想定されるクラス(例えば、アクションクラス)よりも上位のクラスで例外をキャッチし、フォワード(もしくはリダイレクト)の処理を行うべきではないでしょうか。

タスク内からの呼び出し時に関してはエラー画面とは別の考慮が必要ですが、ログにエラーが記録されるのみでタスク内からメール送信処理の失敗が検知できないような変更よりは、仮にうまく共通化ができなかったとしても個別タスク内できちんと例外処理を行うように修正するほうがよいと思います。

Shinichi Urabe さんが13年以上前に更新

  • 担当者Itsuro Tajima から Shinichi Urabe に変更

引き継ぎますー

Shingo Yamada さんが13年以上前に更新

  • 360対象beta13 にセット

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年以上前に更新

更新履歴 a568d894ecb91580b2d99d28f11963107a22ead1 で適用されました。

Shinichi Urabe さんが13年以上前に更新

更新履歴 016e30d6bff01b3a4028f614b7a19d82c787755c で適用されました。

Shinichi Urabe さんが13年以上前に更新

更新履歴 4a81cebbafc516e535c11588828e679fe2c02546 で適用されました。

Shinichi Urabe さんが13年以上前に更新

更新履歴 22e2f57f5ebbcc1300ec5f53585cb22343802ba5 で適用されました。

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メールアドレス設定も同様かと思われます)。

Hiroshi Kato さんが13年以上前に更新

  • ステータスRejected(差し戻し) から Pending Review(レビュー待ち) に変更

更新履歴 d89664564b08404f751f658b30dce2822bf5f525 で適用されました。

Hiroshi Kato さんが13年以上前に更新

更新履歴 e099cc79c365f5d6ef96cf2e39e2002eab4d4961 で適用されました。

Maki Takahashi さんが13年以上前に更新

  • ステータスPending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
  • 進捗率50 から 70 に変更

d8966456 および e099cc79 修正確認いたしました。
問題ないと思います。

Mutsumi Imamura さんが約13年前に更新

  • ステータスPending Testing(テスト待ち) から Fixed(完了) に変更
  • 進捗率70 から 100 に変更

kaoru n さんが約9年前に更新

  • 3.8 で発生するかUnknown (未調査) にセット

他の形式にエクスポート: Atom PDF