المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : تعلم كيف تعمل الفورم البريدي مع المرفقات


ABO Deema
11-01-2007, 12:52
السلام عليكم ورحمة الله وبركاته،،

لعل من عوامل نجاح أي موقع هو عامل التواصل ما بين صاحب الموقع والزوار. هذا التواصل قد يأخذ عدة صور منها:
1- وصلة ايميل
2- نموذج مراسلة
3- منتدى دعم
4- الشات
وقد تتعدد الخيارات إلى غيرها أيضا.

لكن ماذا لو كان بإمكان الزائر أن يقوم بكتابة رسالة إلى مدير الموقع وكذلك إرفاق صورة أو ملف مع الرسالة دون أن يتحرك الزائر من الصفحة. يعني لن يكون بحاجة إلى فتح برنامج البريد مثل Outlook ولا فتح بريده من خلال الياهو او الهوتميل،، بل يمكنه عمل كل ذلك من صفحة واحدة ومن موقعك مباشرة.

أليس هذا جميلا

لنبدأ بالأساسيات وهي الفورم البريدي العادي والذي يحتوي فقط على نص الرسالة وحقول الايميل للمرسل والمستقبل.

في البداية يجب علينا أن نقوم بتعريف المتغيرات وهي:
1- نص الرسالة
2- عنوان المرسل (الايميل)
3- عنوان المستقبل ( أنت)
4- عنوان الرسالة
5- حقل المرسل وهو الذي يصلك أنت مع الرسالة

الكود هو كالتالي:


<?php
$message = "Hello Someone\n this is a simple text email message\n";
$from = "someone@domain.com";
$to = "someone@anotherdomain.com";
$subject = "Simple Text Email";
$headers = "From: $from";
/* الآن أصبحنا جاهزين لإرسال أول رسالة نصية */
mail($to,$subject,$message,$headers);
?>

كما تلاحظون فإن هذه الرسالة لا تحتوي على أي فورم وإنما جميع البيانات التي بها تم كتابتها وتضمينها في الكود نفسه.

ولكن ماذا لو أردت أن تكون الرسالة ضمن فورم بريدي كما هو متعارف عليه، فماذا تفعل؟
الإجابة بسيطة
نحتاج إلى عمل فورم يحتوي على الحقول التالية:
1- اسم المرسل
2- عنوان الرسالة
3- ايميل المرسل
4- صندوق الرسالة
5- الايميل الذي تريد أن تستقبل عليه الرسالة (أنت)
6- زر الارسال

سيبدو الكود هكذا:

<?php
/* في البداية نقوم بالتحقق من أن الفورم جاهز */
/* وأن زر الارسال لم يتم الضغط عليه */

if(!isset($submit)){ // خاصية التحقق
echo "<form action='$_SERVER[PHP_SELF]' method='post'> // اعلام الفورم أننا سنستخدم خاصية الايميل من البي اتش بي
Name:<input type='text' name='name'><br> // هذا هو حقل اسم المرسل
Subject:<input type='text' name='subject'><br> // هذا هو حقل اسم الموضوع
Email:<input type='text' name='email'><br> // هذا هو حقل ايميل المرسل
Message:<br>
<textarea name='message' cols='40' rows='15'></textarea><br> // هذا هو حقل صندوق النصوص او الرسالة
<input type='submit' name='submit' value='send'> // هذا هو زر الارسال
</form>";
/* بعد أن يتم ضغط زر الارسال يتم تنفيذ الخطوة التالية */
}else{
$to="myemail@mydomain.com"; // هذا هو الايميل الذي تريد أن تستقبل عليه الرسالة

$from=$_POST['email']; // يتم هنا تخزين ايميل الشخص المرسل
$message=$_POST['message']; //يتم هنا تخزين نص الرسالة
$subject=$_POST['subject']; // يتم هنا تخزين عنوان الرسالة
$submit=$_POST['submit']; // وهنا أمر التنفيذ بارسال الرسالة
/* بعدها يقوم السكريبت بعملية الارسال ويتضمن البيانات التي تم تخزينها عبر دالة الايميل*/

$headers = "From: $from"; //عندما تصلك الرسالة سيكون هذا هو اول سطر تراه وفيه ايميل الشخص المرسل
if(mail($to,$subject,$message,$headers)){ // هذه هي دالة الايميل وتحتوي على
/*
$to // ايميل الذي سوف يستقبل الرسالة
$subject // عنوان الرسالة
$message // نص الرسالة
$headers // ايميل الشخص الذي ارسل الرسالة
*/

echo "Email Sent"; // يتم طباعة الجملة التي تفيد أن الايميل تم ارساله بصورة صحيحة
}else{ // او
echo "Email Sending Failed"; // يتم طباعة أن هناك خلل ولم يتم ارسال الرسالة
}
}
?>


