درس ارسال e-mail عبر PHP







السلام عليكم ورحمة الله تعالى وبركاته

 , اما بعد تقديم : اليوم سنتعرف على كيفية ارسال رسالة الى بريد الكتروني عبر PHP من الصفر باذن الله عز وجل وسنتعرف على header الذي يرسل في الرسالة , ماهو , وماهي خصائصه و ماهي القيم التي تاخذها ؟ انواع الرسائل التي يمكن ارسالها , وكيفية ارفاق ملف في الرسالة؟

Header في E-mail وهي راس الصفحة او مايسمى بالفرنسيةen-tête , وهي ما يكون في اول كل رسالة , لكنها مخفية بالنسبة للمستخدم الذي لا يستطيع الا قرائة الرسالة الالكترونية. اذا Header يحتوي على كل المعلومات الخاصة ب الرسالة , مثل ساعة الارسال و بريد المرسل و اسم السيرفر المرسل للرسالة. اها , سيدور في نفسك سؤال انني اخبرتك انه لا يمكنك رؤيته اي header فكيف يمكنني عند قراءة الرسالة معرفة التاريخ ؟؟ طبعا هذا وظيفة المواقع مثل hotmail و غيرها , وايضا البرامج مثل outlook وغيرها من برامج المراسلة.

عند ارسال الرسالة , يتم استخدام الدالة mail() من طرف المبرمج ,فقط في PHP وتاخذ اربعة بارامترات وهي 1 - المرسل اليه 2 - موضوع الرسالة 3 - الرسالة 4 - Header وهذا هو المهم في الدرس سنتعرف بشكل مكثف عن Header , كيف يكتب ؟ باذن الله عز وجل ياخذ Header في اغلب الحالات المحتويات التالية 1 - بريد المرسل 2 - اصدار Mime 3 - نوع المحتوى content-type

طبعا ماهو Mime اختصار للكلمة الانجليزية Multipurpose Internet Mail Extensions , والتي يكون دورها في اخبار السيرفر عن اصدار الايمايل, بشكل افضل هي تخبره كيف يقرا الرسالة. اما بخصوص content-type فقد تكون تعرفت عليها سابقا , خصوصا عند التعامل مع دالة header() في هذه الحالة تعرف السيرفر , بالمحتوى الذي سياخذه البريد المرسل اي نوعه هل هو نصي ؟؟ ام html ؟ هذا الشيئ قد تعرفت عليها في html & php عن كيفية تعريف محتوى الصفحة مثل type عند استخدام الوسمين script & style لكن كيف سنعرف هذا Header ؟؟ هذا من اهداف الدرس في البداية ننشئ متغير جديد نسميه line سياخذ في قيمته رمز معناه ارجع الى السطر او اعمل سطر جديد

رمز PHP:
<?php
$line 
"\n";
?>

الان سنعرف من المرسل وبريده

رمز PHP:
$header "From: \"المرسل\"<mail of المرسل>".$line

طبعا شرحا فقط سنتغيرها الى ماتحتاجه

رمز PHP:
<?php
$line 
"\n";
$header "From: \"W3a By Bilal\"<[email protected]>".$line;
?>

كل شيئ لحد الان بسيط From تعني من طرف او من واخبرناه عن المرسل و بريده. ان كانت الرسالة ردا لرسالة سابقة ففي المراسلة يمكنك الرد على رسالة , ويمكنك تعريفها كرد عبر الامر التالي

رمز PHP:
$header.= "Reply-to: \"رد على\" <mail of reply>".$line

رد على هو عنوان رسالة التي سترد عليها mail of reply هو البريد الذي سترد عليه يعني الذي ارسل لك الرسالة مثال

رمز PHP:
$header.= "Reply-to: \"Bilal El Moussaoui\" <[email protected]>".$line;

الان سنعرف اصدار Mime

رمز PHP:
$header.= "MIME-Version: 1.0".$line

اخبرناه بان الرسالة بالاصدار 1.0 من Mime , بقي الان التعرف على نوع المحتوى اي content-type

رمز PHP:
$header.= "Content-Type: multipart/alternative;".$line." boundary=\"$boundary\"".$line

