web-dev-qa-db-ja.com

Sendmail dsn = 5.0.0 PHP toyahoo)でメールを送信するとサービスが利用できなくなります

Sendmailに関する質問がありました。すでに同様の質問を検索しましたが、役立つものは見つかりませんでした。

私は現在、sendmailを備えたサーバー(DebianとLAMP Stack)を使用して、Webサイトでのユーザー登録の確認メールを送信しています。これは通常正常に機能します。Gmailなど。メールを受信し、すべてが完全に機能します。しかし、最近、yahooではまったく機能せず、yahooがメールをまったく受信していないように見えることを発見しました。そこで、テスト用に自分でyahooアカウントを設定し、次の動作を観察しました。これについては、できるだけ詳しく説明します。

次のPHP-Code-Snippetを使用してメールを送信します。

$toEmail = '...';
$subject = '...';
$message = '...';

$headers   = array();
$headers[] = "MIME-Version: 1.0";
$headers[] = "Content-type: text/plain; charset=utf-8";
$headers[] = "From: [email protected]";
$headers[] = "Subject: {$subject}";
$headers[] = "X-Mailer: PHP/".phpversion();

if(mail($toEmail, $subject, $message, implode("\r\n",$headers))) {
    return TRUE;
}

サーバー上で動作するsendmailのインストールを取得し、PHPからのmailコマンドを処理しました。

すでに述べたように、これはyahoo(およびおそらく私がまだ知らない他のアドレス)を除いて、受信者としてのほぼすべてのアドレスに対して完全に正常に機能します。メールの送信をトリガーするウェブサイトのフォームを使用して、数秒以内にメールを受信します。以下は、/var/log/mail.logに表示されるログです。

May  3 14:19:12 btfmx5 sendmail[544]: u43CJCtW000544: from=www-data, size=1174, class=0, nrcpts=1, msgid=<[email protected]>, relay=www-data@localhost
May  3 14:19:13 btfmx5 sm-mta[545]: u43CJDBO000545: from=<[email protected]>, size=1419, class=0, nrcpts=1, msgid=<[email protected]>, proto=ESMTP, daemon=MTA-v4, relay=localhost [127.0.0.1]
May  3 14:19:13 btfmx5 sendmail[544]: u43CJCtW000544: [email protected], ctladdr=www-data (33/33), delay=00:00:01, xdelay=00:00:01, mailer=relay, pri=31174, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (u43CJDBO000545 Message accepted for delivery)
May  3 14:19:13 btfmx5 sm-mta[547]: STARTTLS=client, relay=gmail-smtp-in.l.google.com., version=TLSv1/SSLv3, verify=FAIL, cipher=ECDHE-RSA-AES128-GCM-SHA256, bits=128/128
May  3 14:19:13 btfmx5 sm-mta[547]: u43CJDBO000545: to=<[email protected]>, ctladdr=<[email protected]> (33/33), delay=00:00:00, xdelay=00:00:00, mailer=esmtp, pri=121419, relay=gmail-smtp-in.l.google.com. [64.233.184.26], dsn=2.0.0, stat=Sent (OK 1462278313 o16si26784998wme.6 - gsmtp)

ただし、yahooアドレスに送信しようとすると、上記のPHPコードはTRUEを返しますが、yahooアカウントでメールがまったく受信されません。この場合に表示されるログは次のとおりです。

May  3 14:26:50 btfmx5 sendmail[571]: u43CQoiH000571: from=www-data, size=1174, class=0, nrcpts=1, msgid=<[email protected]>, relay=www-data@localhost
May  3 14:26:50 btfmx5 sm-mta[572]: u43CQogB000572: from=<[email protected]>, size=1419, class=0, nrcpts=1, msgid=<[email protected]>, proto=ESMTP, daemon=MTA-v4, relay=localhost [127.0.0.1]
May  3 14:26:50 btfmx5 sendmail[571]: u43CQoiH000571: [email protected], ctladdr=www-data (33/33), delay=00:00:00, xdelay=00:00:00, mailer=relay, pri=31174, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (u43CQogB000572 Message accepted for delivery)
May  3 14:26:51 btfmx5 sm-mta[574]: STARTTLS=client, relay=mta5.am0.yahoodns.net., version=TLSv1/SSLv3, verify=FAIL, cipher=ECDHE-RSA-AES128-GCM-SHA256, bits=128/128
May  3 14:26:53 btfmx5 sm-mta[574]: u43CQogB000572: to=<[email protected]>, ctladdr=<[email protected]> (33/33), delay=00:00:03, xdelay=00:00:03, mailer=esmtp, pri=121419, relay=mta5.am0.yahoodns.net. [66.196.118.37], dsn=5.0.0, stat=Service unavailable
May  3 14:26:53 btfmx5 sm-mta[574]: u43CQogB000572: u43CQrgB000574: DSN: Service unavailable
May  3 14:26:53 btfmx5 sm-mta[574]: u43CQrgB000574: to=<[email protected]>, delay=00:00:00, xdelay=00:00:00, mailer=local, pri=30000, dsn=2.0.0, stat=Sent

コマンドラインからsendmailを使用してyahooアドレスにメールを送信し、詳細モードから追加情報を取得しようとしました。

しかし、驚いたことに、このメールはyahoo(spamフォルダー内ですが誰が気にしますか)によって受信されました!今、私は完全に困惑しています。コマンドラインからはどのように機能しますが、PHPを使用している場合は機能しませんか?

メールの送信に使用したコマンド:

echo "Subject: testmail" | sendmail -v [email protected]

そして、mail.logの対応するログエントリ:

May  3 14:34:35 btfmx5 sendmail[581]: u43CYZp5000581: from=alumpi, size=18, class=0, nrcpts=1, msgid=<[email protected]>, relay=root@localhost
May  3 14:34:35 btfmx5 sm-mta[582]: u43CYZx0000582: from=<[email protected]>, size=340, class=0, nrcpts=1, msgid=<[email protected]>, proto=ESMTP, daemon=MTA-v4, relay=localhost [127.0.0.1]
May  3 14:34:37 btfmx5 sm-mta[582]: STARTTLS=client, relay=mta7.am0.yahoodns.net., version=TLSv1/SSLv3, verify=FAIL, cipher=ECDHE-RSA-AES128-GCM-SHA256, bits=128/128
May  3 14:34:39 btfmx5 sm-mta[582]: u43CYZx0000582: to=<[email protected]>, ctladdr=<[email protected]> (1000/1000), delay=00:00:04, xdelay=00:00:04, mailer=esmtp, pri=30340, relay=mta7.am0.yahoodns.net. [63.250.192.45], dsn=2.0.0, stat=Sent (ok dirdel)
May  3 14:34:39 btfmx5 sendmail[581]: u43CYZp5000581: [email protected], ctladdr=alumpi (1000/1000), delay=00:00:04, xdelay=00:00:04, mailer=relay, pri=30018, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (u43CYZx0000582 Message accepted for delivery)

Sendmailコマンドの詳細出力:

[email protected]... Connecting to [127.0.0.1] via relay...
220 MYSERVER.de ESMTP Sendmail 8.14.4/8.14.4/Debian-8; Tue, 3 May 2016 14:34:35 +0200; (No UCE/UBE) logging access from: localhost(OK)-localhost [127.0.0.1]
>>> EHLO MYSERVER.de
250-MYSERVER.de Hello localhost [127.0.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-EXPN
250-VERB
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-AUTH DIGEST-MD5 CRAM-MD5
250-DELIVERBY
250 HELP
>>> VERB
250 2.0.0 Verbose mode
>>> MAIL From:<[email protected]> SIZE=18 [email protected]
250 2.1.0 <[email protected]>... Sender ok
>>> RCPT To:<[email protected]>
>>> DATA
250 2.1.5 <[email protected]>... Recipient ok
354 Enter mail, end with "." on a line by itself
>>> .
050 <[email protected]>... Connecting to mta7.am0.yahoodns.net. via esmtp...
050 220 mta1523.mail.gq1.yahoo.com ESMTP ready
050 >>> EHLO MYSERVER.de
050 250-mta1523.mail.gq1.yahoo.com
050 250-PIPELINING
050 250-SIZE 41943040
050 250-8BITMIME
050 250 STARTTLS
050 >>> STARTTLS
050 220 Start TLS
050 >>> EHLO MYSERVER.de
050 250-mta1523.mail.gq1.yahoo.com
050 250-PIPELINING
050 250-SIZE 41943040
050 250 8BITMIME
050 >>> MAIL From:<[email protected]> SIZE=340
050 250 sender <[email protected]> ok
050 >>> RCPT To:<[email protected]>
050 >>> DATA
050 250 recipient <[email protected]> ok
050 354 go ahead
050 >>> .
050 250 ok dirdel
050 <[email protected]>... Sent (ok dirdel)
250 2.0.0 u43CYZx0000582 Message accepted for delivery
[email protected]... Sent (u43CYZx0000582 Message accepted for delivery)
Closing connection to [127.0.0.1]
>>> QUIT
221 2.0.0 MYSERVER.de closing connection

したがって、主な質問は次のとおりです。たとえば、Gmailへの送信は機能するのに、yahooへの送信は失敗するのはなぜですか。

2番目の質問:コマンドライン経由でyahooに送信するのに、PHP経由で失敗するのはなぜですか?

必要な情報をすべてご提供できれば幸いです。よろしくお願いいたします。

1
Beztix

コメントのおかげで私はそれを理解することができました(私はこの種の管理者のものにかなり慣れていません、封筒の送信者などについてよく知りませんでした...):

ログからわかるように、PHPは[email protected]、コマンドラインを使用した場合は[email protected])を使用するときにsendmailが使用するエンベロープ送信者は、変更してみましたしかし、これは問題ではなく、2つのケースの動作が異なる理由はありませんでした。

実際、私は、適切なメールアドレスをエンベロープの送信者/リターンパスとして使用すると、おそらく有用な情報を含むバウンスメッセージを受け取ることに気づきました。そうした後、私はこのメールアドレスに次のようなバウンスメッセージを受け取りました。

554 Message not allowed - Headers are not RFC compliant[291]

そうそう、最初のエラーはまったく目立たないです:

質問に投稿されたPHPコードに見られるように、私は件名ヘッダーを2回送信しています。一度headers-arrayに入れ、一度はPHP mail()-functionのsubject-parameterを直接使用します。ほとんどのメールプロバイダーはそれについてsh **を提供していないようですが、yahooします。

そこで、PHPコードをクリーンアップして、単一のサブジェクトを送信し、便利なリターンパスを使用しました。これで、完全に機能します(スパムフォルダーにも移動しません)。

$toEmail = '...';
$subject = '...';
$message = '...';

$headers   = array();
$headers[] = "MIME-Version: 1.0";
$headers[] = "Content-type: text/plain; charset=utf-8";
$headers[] = "From: [email protected]";
$headers[] = "X-Mailer: PHP/".phpversion();

if(mail($toEmail, $subject, $message, implode("\r\n",$headers), '-f [email protected]')) {
    return TRUE;
}
1
Beztix