حسنا ماذا لو أردنا أن نرسل الايميل ولكن هذه المرة بنسق الـ HTML فما هي الطريقة؟

الطريقة سهلة جدا ومشابهة للطريقة التي شرحناه سابقا مع اضافة جديدة وبسيطة وهي:


$headers .= "Content-type: text/html\r\n";

ويفيد هذا الأمر في طباعة الرسالة بصيغة الـ HTML وليس فقط عرض النص بطريقة عادية.
والكود هو كالتالي:

<?php
$message = "<html><head></head><body bgcolor='#EEEEEE'>"; // نقوم هنا بكتابة الوسوم لصفحة الهتمل
$message .= "<p align='center'>This is my first html email</p>"; // هنا نضع تنسيق بسيط من توسيط وخلافه للنص المراد ارساله
$message .= "</body></html>"; // اغلاق الوسوم لصفحة الهتمل
$from = "someone@domain.com"; // نضع بريد الشخص المرسل
$to = "someone@anotherdomain.com"; // نضع هنا بريد الشخص المستقبل للرسالة
$subject = "Simple Text Email"; // نضع هنا عنوان الرسالة
$headers = "From: $from"; // سيتم هنا تخزين ايميل الشخص المرسل
$headers .= "Content-type: text/html\r\n"; // تحديد أن الرسالة هي بنسق الهتمل

mail($to,$subject,$message,$headers); // وهذه هي دالة الايميل كما شرحناها سابقا
?>


حسنا لنجمع الخير على البركة ونقوم بعمل سوبر ايميل فورم

الهدف:
إنشاء فورم بريدي يمكن من خلاله إرسال رسالة نصية بصيغة الـ HTML مع إمكانية وضع مرفقات مع الرسالة.



تعريفات ضرورية:

1- دالة البريد

mail()

دالة البريد الإلكتروني وتستخدم في ارسال البريد الإلكتروني وهي في ابسط صورة بهذا الشكل:

mail($to,$subject,$message,$headers)

2- إيضاحات وتعريفات

Multipurpose Internet Mail Extensions (MIME)

يقتصر مجال دالة الايميل في البي اتش بي على ارسال النصوص بدون تنسيق plain text لذا يجب استخدام وصلة اضافية تسمى MIME وتعني « البريد الإلكتروني متعدد الوظائف».

