السلام عليكم اخواني واخواتي ,
كثير منكم لا يحب الدالة ()Mail في لغة البرمجة php ولكنه بالرغم من ذلك يستعملها عندما يريد ارسال الرسائل في برامجه او موقعه لانه ببساطة لا يملك البديل العملي , وسبب عدم حب هذه الدالة هو انها في اكثر الاحيان ترسل الرسالة بتواقيع غير مرحب بها من قبل شركات البريد وخاصة عندما نتكلم عن تطبيقات Microsoft وبريد Hotmail ولذلك تصنف الرسالة وتدخل في مجلد الجنك ميل Junk mail او ما يسمى Bulk او Spam وكل هذه الاسماء تطلق على اسم المجلد الذي يستقبل الرسائل الغير موثوق من مصدرها كما اسلفنا .
ان ادخال الرسائل الى صندوق الـ Junk والتي ترسلها عن طريق موقعك الى بريد احد اعضاء الموقع هو امر مزعج جدا خاصة وان الكثير من الشركات تضع في عين الاعتبار حذف رسائل الجنك ميل بعد فترة قصيرة كاحد الخيارات الافتراضية للبريد وهذا يعني ان احتمال عدم قرائة صاحب البريد للرسالة مرتفعة جدا وقسم منهم لا يكلف نفسه عناء دخول هذا مجلد الجنك على اعتبار بانه يعلم ان هذا المجلد يحوي رسائل غير مرغوب فيها وبالتالي فرسالتك لم تصل !! ما الحل ؟
حاول الكثير من الاخوة الالتفاف على هذا الامر من خلال وضع تواقيع موثوق منها في Header الرسالة وبالتالي فان الرسالة ستصل الى صندوق الوارد Inbox بدون مشاكل ولكن هذا الامر لم يجدي نفعا خاصة وان الكثير من الشركات شددت الرقابة وحاصرت هذه الطرق بشكل كبير لمنع انتشار رسائل السبام Spam وهذا طبعا لمصلحة المستخدم اولا واخيرا , لقد قمت في مرحلة ما بتجربة عمل توقيع موثوق عبر تشفير كل المخرجات التي تستعمل لارسال البريد بالترميز UTF-8 ونجح الامر لفترة ولكنه الآن غير ذي جدوى وكان الكود كالتالي :
كود PHP:
$sname="=?UTF-8?B?".base64_encode($sname)."?=\n"; // اسم المرسل
$sub="=?UTF-8?B?".base64_encode($sub)."?=\n"; // موضوع الرسالة
$smail=""; // بريد المرسل
$rmail=""; // بريد المستقبل
$body=""; // نص الرسالة
$headers = "From: $sname <$smail>\r\nReply-To: $smail\r\n";
$headers .= "X-Sender: <$smail>\n";
$headers .= "X-Mailer: PHP\n";
$headers .= "Return-Path: <$rmail>\n";
$headers .= "(anti-spam-(anti-spam-(anti-spam-(anti-spam-(anti-spam-(anti-spam-(anti-spam-content-type:))))))) text/html; charset=UTF-8\n";
$send = @mail($rmail,$sub,$body,$headers);
if($send){
echo "تم الارسال بنجاح";
}else{
echo "لم يتم الارسال بنجاح";
}
بعد فترة من البحث والتنقيب عن سبب هذا الامر عرفت عن Smtp وهو اختصار لـ Server Mail Transfer Protocol وهذا يعني بروتوكول خادم تناقل البريد من والى سيرفر موقعك وكان في الحقيقة هو الحل الامثل لهذه المشكلة ولكن ليس بشكل كامل , فقد قمت بتنزيل كلاس ارسال البريد المشهور PHPmailer وفيه امكانية ارسال البريد بـ 3 طريق مختلفة منها الارسال العادي عن طريق الدالة Mail و SMTP و POP3 .
في المرة الاولى التي استعملت بها SMTP كان علي معرفة المنفذ Port الذي يستعمله المستضيف الخاص بي لهذا البروتوكول وهو عادة ما يكون المنفذ 25 او 26 وهذا يختلف من استضافة لاخرى وكان علي معرفة رابط هذا البروتوكول وهذا ايضا حسب الاستضافة فاحيانا يكون mail.domain.com او smtp.domain.com , بعد معرفة هذه المعطيات قمت بتنزيل الملفات الاساسية لكلاس PHPmailer وهي 3 ملفات تجدها هنا او بامكانك دخول الموقع الرسمي لهذا الكلاس وتنزيل كامل ملفات الكلاس ولكن المهم وقبل البدء بعرض الكود علي ان اخبركم بانه يجب الدخول الى الملف class.smtp.php وتعديل رقم منفذ بروتوكول البريد وهو يكون 25 بالوضع الافتراضي , لا تخف فستجد هذه الخاصية باول سطر برمجي في الملف واذا لم تجده قم بعمل بحث عن var $SMTP_PORT وسوف تجدها بالتأكيد .
بعد تغيير المنفذ حسب المستضيف الخاص بك علينا التوقف قليلا , فعلينا فهم شيء مهم جدا , فلقد تكلمنا مسبقا عن سبب وصول الرسائل الى الجنك ميل واعتقد بان البعض منكم قد سأل نفسه : ما هي النقطة التي ترتكز عليها شركات البريد الالكتروني لكي تقول بان هذا البريد موثوق منه وهذا البريد مشبوه وعليه فيمكن ان يكون بريد سبام Spam ؟؟ هل لانظمتهم عقول فائقة الذكاء للتميز بين البريد المشبوه والموثوق ؟
الجواب كالتالي : ان هذه الشركات جميعها طورت مع بعضها ما يسمى بـ SPF وهي اختصار لـ Sender Policy Framework وهو اطار عمل يتيح للبرمجيات بالتعرف على الرسائل الغير مصرح بها لاسم نطاق معين عند استعمال SMTP , ماذا يعني كلامي ؟؟ حسنا الفكرة بسيطة جدا , تخيل اننا نريد الان ارسال رسالة عن طريق الدالة ()Mail , يمكننا ان نختار بريد المرسل حسب مزاجنا الشخصي صحيح ؟ يمكننا ان نضع هذا الايمل في خانة اسم المرسل Webmaster@microsoft.com ونرسل رسالة الى ابن قانا نقول له بانك مرشح جدا لخلافة بيل جيتس في ادارة شركة مايكروسوفت !! يقوم ابن قانا بحزم الامتعة الى امريكا وتكتب الصحف عن الشاب العربي البسيط الذي سيتربع على عرش مايكروسوفت في غضون ايام وتكتب عن بداياته حيث كان يبيع الزعتر والزيت في احد الاسواق الشعبية الخ ... كل هذه الافكار كانت تظهر لأبن قانا في غيمة اعلى رأسه وهو يجلس في غرفة الانتظار مقابل المكتب الرئيسي لبيل جيتس , وأخذت الافكار تزيد في راسه والغيمة تكبر ودخل ابن قانا الى بيل جيتس وابتسامة النصر تملأ تقاسيم وجهه وبدأ يتكلم عن انجازاته ويحاول التقليل من شأن نفسه ليقول عنه الصديق الحميم بيل بانه متواضع وانه بالفعل مناسب لهذه الوظيفة ولكن , سرعان ما امسك بيل جيتس بدبوس حاد ووخز غيمة احلام ابن قانا وخزة صغيرة جعل الهواء يخرج منها بسرعة وطارت الغيمة بعيييييييدا .
استفاق ابن قانا في الصباح والعرق يقطر من جبينه بسبب هذا الكابوس المزعج فقد عرف بان احد المزعجين قام وارسل له رسالة SPAM فيها انتحل بريد مايكروسوفت , وبعد عدة ايام قاموا باختراع الـ SPF لكي لا يقوم اي شخص آخر باستعمال البريد الشخصي لأي شركة او موقع عند استعمال بروتوكول SMTP ؟ عرفتم الآن سبب ابتكار هذا الاطار ؟
اذن يجب ان تحتوي سجلات موقعنا على اطار العمل هذا وعندما تحويه فاننا عندما نرسل اي رسالة الى اي مستضيف فانه يعرف بان موقعنا يحوي هذا السجل وبالتالي فيقوم بتصنيفه كموقع موثوق به ويقوم بقبول رسائله بدون مشاكل .
كيف نعرف ان موقعنا يحوي او لا يحوي SPF ؟ ادخل الى هذا الرابط وقم بادخال اسم موقعكم في الخانة الفارغة وسيقوم النظام باعطائك الجواب فاذا كان يحوي فانه سيعطيك قيمة هذا السجل في موقعك فقيمته وشكله يختلفان من استضافة لأخرى وهذا حسب متطلبات الزبون ولتعرف المزيد عن SPF ادخل هنا.
بعد ان تأكدنا من هذه الامور سأقوم بعرض الكود الاساسي في هذا الموضوع وهو كالتالي :
كود PHP:
require_once("class.phpmailer.php"); // نضمن كود الكلاس الاساسي
include("class.smtp.php"); // نضمن كود الكلاس الخاص بسيرفر SMTP
$sname="=?UTF-8?B?".base64_encode($sname)."?=\n"; // اسم المرسل
$smail=""; // بريد المرسل
$rname="=?UTF-8?B?".base64_encode($rname)."?=\n"; // اسم المستقبل
$rmail=""; // بريد المستقبل
$sub="=?UTF-8?B?".base64_encode($sub)."?=\n"; // موضوع الرسالة
// لم نقم بتشفير قيم البريد لكل من المرسل والمستقبل لانه بالاحرف اللاتينية
$body=""; // نص الرسالة
$mail = new PHPMailer();
$mail->IsSMTP(); // نختار الارسال عن طريق SMTP
$mail->Host = $smtp; // اسم سيرفر SMTP - ممكن ان يكون mail.yourdomain.com / smtp.yourdomain.com
$mail->SMTPAuth = true;
$mail->Username = "anymail@yourdomain.com"; // البريد الخاص بموقعك يجب ان ينتهي باسم موقعك
$mail->Password = "password"; // كلمة مرور هذا البريد
$mail->AddReplyTo($smail,$sname); // نختار وجهة ارسال الرد في حال ارسل واسم مستقبل الرد
$mail->AddAddress($rmail, $rname); // بريد المستقبل واسمه
$mail->From = $smail; // بريد المرسل
$mail->FromName = $sname; // اسم المرسل
$mail->Subject = $sub; // موضوع الرسالة
$mail->MsgHTML($body); // نص الرسالة - يمكن ان يكون كود html
$mail->IsHTML(true); // send as HTML
if(!$mail->Send()) {
echo "تم الارسال بنجاح";
}else{
echo "لم يتم الارسال بنجاح";
}
من الممكن انك لا تملك موقع خاص بك وبالتالي لا تملك سيرفر SMTP لاستعماله عندها يمكنك استعمال سيرفر Gmail الخاص اذا كان لديك بريد من شركة Google وهو امر في غاية البساطة والكود الخاصة به لا يختلف كثيرا عن السابق فقط في اعدادات الارسال :
كود PHP:
require_once("class.phpmailer.php"); // نضمن كود الكلاس الاساسي
include("class.smtp.php"); // نضمن كود الكلاس الخاص بسيرفر SMTP
$sname="=?UTF-8?B?".base64_encode($sname)."?=\n"; // اسم المرسل
$smail=""; // بريد المرسل
$rname="=?UTF-8?B?".base64_encode($rname)."?=\n"; // اسم المستقبل
$rmail=""; // بريد المستقبل
$sub="=?UTF-8?B?".base64_encode($sub)."?=\n"; // موضوع الرسالة
// لم نقم بتشفير قيم البريد لكل من المرسل والمستقبل لانه بالاحرف اللاتينية
$body=""; // نص الرسالة
$mail = new PHPMailer();
$mail->IsSMTP(); // نختار الارسال عن طريق SMTP
$mail->SMTPAuth = true;
// لا تغير اي من قيمة ثلاثة الاعدادات التالية
$mail->SMTPSecure = "ssl";
$mail->Host = "smtp.gmail.com";
$mail->Port = 465;
$mail->Username = $gmail; // بريدك الخاص في جوجل
$mail->Password = $gpass; // كلمة مرور البريد
$mail->AddReplyTo($smail,$sname); // نختار وجهة ارسال الرد في حال ارسل واسم مستقبل الرد
$mail->AddAddress($rmail, $rname); // بريد المستقبل واسمه
$mail->From = $smail; // بريد المرسل
$mail->FromName = $sname; // اسم المرسل
$mail->Subject = $sub; // موضوع الرسالة
$mail->MsgHTML($body); // نص الرسالة - يمكن ان يكون كود html
$mail->IsHTML(true); // send as HTML
if(!$mail->Send()) {
echo "تم الارسال بنجاح";
}else{
echo "لم يتم الارسال بنجاح";
}
هناك سيئة واحدة وفي المقابل ايجابية واحدة عند استعمال سيرفرات Gmail اما السيئة فهي انك عندما ترسل اي رسالة وتكتب بريد المرسل في الاعدادات , فانه عند وصول الرسالة ستجد ان بريد المرسل هو نفسه بريدك في شركة google وليس الذي قمت بتحديده في الاعدادات وهذا بعكس الارسال عن طريق سيرفر موقعك فانت تقوم بتحديد اي بريد ينتهي باسم موقعك كبريد المرسل , اما الايجابية فهي انك حتى ولو لم تملك سجل SPF خاص بموقعك فانك عندما ترسل اي رسالة الى اي بريد فسيقبلها ويضعها في صندوق الوارد Inbox مباشرة بدون اعتبارها كرسالة غير موثوق منها .
جميع ما ذكر من اكواد وشرح في هذا الموضوع مبني على تجربة خاصة وليس فقط من قرائه بعض المواضيع , فانا لا اكتفي بالقراءة , بل احاول واجرب كل شيء لكي اكون واثق من كلامي واعطي كل ما لدي من تجربة في سبيل نهضة حقيقة على صعيد تكنولوجيا المعلومات وشبكة الانترنت في العالم العربي .
اقدم اعتذاري للاخوة المحترفين لطول الشرح ولكن احب ان تصل المعلومة لجميع المستويات والخبرات , ولا تنسوا فان المجال للحديث والحوار والنقد البناء مفتوح دائما , كما واسقوم بالرد على جميع الاسئلة والاستفسارات باسرع وقت ممكن ان شاء الله وأخيرا اذكر الاخوة بعدم كتمان العلم فانه كالنقود يجب ان نخرج زكاة لأجله .
الموضوع الأصلي على هذا الرابط
باحترام : اخوكم EbNCaNa