عرفت نوع المحتوى multipart/alternative لانني في هذا الدرس سنتعرف على كيفية الارسال برسالة html و رسالة txt اي نصية $boundary هو متغير اطررت لتعريفه الان لكن سنشرحه في الخطوات القادمة الان انتهينا من الجزء الاول , لكن بقي الكثير , فيجب ان نتعرف على انواع الرسائل ؟ يوجد نوعان من الرسائل , اولها هو html التي يمكنك بواسطتها ارسال صور ؟ استخدام اوسم html بطريقة عادية جدا .. و النوع الثاني هو txt وهي رسالة نصية , لاتحتوي على اية خصائص فقط نص. لارسال اية رسالة لاي هاذين النوعين , سنحتاج الى متغيرين الاول يحتوي على الرسالة بنوع txt و الثاني يحتوي على الرسالة بنوع html سنسمي الاول مثلا message_txt و الثاني message_html هاته الرسائل يجب انهائها بشكل ضروري بالعلامة التي خزنناها في المتغير line . الان فلنعرف نوع الرسالة و الترميز Content-Type : XXX/XXX; charset=XXXXXX Content-Transfer-Encoding : XXXXXXXXXX وهذا شيئ ضروري لكي تظهر الرسالة بترميز صحيح نبدا الان بانشاء متغير الرسالة

رمز PHP:
$message "...";
$message .= "Content-Type: XXX/XXX; charset=\"XXXXXX\"".$line;
$message .= "Content-Transfer-Encoding: XXXXXXXXXX".$line;
$message .= "..."

XXXX سنتعرف عليها بعد قليل , بخصوص النقط قبل و بعد الرسالة , لان هناك محتوى اخر سنظيفه بعد و قبل المتغير $message لذلك وضعتها لتوضيح Content-type , يمكنك استخدام نوعان وهما text/plain => نص عادي text text/html => رسالة html ننتقل الى charset وهو امر طبيعي لكل مبرمج , يمكنك استخدام utf-8 لكن اغلبية خدمات الرسائل لا تدعمه , و الاكثر دعمها هو iso-8859-1 وهو الذي سنستخدم باذن الله عز وجل الان Content-Transfer-Encoding , هذا يوضح الى اي عدد من bit يتم تشفير الرسالة مثلا لو وضعتا رسالة وضعت في Content-Transfer-Encoding 7 bits لن يقوم بقرائة سوى 128 حرف , يمكنك البحث عن هذا الموضوع بشكل مكثف في النت لكن انا كيف ساعرف كل هذا؟؟ , طبعا الامر بسيط جدا وهو فقط الامر كالتالي 2 اس bit الذي تريده , سيعطينا عدد الاحرف التي يمكنه قرائتها مثلا 2 اس 7 سيعطينها = 128 2 اس 8 سيعطينا 256 وهي عدد الاحرف التي يمكن قرائتها من طرف خادم الرسائل ليصبح الكود كالتالي

رمز PHP:
<?php
$line 
"\n";
$header "From: \"W3a By Bilal\"<[email protected]>".$line;
$header.= "Reply-to: \"Bilal El Moussaoui\" <[email protected]>".$line;
$header.= "MIME-Version: 1.0".$line;
$header.= "Content-Type: multipart/alternative;".$line." boundary=\"$boundary\"".$line;
$message "...";
$message .= "Content-Type: text/html; charset=\"ISO-8859-1\"".$line;
$message .= "Content-Transfer-Encoding: 8bit".$line;
$message .= "...";
?>

فقط غيرنا content-type واستعملنا charset المتفق عليها , واستعملت 8bit فقط. الان المرحلة الثالثة وهي انشاء قيمة للمتغير boundary هذا boundary يمكننا من تقسيم اجزاء الرسالة يمكنك تعرفه انه مثل طريقة تستخدم للتفرقة بين اجزاء الرسالة المرسلة ويكتب على الشكل التالي ----= نصوص و ارقام بخصوص النصوص و الارقام يمكنك استخدام اي دالة لتوليد نص عشوائي مثلا

رمز PHP:
$boundary "-----=".md5(time()); 

يغلق boundary او الحدود عبر -- و ايضا وضع نفس الرمز بعد المرة الاول من استعماله , اي عند استعماله المرة الاولى , عندما ساعيد استعماله يجب ان اكتب قبله -- , سيتوضح الامر اكثر في الكود طريقة او هيكل الرسالة

رمز PHP:
فتح boundary.
تحديد النوع مثلا TEXT.
النص.
فتح boundary.
تحديد النوع مثلا HTML
HTML
.
اغلاق boundary.
اغلاق boundary

ليصبح

رمز PHP:
<?php
$line 
"\n";

$sujet "مرحبا بك في ملتقى";
$boundary "-----=".md5(rand());

