msmtpをリレーとして使用し、mail()関数を使用してメールを送信しようとしています。 CLIでは完全に機能しますが、Apacheでは何もしません。私のPHP cliとApacheの構成は同じで、どのログにもエラーはなく、私は本当に考えがありません。
これが何によって引き起こされる可能性があるかについて何か考えはありますか?
私はこの問題の解決策を見つけました。私はmsmtpを使用しています。これはSMTPプロキシであり、sendmailと同様に機能します。したがって、メールを送信しようとすると、msmtpコマンドがsendmailと同様の構文でphpから呼び出されます。
これで、msmtpコマンドは、Apache2が実行されているのと同じユーザーによって実行されます。私の場合はwww-data。
Www-dataユーザーが読み取り可能である必要があるmsmtp(私の場合は/etc/.msmtp_php)の構成ファイルがあります。
CLIが機能していてApache PHPが機能しなかった理由は、ファイルに対する正しいアクセス許可を持つrootでCLIを実行していたのに、Apache2がwww-dataで実行されていたためです。それらの権限がありません。
つまり、解決策は次のとおりです:chown/ etc/.msmtp_phpファイルからwww- data:www-dataと同じファイルを0600にchmodします。そうしないと、msmtpは権限の喪失について文句を言います。
まず第一に:あなたが信じている_php.ini
_ファイルを実際に使用しているかどうかを確認してください。
たとえば、_php.ini
_が有効になっている場合、Apacheはユーザーごとに異なる_mod_suphp
_の場所を使用できます。 suPHPでは、場所は_suPHP_ConfigPath
_の_mods-enabled/suphp.conf
_ディレクティブで設定され、グローバル構成に異なるPHPIniDir
が設定されている場合でも、デフォルトでPHPのコンパイル済みデフォルトパスになります。 ( PHP:構成ファイル は、_php.ini
_が検索される順序に関する詳細情報を提供します。)
<?php phpinfo(); ?>
を使用すると、_php.ini
_の場所を取得できます。mail()
:を使用して、ini_get()
関数で使用されている現在のSMTPサーバーを直接取得できます。
<?php echo ini_get('SMTP') . ":" . ini_get('smtp_port'); ?>
SMTPサーバーが本来あるべきサーバーである場合、メールの配信が正常に受け入れられた場合はmail()
関数がTRUE
を返し、それ以外の場合はFALSE
を返します。どちらの場合も、関数がSMTPサーバーに接続できた場合、接続の詳細については、SMTPサーバーのログファイルを参照してください。
mail()
がSMTPに接続せずにFALSE
を返す場合は、safe_modeがオンでmail()
additional_parametersが設定されているかどうかを確認してください。変更ログ(PHPバージョン4.2.3)から:
additional_parametersパラメーターはsafe_modeで無効になり、
mail()
関数は警告メッセージを表示し、使用するとFALSE
を返します。 。
Exec()関数で使用してメールを送信する1つの方法。
_exec('usr/bin/mail <parameter>', $output); //$output for debugging
_
出力の応答を確認しますが、それでもphp mail()
関数を使用するための設定を解決する必要があります。