メールフォームで送信完了画面に遷移できず、500 Internal Server Error

お世話になります。

■ BaserCMSのバージョン:4.2.2
■ レンタルサーバー名:さくら
■ スマートURLの利用:OFF
■ 設置フォルダ:ドキュメントルート
■ 利用しているデータベース:SQLite
■ PHPスキル(自己評価):E

Baserのバージョンを、4.2.0→4.2.2へバージョンアップして以降からだと思うのですが、
メールフォームの送信完了画面(submit.php)への遷移ができなくなりました。
送信確認画面(confirm.php)から送信ボタンを押すと、500 Internal Server Errorになってしまいます。

メール自体は、
ユーザーへの自動送信…されない
データベース保存(管理ページ上からの受信メール確認)…可能
という状態です。
解決にお知恵を頂けますと幸いです。よろしくおねがいします。

こんにちは

app/tmp/logs/error.log になにかエラーが出力されていないか確認してみてください。

seto様

ご返信ありがとうございます。以下のエラーが見つかりました。

2019-09-25 18:34:36 Error: [BadRequestException] システムエラーです。
Request URL: /inquiry/confirm
Stack Trace:
#0 /(設置ディレクトリ)/lib/Cake/Controller/Component/SecurityComponent.php(351): SecurityComponent->_callback(Object(MailController), ‘sslFail’, Array)
#1 /(設置ディレクトリ)/lib/Cake/Controller/Component/SecurityComponent.php(255): SecurityComponent->blackHole(Object(MailController), ‘secure’, Object(SecurityException))
#2 /(設置ディレクトリ)/lib/Cake/Utility/ObjectCollection.php(129): SecurityComponent->startup(Object(MailController))
#3 //(設置ディレクトリ)/lib/Baser/Event/CakeEventManager.php(243): ObjectCollection->trigger(‘startup’)
#4 //(設置ディレクトリ)/lib/Cake/Controller/Controller.php(683): CakeEventManager->dispatch(Object(CakeEvent))
#5 //(設置ディレクトリ)/lib/Cake/Routing/Dispatcher.php(189): Controller->startupProcess()
#6 //(設置ディレクトリ)/lib/Cake/Routing/Dispatcher.php(167): Dispatcher->_invoke(Object(MailController), Object(CakeRequest))
#7 //(設置ディレクトリ)/index.php(158): Dispatcher->dispatch(Object(CakeRequest), Object(CakeResponse))
#8 {main}

メールフォームから送信が行われるたびに上記が出ているようです。
解決策をご教示いただけませんでしょうか。よろしくお願いいたします。

sslFailというエラーが気になりますね。
webサイトはhttpsで動作しているでしょうか?
また、app/Config/install.phpのsiteUrlとsslUrlは共にhttpsから始まるURLが入力されているでしょうか?

SSLを使用していない場合は、メールフォーム設定の「SSL通信」の項目のチェックボックスを外すと改善する可能性があります。

seto様

はい、httpsで動作しているサイトで、siteUrlとsslUrlともにhttps~で始まるURLが入っています。
また、仰られているメールフォーム設定の「SSL通信」にもチェックが入った状態です。

試しに「SSL通信」のチェックを外して再度メールフォームから送信してみましたが、改善しませんでした。

使用しているメールフィールドの一覧を教えて頂けるでしょうか?
テキスト、ラジオボタン など

再現するか確認してみます。

seto様

お忙しい中、お手を煩わせてすみません。
メールフィールドの一覧を共有するにはどのようにすれば良いでしょうか?
ヒントになるかは分かりませんが、javaでフォームの表示・非表示の制御をしています。

例)
お問い合わせ内容(セレクトボックス)で
>「資料請求」を選択された場合は、次の「ご希望のカタログ」の項目を表示させる
>「その他の問い合わせ」を選択された場合はそのまま問い合わせ内容入力に進む

また、新たに試してみた事として、メールフォーム設定の「リダイレクトURL」を設定してみたのですが、
結果は同じく送信確認画面から送信ボタン押下>500エラーでした。

実運用URLをお伝えした方がよいのであれば、開示します。
よろしくお願いいたします。

フィールドの一覧は、テキストかスクリーンショットでお願いします。
管理画面のメールフィールド一覧の「タイプ」の列の一覧を頂きたいです。

URLを教えて頂けるのであれば、そちらでも大丈夫です!

seto様

ありがとうございます。
実運用中のURLこちらになります。

[解決しましたので削除します]

よろしくお願いいたします。

URLありがとうございます。
同じような項目をローカルで作成して確認したのですが、再現しませんね…

エラーログの件で確認したいのですが、/inquiry/submit が含まれたログというものは存在しないでしょうか?

seto様

わざわざありがとうございます。
エラーログから「/inquiry/submit」探してみたのですが、見つかりませんでした…。

@houjicha

こんにちは。
DBには保存できて、メールが飛ばず、セキュリティチェックでエラーが発生しているようですが、処理の流れとして次の流れを踏みます。

  1. セキュリティチェック
  2. DB保存
  3. メール送信