$header "From: \"W3a By Bilal\"<[email protected]>".$line;
$header.= "Reply-to: \"Bilal El Moussaoui\" <[email protected]>".$line;
$header.= "MIME-Version: 1.0".$line;
$header.= "Content-Type: multipart/alternative;".$line." boundary=\"$boundary\"".$line;

$message $line.$boundary.$line;
اضافة بنوع text//=====
$message.= "Content-Type: text/plain; charset=\"ISO-8859-1\"".$line;
$message.= "Content-Transfer-Encoding: 8bit".$line;
$message.= $line.$message_txt.$line;

$message.= $line."--".$boundary.$line;
//===== الاضافة بنوع HTML
$message.= "Content-Type: text/html; charset=\"ISO-8859-1\"".$line;
$message.= "Content-Transfer-Encoding: 8bit".$line;
$message.= $line.$message_html.$line;

$message.= $line."--".$boundary."--".$line;
$message.= $line."--".$boundary."--".$line;

?>

الان بقي فقط تعريف message_txt و message_html ليصبح الكود

رمز PHP:
<?php
$line 
"\n";

$sujet "مرحبا بك في ملتقى";
$message_txt "مرحبا بك في الملتقى , نتمنى ان يعجبك درس رسال الرسالة";
$message_html "مرحبا بك في الملتقى , نتمنى ان يعجبك درس رسال الرسالة<strong>";

$boundary "-----=".md5(rand());

$header "From: \"W3a By Bilal\"<[email protected]>".$line;
$header.= "Reply-to: \"Bilal El Moussaoui\" <[email protected]>".$line;
$header.= "MIME-Version: 1.0".$line;
$header.= "Content-Type: multipart/alternative;".$line." boundary=\"$boundary\"".$line;

//=====Création du message.
$message $line.$boundary.$line;
//=====Ajout du message au format texte.
$message.= "Content-Type: text/plain; charset=\"ISO-8859-1\"".$line;
$message.= "Content-Transfer-Encoding: 8bit".$line;
$message.= $line.$message_txt.$line;
//==========
$message.= $line."--".$boundary.$line;
//===== الاضافة بنوع HTML
$message.= "Content-Type: text/html; charset=\"ISO-8859-1\"".$line;
$message.= "Content-Transfer-Encoding: 8bit".$line;
$message.= $line.$message_html.$line;
//==========
$message.= $line."--".$boundary."--".$line;
$message.= $line."--".$boundary."--".$line;


?>

طبعا غير الرسالة بما تشاء , الرسالة الاولى يجب ان تكون فقط نص , والثانية بها اكواد html , الان ارسال الرسالة

رمز PHP:
mail($mail,$sujet,$message,$header); 

[size=large]اضافة --- ارفاق الملفات[/size] اول شيئ يجب القيام به , لارفاق ملف هو تغيير في Header فقد اخبرناه باننا سنستعمل في content-type هذا multipart/alternative. , سنغيره الى multipart/mixed , حيث ان الاول يخبره ان الرسالة قد تحتوي اما على نص html او text اما الثانية فتخبره انه قد يكون صيغة مختلفة عنهما , مثلا فيديو flv او صورة ليصبح header

رمز PHP:
$header "From: \"W3a By Bilal\"<[email protected]>".$line;
$header.= "Reply-to: \"Bilal El Moussaoui\" <[email protected]>".$line;
$header.= "MIME-Version: 1.0".$line;
$header.= "Content-Type: multipart/mixed;".$line." boundary=\"$boundary\"".$line;

اول شيئ قبل ان نتمم يجب ان تعرف ان الملف , مثل psd , هو مجموعة من الرموز التي تعتبر تشفير , لا يفكها الا البرنامج المخصص لقرائتها لانه يعرف كيف يحول ذاك الكود الى اللغة المبرمج بها البرنامج , او الى لغة الالة و قرائتها الان سناخذ محتوى صورة معينة مثل logo الموقع

رمز PHP:
$logo   fopen("logo.png""r");   
$attachement fread($logofilesize("logo.png")); 
fclose($logo); 

سنخزن المحتوى في متغير attachement من اجل الاستعمال لاحقا الان سنستعمل على المتغير الدالتين chunk_split ;base64_encode

رمز PHP:
$attachement chunk_split(base64_encode($attachement)); 

الدالة base64_encode معروفة للتشفير ب 64 اما chunk_split فهي دالة يمرر لها البارمتر الاول وهو ناتج الدالة base64_encode و تستعمل لارجاعه يوافق المعيار RFC 2045. , يمكنك البحث عن معلومات اكثر عنها الان سنضيف محتويات على المتغير message

رمز PHP:
$message.= "Content-Disposition: attachment; filename=\"nom_fichier\"".$ligne;

