web-dev-qa-db-ja.com

SMTPサーバーを使用してBCCメールを送信しますか?

私はしばらくの間、私のコードのいくつかにこれを書き留めてきました:

_/**
 * Add a BCC.
 *
 * Note that according to the conventions of the SMTP protocol all
 * addresses, including BCC addresses, are included in every email as it
 * is sent over the Internet. The BCC addresses are stripped off blind
 * copy email only at the destination email server.
 *
 * @param string $email
 * @param string $name
 * @return object Email
 */
_

どこから入手したかは覚えていません( 可能なソース )が、この質問には関係ありません。基本的に、SMTP経由でBCCを使用して電子メールを送信しようとすると、BCCアドレスは非表示になりません。SMTPプロトコルのRFC全体を読んだことがあり(数年前)、何も欠けているとは思いません。

奇妙なことに、組み込みのmail()関数を使用してBCCでメールを送信するとすべてが正常に機能し、理由がわかりません。自分のメール送信者をロールバックしたいのですが、理解できません。

誰かがこの暗い被写体に光を当ててくれませんか?

17
Alix Axel

BCCアドレスは、宛先の電子メールサーバーで削除されません。それはそれがどのように機能するかではありません。

SMTPが実際にどのように機能するか

  • 送信者は、受信者の電子メールアドレスごとに1つずつ、RCPT TOコマンドのリストをSMTPサーバーに送信します。このコマンドは、受信者が通常のTo、CC、またはBCCタイプの受信者であるかどうかを区別しません。
  • SMTPサーバーに送信者、サーバー、その他すべてを通知するコマンドを呼び出した後すぐに、送信者はDATAコマンドを呼び出します。このコマンドには、電子メールの内容が含まれます。電子メールのヘッダーと本文の-電子メールクライアントによって受信されるもの。これらの電子メールヘッダーの中には、通常のfromアドレス、toアドレス、CCアドレスがあります。
  • BCCアドレスは、宛先SMTPサーバーがそれらを取り除いたためではなく、DATAコマンドで出力されないため、受信者に表示されません。宛先SMTPサーバーは、電子メールコンテンツを受信する必要がある電子メールアドレスのリストについて、RCPT TOを参照するだけです。受信者がTo、CC、またはBCCリストにあるかどうかは実際には関係ありません。
    更新(明確にするため):BCCメールアドレスはRCPT TOコマンドリストにリストする必要がありますが、BCCヘッダーはnotDATAコマンドで出力されます。

私があなたのケースに関連すると思うRFCの一部を引用する:

メールデータには、Date、Subject、To、Cc、From [2]などのメモヘッダー項目が含まれていることに注意してください。

独自のメール送信者を展開する

率直に言って、数年前、あなたがまだ RFC 821 のエンドツーエンドを覚えていると仮定するのはかなり長い時間です。 :)

37
Amry

非常に遅いですが、受け入れられた答えは本質的に間違っています。

まず、SMTPはBCCとは何の関係もありません。プロトコルとしてのSMTPは、リターンパス(MAILリクエスト)、受信者のリスト(RCPTリクエスト)、および転送されるデータ(DATAリクエスト)のみに関係します。 SMTP経由で誰かに電子メールを送信したい場合は、RCPTリクエスト期間にそのアドレスを指定する必要があります。

電子メールの内容(事実上、DATA)は、 RFC2822 で完全に個別に指定されます。 BCCの処理方法には多くの自由度があります。仕様では、BCCを処理する3つの方法が規定されており、そのうちの1つだけで、電子メールの準備中にBCCが削除されます。たとえば、Thunderbirdを電子メールクライアントとして使用し、それをSMTPサーバーにポイントして、その行のメッセージを見ると、Thunderbird BCCが(SMTP DATAから)なくなっており、SMTP接続が行われていることがわかります。代わりに、RCPTされたアドレスに対する標準のbccリクエストが含まれています。したがって、ThunderbirdはBCCRCPTに変換しますが、それを行う唯一の方法ではありません。

BCCを処理するもう1つの場所は、MTAです。つまり、メールクライアントが指しているSMTPサーバーは何でもです。たとえば、Sendmailは、SMTP To内のすべてのCcBcc、およびDATA行を検索し、それらの行からアドレスリストを作成してから、removesBcc行を作成します。必要に応じて、SendmailにBccを保持するように説得できます。 sendmailが宛先MTAでない場合は、SMTP経由で別のMTAに接続し、RCPTを介して受信者アドレスを送信します。言い換えると、sendmail is宛先MTAで、Bccを取得すると、Amryのステートメントに反して、それが削除されます。

コメントにも混乱があります。同じドメイン内のアドレスのリストだけでなく、任意のドメインにRCPTアドレスを指定できます。 MTAは、宛先ドメインのMXレコードを検索して、すべてを送信する場所を特定する必要があります。 google.comとyahoo.comのステートメントは間違っています。

18
EML