次のコードでPHPのメール機能を介してsendmailを呼び出そうとしています。
$to = '[email protected]';
$subject = 'test';
$message = 'test';
$headers = 'From: [email protected]' . "\r\n" .
'Reply-To: [email protected]' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
mail($to, $subject, $message, $headers);
しかし、私のmail.logでは、fromがヘッダーで指定したアドレスではないというメッセージが表示されます。
<www-data@Name>: Sender address rejected: Domain not found
どうしてこれなの?? ubuntuでPHPのfast-cgiを実行しています。sendmailがPHPコードで指定したヘッダーを使用しないのはなぜですか?
www-data@Name
はエンベロープの「差出人」アドレスのようです。エンベロープの「差出人」アドレスは異なるメールの「差出人:」ヘッダーに表示されるアドレスからです。これは、sendmailが受信メールサーバーとの「MAIL FROM/RCPT TO」交換で使用するものです。「エンベロープ」アドレスと呼ばれる主な理由は、メッセージヘッダーと本文のoutsideが表示されるためです。メールサーバー間の生のSMTP交換で。
UNIXのデフォルトのエンベロープ「送信元」アドレスは、使用しているsendmailの実装によって異なります。ただし、通常は、実行中のプロセスのユーザー名の後に「@」とマシンのホスト名が設定されます。典型的な構成では、これは[email protected]
のようになります。
メールサーバーの受信によってメールが拒否されている場合、またはバウンスメールの送信先アドレスを変更する必要がある場合は、エンベロープの「差出人」アドレスを変更して問題を解決できます。
UNIXでエンベロープの「from」アドレスを変更するには、sendmailバイナリに「-r」オプションを指定します。これをphp.iniでグローバルに行うには、「sendmail_path」コマンドラインに「-r」オプションを追加します。 PHP内からプログラムで行うこともできます。-r [email protected]
を追加パラメーター引数としてmail()関数に渡します(5番目の引数)。)両方の場所でアドレスを指定すると、sendmailバイナリは、sendmailの実装によっては未定義の動作をする2つの「-r」オプションで呼び出されます。PostfixMTAでは、後の「-r」オプションが以前のオプションを暗黙的にオーバーライドし、グローバルなデフォルトを設定し、それをローカルでオーバーライドしようとした場合でも、賢明な動作を得ることができます。
sendmailに渡すことができるオプションのフラグについて:-f
はFromアドレスを設定し、-r
はデフォルトのReturn-を上書きしますsendmailが生成するパス(通常はFromアドレスが使用されます)。バウンスバックを送信元アドレスとは異なるアドレスに移動する場合は、両方のフラグを一度に使用してみてください:-f [email protected] -r [email protected]
[mail function]
; For Win32 only.
; http://php.net/smtp
SMTP = localhost
; http://php.net/smtp-port
smtp_port = 25
; For Win32 only.
; http://php.net/sendmail-from
;sendmail_from = [email protected]
; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
; http://php.net/sendmail-path
;sendmail_path =
; Force the addition of the specified parameters to be passed as extra parameters
; to the sendmail binary. These parameters will always replace the value of
; the 5th parameter to mail(), even in safe mode.
;mail.force_extra_parameters =
; Add X-PHP-Originating-Script: that will include uid of the script followed by the filename
mail.add_x_header = On
; Log all mail() calls including the full path of the script, line #, to address and headers
;mail.log =
これは古い質問ですが、誰かに役立つ場合に備えて、この回答を追加します。
From:
ヘッダーがwww-data@Host...
に書き直されるという同じ問題がありましたが、最終的には、ssmtpブリッジサービスまで追跡して、メールをWebサーバーからメールサーバーにパイプしていました。ファイルFromLineOverride=YES
に/etc/ssmtp/ssmtp.conf
という行を追加したところ、問題は解決しました。
私の場合、私はホストされたサーバーを持っているので、このファイルを編集する必要がありました:
/etc/ssmtp/ssmtp.conf
次に、この行のコメントを外します。
FromLineOverride = YES
完了すると、パーソナルヘッダーが機能します。
すべてのメールがこのヘッダーで送受信されると、www-dataで同様の問題が発生していました。
From: www-data <[email protected]>
私は-f [email protected]
フラグを5番目の引数としてPHP email()関数(受け入れられた回答で述べたように)で使用しましたが、それでも次のようにメールを受信していました:
From: www-data <[email protected]>
そこで、もう1つのフラグ-f [email protected] -F info
を追加して、電子メールの完全な名前を設定し、最後に、希望どおりに電子メールを取得していました。
From: info <[email protected]>
ここでは誰も言及せず、少し行き詰まっているので、この回答を投稿します。
exim4とsmarthostを使用してこの問題が発生しました。メールは
Return-path: <www-data@servername>
これはISPによって拒否されました。少なくとも[email protected]
に変更する必要がありました( 'example.com'はサーバーのパブリックドメイン名であると仮定しています)。 /etc/mailname
を
servername
に
example.com
これはすでに機能しており、[email protected]
をReturn-path
として使用できます。
ただし、メールアドレスを完全に変更する場合は、/etc/email-addresses
で次のように設定できます。
www-data: [email protected]
その後、デフォルトでメールが送信されます
Return-path: <[email protected]>
これは私のために働きました:
$mail->Sendmail = $mail->Sendmail.' -f '.$mail_errorsto;