الطريقة الاحترافية لايصال الرسائل الى الـ Inbox دائما بواسطة Smtp
مدرج تحت قسم: دروس

كثير منكم لا يحب الدالة ()Mail في لغة البرمجة php ولكنه بالرغم من ذلك يستعملها عندما يريد ارسال الرسائل في برامجه او موقعه لانه ببساطة لا يملك البديل العملي، وسبب عدم حب هذه الدالة هو انها في اكثر الاحيان ترسل الرسالة بتواقيع غير مرحب بها من قبل شركات البريد وخاصة عندما نتكلم عن تطبيقات Microsoft وبريد Hotmail ولذلك تصنف الرسالة وتدخل في مجلد الجنك ميل Junk mail او ما يسمى Bulk او Spam وكل هذه الاسماء تطلق على اسم المجلد الذي يستقبل الرسائل الغير موثوق من مصدرها كما اسلفنا.
ان ادخال الرسائل الى صندوق Junk والتي ترسلها عن طريق موقعك الى بريد احد اعضاء الموقع هو امر مزعج جدا خاصة وان الكثير من الشركات تضع في عين الاعتبار حذف رسائل الجنك ميل بعد فترة قصيرة كاحد الخيارات الافتراضية للبريد وهذا يعني ان احتمال عدم قرائة صاحب البريد للرسالة مرتفعة جدا وقسم منهم لا يكلف نفسه عناء دخول هذا مجلد الجنك على اعتبار بانه يعلم ان هذا المجلد يحوي رسائل غير مرغوب فيها وبالتالي فرسالتك لم تصل! ما الحل؟
حاول الكثير من الاخوة الالتفاف على هذا الامر من خلال وضع تواقيع موثوق منها في Header الرسالة وبالتالي فان الرسالة ستصل الى صندوق الوارد Inbox بدون مشاكل ولكن هذا الامر لم يجدي نفعا خاصة وان الكثير من الشركات شددت الرقابة وحاصرت هذه الطرق بشكل كبير لمنع انتشار رسائل السبام Spam وهذا طبعا لمصلحة المستخدم اولا واخيرا، لقد قمت في مرحلة ما بتجربة عمل توقيع موثوق عبر تشفير كل المخرجات التي تستعمل لارسال البريد بالترميز UTF-8 ونجح الامر لفترة ولكنه الآن غير ذي جدوى وكان الكود كالتالي :
$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 .= "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 ادخل هنا.
بعد ان تأكدنا من هذه الامور سأقوم بعرض الكود الاساسي في هذا الموضوع وهو كالتالي :
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 وهو امر في غاية البساطة والكود الخاصة به لا يختلف كثيرا عن السابق فقط في اعدادات الارسال :
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 مباشرة بدون اعتبارها كرسالة غير موثوق منها .
جميع ما ذكر من اكواد وشرح في هذا الموضوع مبني على تجربة خاصة وليس فقط من قرائه بعض المواضيع، فانا لا اكتفي بالقراءة، بل احاول واجرب كل شيء لكي اكون واثق من كلامي واعطي كل ما لدي من تجربة في سبيل نهضة حقيقة على صعيد تكنولوجيا المعلومات وشبكة الانترنت في العالم العربي .
اقدم اعتذاري للاخوة المحترفين لطول الشرح ولكن احب ان تصل المعلومة لجميع المستويات والخبرات، ولا تنسوا فان المجال للحديث والحوار والنقد البناء مفتوح دائما، كما وسأقوم بالرد على جميع الاسئلة والاستفسارات باسرع وقت ممكن ان شاء الله.