chunk_split(base64_encode($file)

تقوم هذه الدالة بتقطيع الرسالة الى اجزاء صغيرة على نظام 64 بيت وفائدتها أنها تقوم بالمحافظة على البيانات بالصيغة بيناري Binary حتى يسهل نقلها على انظمة مختلفة. علما أن البيانات على نظام 64 بيت تستهلك مساحة اكبر بحوالي 33% من المساحة الاصلية للبيانات.

•••••••••••••••••••••••••••••••••••••••••••••••••• •••••••••••••••
fopen
تقوم هذه الدالة بفتح الملف المرفق
•••••••••••••••••••••••••••••••••••••••••••••••••• •••••••••••••••
fread
هذه الدالة تستفيد من نتيجة الدالة السابقة fopen وتقوم بتقدير حجم الملف
•••••••••••••••••••••••••••••••••••••••••••••••••• •••••••••••••••
fclose
تقوم هذه الدالة بإغلاق الملف المرفق
•••••••••••••••••••••••••••••••••••••••••••••••••• •••••••••••••••

3- السكريبت مع الشرح

<html dir=rtl>
<body>
<center>
<?php
if(!isset($submit)){ // أداة الشرط للتأكد من أن الاستمارة لم يتم ارسالها بعد
?>
<form action="<?php $_SERVER['PHP_SELF']; ?>" method="post" // استخدام خاصية البريد الإلكتروني في الب اتش بي
enctype="multipart/form-data">
<table>
<tr>
<td style="font-size: 12pt; color: #0000FF; font-weight: bold">إلى:</td>
<td><input style='BORDER-RIGHT: #4c77b6 1px solid; BORDER-TOP: #4c77b6 1px solid; FONT-SIZE: 11px; VERTICAL-ALIGN: middle; BORDER-LEFT: #4c77b6 1px solid; BORDER-BOTTOM: #4c77b6 1px solid; FONT-FAMILY: Tahoma, Arial; BACKGROUND-COLOR: #dfe6ef' type="text" name="to" size="40"/></td>
</tr>
<tr>
<td style="font-size: 12pt; color: #0000FF; font-weight: bold">من:</td>
<td><input style='BORDER-RIGHT: #4c77b6 1px solid; BORDER-TOP: #4c77b6 1px solid; FONT-SIZE: 11px; VERTICAL-ALIGN: middle; BORDER-LEFT: #4c77b6 1px solid; BORDER-BOTTOM: #4c77b6 1px solid; FONT-FAMILY: Tahoma, Arial; BACKGROUND-COLOR: #dfe6ef' type="text" name="from" size="40" /></td>
</tr>
<tr>
<td style="font-size: 12pt; color: #0000FF; font-weight: bold">الموضوع:</td>
<td><input style='BORDER-RIGHT: #4c77b6 1px solid; BORDER-TOP: #4c77b6 1px solid; FONT-SIZE: 11px; VERTICAL-ALIGN: middle; BORDER-LEFT: #4c77b6 1px solid; BORDER-BOTTOM: #4c77b6 1px solid; FONT-FAMILY: Tahoma, Arial; BACKGROUND-COLOR: #dfe6ef' type="text" name="re" size="40" /></td>
</tr>
<tr>
<td style="font-size: 12pt; color: #0000FF; font-weight: bold">نص الرسالة:</td>
<td><textarea style='BORDER-RIGHT: #4c77b6 1px solid; BORDER-TOP: #4c77b6 1px solid; FONT-SIZE: 11px; VERTICAL-ALIGN: middle; BORDER-LEFT: #4c77b6 1px solid; BORDER-BOTTOM: #4c77b6 1px solid; FONT-FAMILY: Tahoma, Arial; BACKGROUND-COLOR: #dfe6ef' cols="60" rows="15" name="comments"></textarea></td>
</tr>
<tr>
<td style="font-size: 12pt; color: #0000FF; font-weight: bold">المرفقات:</td>
<td><input style='BORDER-RIGHT: #4c77b6 1px solid; BORDER-TOP: #4c77b6 1px solid; FONT-SIZE: 11px; VERTICAL-ALIGN: middle; BORDER-LEFT: #4c77b6 1px solid; BORDER-BOTTOM: #4c77b6 1px solid; FONT-FAMILY: Tahoma, Arial; BACKGROUND-COLOR: #dfe6ef' type="file" name="att" size="26" /></td>
</tr>
<td colspan="2"><input style='BORDER-RIGHT: #4c77b6 1px solid; BORDER-TOP: #4c77b6 1px solid; FONT-SIZE: 11px; VERTICAL-ALIGN: middle; BORDER-LEFT: #4c77b6 1px solid; BORDER-BOTTOM: #4c77b6 1px solid; FONT-FAMILY: Tahoma, Arial; BACKGROUND-COLOR: #dfe6ef' type="submit" value="ارسل" /></td>
</tr>
</table>
</form>
<?php
}else{

$fp = fopen( $att_name, "r"); // تقوم هذه الدالة بفتح الملف المرفق

$file = fread( $fp, $att_size ); // هذه الدالة تستفيد من نتيجة الدالة السابقة وتقوم بتقدير حجم الملف

/*
تبدأ هنا عملية التشفير للملف المرفق ليتناسب مع دالة الايميل
*/
$file = chunk_split(base64_encode($file)); // تقوم هذه الدالة بتقطيع الرسالة الى اجزاء صغيرة حتى يسهل نقلها
$num = md5( time() ); // تقوم هذه الدالة بإعادة ترميز نصي هيكسا ديسمال بطول 32 محارف

/*
نبدأ الآن تعريف حقل الشخص المرسل
*/
$hdr = "From:$from\r\n";
$hdr .= "MIME-Version: 1.0\r\n";
$hdr .= "Content-Type: multipart/mixed; ";
$hdr .= "boundary=$num\r\n";
$hdr .= "--$num\r\n";
/*
نبدأ الآن تعريف حقل نص الرسالة
*/
$hdr .= "Content-Type: text/plain\r\n";
$hdr .= "Content-Transfer-Encoding: 8bit\r\n\n";
$hdr .= "$comments\r\n";
$hdr .= "--$num\n";

/*
نبدأ الآن تعريف حقل المرفقات
*/
$hdr .= "Content-Type: $att_type; ";
$hdr .= "name=\"$att_name\"\r\n";
$hdr .= "Content-Transfer-Encoding: base64\r\n";
$hdr .= "Content-Disposition: attachment; ";
$hdr .= "filename=\"$att_name\"\r\n\n";
$hdr .= "$file\r\n";
$hdr .= "--$num--";

/*
تقوم هذه الدالة بإرسال الايميل بعض تضمين المتغييرات التي عرفناه في الأعلى
*/
mail( $to, $re, $comments, $hdr);

/*
نقوم الآن بإغلاق دالة القراءة
*/
fclose( $fp ); // هذه الدالة تقوم بإغلاق ملف المرفقات
}
?>
<p><font color="#C0C0C0" face="Tahoma">إعداد المنهال</font></p>
</center>
</body>
</html>

اتمنى أن يكون الشرح واضحا وإذا في سؤال نحن بالخدمة

mostfa
18-03-2007, 06:52
شرح جميل مشكور يا غالى

ABO Deema
18-03-2007, 10:44
يا هلا بيك يا شريك

ولا شكر على واجب