لنخبره ان لدي attachment اي ملف مرفق nom_fichier غيره باسم الملف مع الصيغة في مثالنا

رمز PHP:
$message.= "Content-Disposition: attachment; filename=\"logo.png\"".$ligne;

الان تحديد نوع الملف المرفق

رمز PHP:
$message.= "Content-Type: image/png; name=\"logo.png\"".$ligne;

اخباره ان المحتوى مشفر ب تشفير base64

رمز PHP:
$message.= "Content-Transfer-Encoding: base64".$ligne

الان طريقة التعامل مع boundary اي الحدود عند ارفاق ملف

رمز PHP:
فتح boundary
تحدد نوع المحتوى و فتح boundary الثانية
فتح boundary رقم 2
تحديد النوع مثلا نصي
النص
فتح boundary رقم 2
تحديد النوع مثلا html
HTML
.
اغلاق boundary 2
فتح boundary
اخباره بالملف المرفق
اغلاق boundary 

ليصبح هكذا

رمز PHP:
<?php
$line 
"\n";

$sujet "مرحبا بك في ملتقى";
$message_txt "مرحبا بك في الملتقى , نتمنى ان يعجبك درس رسال الرسالة";
$message_html "مرحبا بك في الملتقى , نتمنى ان يعجبك درس رسال الرسالة<strong>";

$logo   fopen("logo.png""r");
$attachement fread($logofilesize("logo.png"));
$attachement chunk_split(base64_encode($attachement));
fclose($logo);

 
//=====Création de la boundary.
$boundary "-----=".md5(rand());
$boundary_2 "-----=".md5(rand());
//==========
 
 
//=====Création du header de l'e-mail.
$header "From: \"Youssef esmail\"<[email protected]>".$line;
$header.= "Reply-to: \"Bilal eL Moussaoui\" <[email protected]>".$line;
$header.= "MIME-Version: 1.0".$line;
$header.= "Content-Type: multipart/mixed;".$line." boundary=\"$boundary\"".$line;
//==========
 
$message $line."--".$boundary.$line;
$message.= "Content-Type: multipart/alternative;".$line." boundary=\"$boundary_2\"".$line;
$message.= $line."--".$boundary_2.$line;


$message.= "Content-Type: text/plain; charset=\"ISO-8859-1\"".$line;
$message.= "Content-Transfer-Encoding: 8bit".$line;
$message.= $line.$message_txt.$line;
//==========
 
$message.= $line."--".$boundary_2.$line;
 
$message.= "Content-Type: text/html; charset=\"ISO-8859-1\"".$line;
$message.= "Content-Transfer-Encoding: 8bit".$line;
$message.= $line.$message_html.$line;
//==========
 
$message.= $line."--".$boundary_2."--".$line;
//==========
 
 
 
$message.= $line."--".$boundary.$line;
 
//=====Ajout de la pièce jointe.
$message.= "Content-Type: image/jpeg; name=\"logo.png\"".$line;
$message.= "Content-Transfer-Encoding: base64".$line;
$message.= "Content-Disposition: attachment; filename=\"logo.png\"".$line;
$message.= $line.$attachement.$line.$line;
$message.= $line."--".$boundary."--".$line
//==========

mail($mail,$sujet,$message,$header);
?>

[size=large]توضيح مهم [/size] هذا الرمز

رمز PHP:
$line "\n"

صالح فقط في بريد hotmail ام الخوادم البريدية الاخرى فغير صالح , ويجب استعمال

رمز PHP:
$line "\n\r"

لذلك سنستعمل الشرط

رمز PHP:
$mail '[email protected]';
if (!
preg_match("#^[a-z0-9._-][email protected](hotmail|live|msn).[a-z]{2,4}$#"$mail)) 
{
    
$line "\n\r";
}
else
{
    
$line "\n";

حيث ان mail هو البريد المرسل اليه [size=large]تنويه[/size] عند الارسال سيظهر الخطا التالي

رمز PHP:
Warningmail() [function.mail]: Failed to connect to mailserver at "localhost" port 25verify your "SMTP" 
 
your "SMTP" and "smtp_port" setting in php.ini or use ini_set() in C:XXXXXX.php on line 
وقد تستائ , لانك تابعت هذا الدرس , وفي النهاية لم ترسل الرسالة , هذا لانه لايمكنه الاتصال الى خادم السيرفر من localhost ; جرب ارسالها من الاستضافة و السلام خير ختام

http://www.traidnt.net/vb/showthread.php?t=1827112