web-dev-qa-db-ja.com

PHPのmail()関数はCLIで機能しますが、Apacheでは機能しません

msmtpをリレーとして使用し、mail()関数を使用してメールを送信しようとしています。 CLIでは完全に機能しますが、Apacheでは何もしません。私のPHP cliとApacheの構成は同じで、どのログにもエラーはなく、私は本当に考えがありません。

これが何によって引き起こされる可能性があるかについて何か考えはありますか?

2
Jake S.

私はこの問題の解決策を見つけました。私は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は権限の喪失について文句を言います。

3
Jake S.

まず第一に:あなたが信じている_php.ini_ファイルを実際に使用しているかどうかを確認してください。

たとえば、_php.ini_が有効になっている場合、Apacheはユーザーごとに異なる_mod_suphp_の場所を使用できます。 suPHPでは、場所は_suPHP_ConfigPath_の_mods-enabled/suphp.conf_ディレクティブで設定され、グローバル構成に異なるPHPIniDirが設定されている場合でも、デフォルトでPHPのコンパイル済みデフォルトパスになります。 ( PHP:構成ファイル は、_php.ini_が検索される順序に関する詳細情報を提供します。)

  1. 同じディレクトリ内で<?php phpinfo(); ?>を使用すると、_php.ini_の場所を取得できます。
  2. 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を返します。 。

1
Esa Jokinen

Exec()関数で使用してメールを送信する1つの方法。

_exec('usr/bin/mail <parameter>', $output); //$output for debugging
_

出力の応答を確認しますが、それでもphp mail()関数を使用するための設定を解決する必要があります。

1
Abhishek Gurjar