ما شاء الله
شرح مميز حبيبى ابن قانا
يسعدنى أن أكون أول من يشكرك :)
جزاك الله كل الخير وزادك من علمه أخى الحبيب
مشكور على الشرح
بس اللي بدي افهمه هسه
بتقدر تبعث ميل ويوصل على الانبوكس ؟
السلام عليكم ورحمة الله وبركاته
اخي الفاضل حين تم التسجيل لديكم وصلني الباس ورود على الجنك ميل
لا اعلم ما سبب طرحكم هذا الشي وانتم توصلون الباس الي الجنك ميل
الشي الثاني
هل هذ الموضوع مجدي بارك الله فيك
ولو كان مجدي هل منه فائده اعتقد ان الفائدة الاصليه هي نجاح الموقع في اصلاح الشي قبل ان يصلح للغير
تحياتي لكم وتمنا ان يتسع لي صدرك
اخوي محمد نعم لما تستعمل الكلاس الموجود حسب الطريقة المعطاة يجب ان يصل الايمل الى الانبوكس .
اخوي ceif730 موقع المشروع هو ليس موقعي , وليس موقع احد من الاعضاء باستثناء بعض الاخوة الاداريين , انا كاتب فقط في هذا الموقع , بتمنى من الاخوة الاداريين اصلاح العطل وايصال الرسائل للانبوكس بدل الجنك .
شكرا للنقد البناء .
الأخ ceif730..
الرسائل تصل عادة إلى الـiinbox.. وهناك أكثر من 100 شخص قبلك سجلوا ولم يواجهوا مشكلة..
لذا نرجو التأكد من نظام الرسائل المزعجة في بريدك.
السلام عليكم
شرح رائع جدا
ولكن سؤالي هو
كيف استطيع ربط الموقع مع الـ gmail بحيث مثلا يقوم الـ gmail بارسال مسج الي العضو الجديد عند اتمام تسجيله فورا
اخوي ياسر , اذا اردت فعلا ربط موقعك بسيرفرات gmail فيمكنك ذلك من خلال خدمة google apps , لكن بخصوص ارسال الرسالة الفورية فهذه الخاصية توجد في برامج المنتديات على انواعها بشكل افتراضي او على شكل هاك , بمعنى انا هكذا خاصية ليست مرتبطة بموضوعنا وبروتوكول Smtp .
الى الامام اخوي
جزاك الله خيراً .. و بارك الله فيك :)
اولا شكرا ثانيا شكرا ثالثا شكرا
وجاري التجربه و الشرح ممتاز وكنت ابحث عن اجابت هاذا السوال واخيرا وجدت الاجابه
السلام عليكم
جزاك الله خير على هذا الموضوع المميز
اقوم بعمل قائمة بريدية و استخدم gmail
وعندما اجرب على السيرفر المحلي يعمل الارسال بشكل رائع وتصل الرسالة للانبوكس
لكن لم يعمل عند رفعه للموقع .. فهل من نصيحة ؟
وجزاكم الله خيرا
بارك الله فيكم
وجزاكم الله خيرا
السلام عليكم ورحمة الله وبركاته
اخوي جربت كل ما قلته
حملت الملف وأنشأت ملف جديد وضعت فيه الكود الذي وضعته في الاعلى
غيرت بريد المرسل والمستقبل
رفعت الملف على السيرفر لكن مافي فايدة
يقول لي تم الارسائل لكن مافي رسائل توصل
ياريت توضيح اكثر
^_^
عم جرب
السلام عليكم
شكرا علي الشرح الجميل والواضح
عندما قمت بتجربة الكلاس لارسال ايميل باللغة العربية فان موضوع الرسالة والرسالة يصلان بطريقة مشفرة (حروف غير مفهومة)
ممكن حد يعرفني اعمل ايه
من فضلكممم سااااعدونى انا بستخدم phpmailer كلاس بس الرسائل الى بالعربى لا تظهر عاوزها تظهر عرببى ساااعدونى انا فى الانتظار
اختي امال مؤخرا حصلت مشكلة وهي ان قسم من شركات الاستضافة لا يدعم بعض من دوال هذا الكلاس او يدعم قسم ويبستبدل اخرى بدوال اخرى حسب ما يراه مناسبا , من ناحية اخرى فانا انصح اولا بتنزيل اخر نسخة من الكلاس ومتابعة الشرح الموجود بدخل الكلاس , وثانيا التاكد من ان الملف محفوظ بالترميز العالمي utf-8 لان هذا سوف يجنبك مشاكل اللغة والرموز الغير مفهومة .
الى الامام
http://jegat.tk/vb