3

メールを送信するためのcroncronジョブ設定があります。次のコマンドを使用して実行されます。

/usr/bin/php -q /var/www/vhosts/domain.com/cron/job.php

ブラウザからphpスクリプトを実行すると、スクリプトは期待どおりに電子メールを送信します。cronジョブで実行すると失敗します。

メールログにエラーはありません。唯一の違いは「from」行にあります。スクリプトがブラウザから実行されると、ログには次のように表示されます。

Jan 25 12:24:39 VMW01 qmail-remote-handlers[1001]: from=sender@domain.com

ただし、cronジョブがスクリプトを実行すると、「from」行は次のようになります。

Jan 25 12:15:01 VMW01 qmail-queue-handlers[1000]: from=anonymous@VMW01.server.net

奇妙なことに、mail()行の5番目のパラメーターを削除すると、cronジョブが電子メールを送信します。

mail($email, $subject, $body, $headers, '-fsender@domain.com');

私はこれで簡単に生きることができますが、パラメーターを削除すると、サーバーによって電子メールが拒否されることがよくあります。これは、パラメーターが設定されていないためだと思います。

なぜこれが起こっているのか、そしてどうすればそれを修正できるのか、何か考えはありますか?解決策を得るために、この質問にさらに詳細を追加させていただきます。

4

2 に答える 2

4

@Michaelが言ったように、おそらくあなたのcronジョブは別のphp.iniファイルを使用しています。この関数を使用してphp_ini_loaded_file()、スクリプトにロードされているファイルを確認できます。次に、コマンドラインまたはcronから実行して、Web実行との違いを確認します。

私の推測では、cronジョブのphp.ini(コマンドラインと同じ)にsafe_modeが設定されているために問題が発生します。その場合、mail()関数の最後のパラメーターを使用しないでください。失敗する可能性があります。PHPMailer証拠として、クラスを見るとmail_passthru()、内部でPHPmail()関数を呼び出すだけのメソッドがあります。にない場合は、余分なパラメータが省略されていることに注意してくださいsafe_mode

private function mail_passthru($to, $subject, $body, $header, $params) {
    if ( ini_get('safe_mode') || !($this->UseSendmailOptions) ) {
        $rt = @mail($to, $this->EncodeHeader($this->SecureHeader($subject)), $body, $header);
    } else {
        $rt = @mail($to, $this->EncodeHeader($this->SecureHeader($subject)), $body, $header, $params);
    }
    return $rt;
}

次のように、コマンドライン(またはcronジョブ)からphpを呼び出すときに、特定のphp.iniファイルをロードできます。

/usr/bin/php -q /var/www/vhosts/domain.com/cron/job.php -c /path/to/php.ini
于 2013-01-25T22:47:51.930 に答える
0

同じ問題が発生しました。cronコマンドをwget-O/ dev / null http://myurl.com/に変更すると、ブラウザと同じように実行され、電子メールが送信されました。

于 2017-05-05T21:07:37.260 に答える