DBに保存に保存されていないのであれば、セキュリティチェックに問題を絞れるのですが、DB保存とメール送信の間でなんらかの問題が発生しているという事なので、これ以上は、実際の環境を見てみなければわからないです。

取り急ぎの応急策としては、セキュリティエラーを回避するため、セキュリティチェックを外すという事が考えられます。

app/Controller/AppController.php の次の行を変更してみてください。

class AppController extends BcAppController {
}

class AppController extends BcAppController {
	public function beforeFilter() {
		parent::beforeFilter();
		$this->Security->validatePost = false;
		$this->Security->csrfCheck = false;
		$this->Security->requireSecure = false;
	}
}

これで送信できるようになる可能性がありますが、そうなったとしても応急策です。
パートナーに相談して調査して頂くことをおすすめします。

ryuring様

お世話になります。
ご教示いただきましたソースをapp/Controller/AppController.phpに追加してみましたが、
状況は変わりませんでした。

【追記】
ちなみに、app/Controller/AppController.phpに頂いたソースを書き加えた後の
エラーログは Error: Could not send email: Undefined offset: 1
のみになりました。

上長へ確認し、パートナーへの依頼を検討いたします。
どうもありがとうございます。

1 Like

@houjicha エラーログをもっと詳しいものをくださいー

エラーログ以下になります。

■SSL通信ON、AppController.phpへのソースコード追加なし

2019-09-25 11:38:08 Error: [BadRequestException] システムエラーです。
Request URL: /inquiry/confirm
Stack Trace:
#0 /(略)/lib/Cake/Controller/Component/SecurityComponent.php(351): SecurityComponent->_callback(Object(MailController), ‘sslFail’, Array)
#1 /(略)/lib/Cake/Controller/Component/SecurityComponent.php(255): SecurityComponent->blackHole(Object(MailController), ‘secure’, Object(SecurityException))
#2 /(略)/lib/Cake/Utility/ObjectCollection.php(129): SecurityComponent->startup(Object(MailController))
#3 /(略)/lib/Baser/Event/CakeEventManager.php(243): ObjectCollection->trigger(‘startup’)
#4 /(略)/lib/Cake/Controller/Controller.php(683): CakeEventManager->dispatch(Object(CakeEvent))
#5 /(略)/lib/Cake/Routing/Dispatcher.php(189): Controller->startupProcess()
#6 /(略)/lib/Cake/Routing/Dispatcher.php(167): Dispatcher->_invoke(Object(MailController), Object(CakeRequest))
#7 /(略)/index.php(158): Dispatcher->dispatch(Object(CakeRequest), Object(CakeResponse))
#8 {main}

■SSL通信OFF、AppController.phpへのソースコード追加

2019-09-26 14:15:00 Error: Could not send email: Undefined offset: 1

あ、これだけなんですね。
SSL通信ONの場合のように Stack Trace は出てないんですねえ。
むむむ、これだけだとエラーの内容特定が難しいですね。

ryuring様

ご確認ありがとうございます。
色々と情報収集していて、以下のような記事を発見しました。

https://www.sunnet-jp.com/tech/2018/10/31/%E3%81%95%E3%81%8F%E3%82%89%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%81%AE%E3%83%AC%E3%83%B3%E3%82%BF%E3%83%AB%E3%82%B5%E3%83%BC%E3%83%90%E3%81%A7php%E3%81%AE%E3%83%A1/

弊社の場合、「Webだけさくら」「メールはGsuite」の条件に当てはまりますし、
さくらのコンパネからエラーログを確認してみると

[Thu Sep 26 15:34:16.290280 2019] [cgi:error] [pid 87697] [client **..*.:0] malformed header from script ‘index.php’: Bad header: /(略)/dead.letter… S, referer: https://www./inquiry/confirm

となっています。エラーに気づいたのがバージョンアップ後だっただけで、
実はずっと前から500エラーを出していたのでは…、と冷や汗がでてきました。

明日、上記の記事の対処方法を試してみたいと思います。
色々とご確認いただきありがとうございます。取り急ぎ、現状報告まで。

1 Like

こんにちは。アタリがついてよかったです^^

お世話になります。

こちら、解決いたしました!
(※結局Baserのバージョンアップは関係なかったので、記事のタイトル変更しました)

経緯をまとめます。原因は、弊社の環境にありました。

ドメイン: お名前.com
webサーバー:さくら
メール: Gsuite

という構成で使用していたことに起因します。
解決方法としては、

① サイト基本設定 > メール設定関連 にGsuiteのSMTPを設定
② これで画面遷移するようになりましたが、届くメールにセキュリティ警告が出るように
https://support.google.com/a/answer/176600?hl=ja を参考に、DNSレコードにSFPレコードを追加し、webサーバーからのメールフォームは怪しいものではないよ、と教えてあげる

これで解決となりました。
seto様、ryuring様、お忙しい中大変お手数おかけいたしました。ありがとうございました!

1 Like