先日、PHPのフレームワークCakePHPでメールの送信機能を実装したら
An Internal Error Has Occurred.
(内部エラーが発生しました。)
といったようなエラーメッセージが表示されて苦戦しました。その解決策を下記に明記しておきます。
まず環境ですが、CentOS 6でPHP 5.4.18、CakePHPは2.3.10のバージョンです。
プログラムですがEmailの設定ファイル/app/Config/email.phpファイルのEmailConfigクラスに下記を追加します。
class EmailConfig {
public $sample = array(
'transport' => 'Mail',
'from' => 'to@fuge.net',
'sendAs' => 'text',
);
(以下省略)
}
次にコントローラーに/app/Controller/MailsController.phpを追加して、下記プログラムを明記します。
<?php
App::uses('CakeEmail', 'Network/Email');
class MailsController extends AppController {
public function send() {
$email = new CakeEmail();
$email->config('sample');
$email->subject("テストメール");
$email->to("to@hoge.com");
$email->send( 'メール本文');
exit("Fin!");
}
}
CakePHPでメールを送信したことがある方なら、特に難しいことは書いていないことはわかると思います。
さて、ブラウザでhttp://fuge.net/mails/send/にアクセスすると「Fin!」と表示されメールが送られるはずなのですが、結果は下記のような画面が表示されます。

「Could not send email.」と書かれた内部エラー
また、設定ファイルの/app/Config/email.phpで「transport」を「Smtp」に変更すると

「Permission denied」と書かれた内部エラー
といったようなエラーが表示されます。
さて、どうしたものかといろいろ調べたところ、今回の原因はSELinuxが有効になっているためにメールが送信できなかったようです。そこで「/etc/selinux/config」ファイルの
SELINUX=enforcing
を
SELINUX=disabled
に変更し、サーバーを再起動(reboot)することで、無事送信できました。確かSELinuxはOFFにしたと思っていたのですが、なっていなかったようですね。SELinuxはもっと勉強しておかないとな・・・。