إرسال رسائل البريد الإلكتروني BCC باستخدام خادم SMTP؟
سؤال
لقد لاحظت هذا على بعض الكود الخاص بي لفترة من الوقت:
/**
* 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
*/
لا أتذكر من أين حصلت عليه (مصدر ممكن) ولكن هذا لا ينبغي أن يكون ذا صلة بهذا السؤال. في الأساس ، كلما حاولت إرسال بريد إلكتروني مع BCCs عبر SMTP ، فإن عناوين BCC ليست مخفية - لقد قرأت RFC بالكامل لبروتوكول SMTP (قبل عامين) ولا أعتقد أنني أفتقد أي شيء.
الشيء الغريب هو ، إذا أرسلت بريدًا إلكترونيًا مع BCCS باستخدام مدمج mail()
وظيفة كل شيء يعمل بشكل صحيح وليس لدي أي فكرة عن السبب - أود أن أتعامل مع مرسل البريد الإلكتروني الخاص بي ولكني فشل في فهم هذا.
هل يمكن لأي شخص إلقاء بعض الضوء في هذا الموضوع المظلم؟
المحلول
لا يتم تجريد عناوين BCC في خادم البريد الإلكتروني الوجهة. هذه ليست طريقة عمله.
كيف يعمل SMTP بالفعل
- سيرسل المرسل قائمة من
RCPT TO
الأوامر إلى خادم SMTP ، واحد لكل عناوين بريد إلكتروني للمستقبل ، وهذا الأمر لا يميز ما إذا كان المتلقي أمرًا طبيعيًا لـ CC أو BCC Type. - بعد فترة وجيزة من الاتصال بالأمر الذي يخبر خادم SMTP الذي هو المرسل ، وهو الخادم ، وكل شيء آخر ، عندها فقط سيتصل المرسل بـ
DATA
الأمر ، والذي سيحتوي على محتوى البريد الإلكتروني - والذي يتكون من رؤوس البريد الإلكتروني والجسم - الذي يتم استلامه من قبل عملاء البريد الإلكتروني. من بين رؤوس البريد الإلكتروني هذه المعتادة من العنوان ، إلى العنوان ، عنوان CC. - لا يتم عرض عنوان BCC للمستقبل ، ببساطة لأنه لم يتم طباعته تحت
DATA
الأمر ، ليس لأن خادم SMTP الوجهة قام بتجريدهم بعيدًا. سيشير خادم SMTP الوجهة فقط إلىRCPT TO
بالنسبة لقائمة عناوين البريد الإلكتروني التي يجب أن تتلقى محتوى البريد الإلكتروني. لا يهتم حقًا ما إذا كان جهاز الاستقبال في قائمة CC أو BCC.
تحديث (للتوضيح): يجب سرد عناوين البريد الإلكتروني BCC فيRCPT TO
قائمة الأوامر ، ولكن يجب على رأس BCC ليس يتم طباعتها تحتDATA
يأمر.
نقلاً عن جزء من RFC أعتقد أنه مناسب لقضيتك:
يرجى ملاحظة أن بيانات البريد تتضمن عناصر رأس المذكرة مثل التاريخ ، الموضوع ، إلى ، CC ، من [2].
طرح مرسل البريد الإلكتروني الخاص بك
قبل عامين ، أعتقد بصراحة ، إنه يعود إلى وقت طويل لافتراض أنك ما زلت تحفظ من طرف إلى طرف RFC 821. :)
نصائح أخرى
متأخر جدًا ، لكن الإجابة المقبولة خاطئة بشكل أساسي.
أولاً ، SMTP لا علاقة له BCC
. SMTP ، كبروتوكول ، يهتم فقط بمسار العودة ( MAIL
طلب) ، قائمة بالمستلمين ( RCPT
طلب) ، والبيانات المراد نقلها ( DATA
طلب). إذا كنت ترغب في إرسال بريد إلكتروني إلى شخص ما عبر SMTP ، فعليك توفير عنوانها في أ RCPT
طلب ، الفترة.
محتويات البريد الإلكتروني - DATA
, ، على نحو فعال - يتم تحديدها بشكل منفصل تمامًا ، في RFC2822. هناك الكثير من خطوط الطول في كيفية BCC
يجب التعامل معها. تعطي المواصفات 3 طرق للتعامل BCC
, وفي واحد منهم فقط BCC
جردت أثناء تحضير البريد الإلكتروني. إذا استخدمت Thunderbird كعميل بريد إلكتروني ، على سبيل المثال ، وقمت بإشارةه إلى خادم SMTP ، ثم انظر إلى الرسالة على السطر ، ثم أجد أن Thunderbird BCC
ذهب (من SMTP DATA
) ، واتصال SMTP بدلاً من ذلك يحتوي على معيار RCPT
طلب bcc
عنوان ed. لذلك ، يتحول ثندربيرد BCC
إلى RCPT
, ، لكن هذه ليست الطريقة الوحيدة للقيام بذلك.
مكان آخر للتعامل معه BCC
هو في MTA - بمعنى آخر ، أيا كان خادم SMTP عميل البريد الخاص بك يشير إليه. Sendmail ، على سبيل المثال ، يبحث في جميع To
, Cc
, ، و Bcc
خطوط في SMTP DATA
, ثم يبني قائمة عناوين من تلك الخطوط ، ثم يزيل ال Bcc
خط. يمكنك إقناع SendMail بالحفاظ على Bcc
أذا أردت. إذا لم يكن SendMail هو الوجهة MTA ، فسيتم الاتصال بـ MTA آخر عبر SMTP ، وإرسال عناوين المستلم عبر RCPT
. وبعبارة أخرى ، إذا كان sendmail هو الوجهة MTA ، وتحصل على ملف Bcc
, ، سوف يخرجها ، على عكس بيان آمي.
هناك أيضا بعض الالتباس في التعليقات. يمكنك تحديد RCPT
عناوين أي مجال ، وليس مجرد قائمة العناوين في نفس المجال. يتعين على MTA البحث عن سجلات MX لمجالات الوجهة لمعرفة مكان إرسال كل شيء. بيانات Google.com و Yahoo.com خاطئة.