السلام عليكم ورحمة الله وبركاته
احتجت إلى كتابة كود لإرسال ايميل بمرفقات (عبارة عن صور منتقاة في مصفوفة يتم تحديد روابطها من الويب)، عدد الصور تقريباً 50، حجمها يصل إلى حوالي 7,5 ميغا.
المشكلة الأهم التي تظهر هي أن الصفحة على الرغم من اكتمال تنفيذها والإرسال بنجاح إلا أنه في نهاية التنفيذ لا يكتمل تحميلها بمحتوى فارغ وعبارة تدل على نجاح الإرسال وإنما يظهر رد في المتصفح دليل فشل استلام رد من السيرفر(ربما لأن العملية التي تتم في الصفحة تأخذ وقت أطول من الوقت الذي ينتظره المتصفح؟) -- على Firefox حصراً وتعمل بشكل طبيعي على IE8 :dry:
المشكلة الأخرى هي أن العنوان يصل بترميز غير مقروء، ولم تفلح محاولاتي في جعله يظهر بالشكل الصحيح، على FF أيضاً ويظهر بشكل صحيح على IE8، هل من الممكن المساعدة في هذا الأمر؟
المشكلة الثالثة (وهي ليست فعلياً بمشكلة) أنني لو أردت أن أقوم بوضع شرط IF في بداية شفرة الـ PHP فسيتعارض هذا مع إغلاقها من أجل محتويات الـ MIME body التي يتم إدخالها بـ buffer بواسطة ob_start()
كوني سأضطر إلى وضع قوس بادئ { ولن أستطيع إغلاقه... أو بالأحرى لم أتمكن من تحديد طريقة صحيحة لإغلاقه مع الإبقاء على الشفرة كما هي بدون تعديلات كثيرة -إن أمكن- فهل هناك سبيل لهذا؟
أما فيما يتعلق بالاستفسارات فهو وحيد، من الواضح أن 50 صورة بحجم 7,5 ميغا إضافة إلى عملية جلبها من باقي المواقع، وتقطيعها إلى chunks وترميزها بـ base64 تأخذ وقت لا بأس به للتنفيذ، هل من الممكن تحسين الكود بشكل ما ليكون التنفيذ أسرع، بحيث لا يتم الاعتماد على سرعة التصفح لدى الزائر والتي تجعل من مسألة تنفيذ file_get_contents() بطيئة وإنما تتم عملية الجلب من طرف السيرفر مثلاً؟
هذا هو الكود المستخدم:
<?php
$to = "";
$subject = "عنوان الرسالة";
$random_hash_mixed = "0-".substr(md5(date('r', time())), 0, 9)."-1259226718=:13979";
$random_hash_alt = "0-".substr(sha1(date('r', time())), 0, 9)."-1259226718=:13979";
$headers = "From: sender name <sender_email@company.com>\r\nBcc: receiver name <receiver_email@company.com>\r\nReply-To: sender_email@company.com";
//add boundary string and mime type specification
$headers .= "\r\nContent-Type: multipart/mixed; charset=\"Windows-1256\"; boundary=\"".$random_hash_mixed."\"";
//list of images
$img = array(
"http://domain.com/path/01.jpg",
"http://domain.com/path/02.jpg",
"http://domain.com/path/03.jpg",
//...
//...
"http://domain.com/path/48.jpg",
"http://domain.com/path/49.jpg",
"http://domain.com/path/50.jpg"); //length isn't static
//generate CIDs
$cid[count($img)] = array();
$i = 0;
foreach ($img as $v)
{
$cid[$i] = md5($v); //generate unique cid based on URL (first reason for slow throughput)
$i++;
}
//define the body of the message.
ob_start(); //Turn on output buffering
?>
--<?php echo $random_hash_mixed; echo "\n"; ?>
Content-Type: multipart/alternative; boundary="<?php echo $random_hash_alt; ?>"
--<?php echo $random_hash_alt; echo "\n"; ?>
Content-Type: text/plain; charset="Windows-1256"
Content-Transfer-Encoding: 8bit
blah
blah
blah
blah
and lots of echos
<?php echo $cid[0]; ?>
<?php echo $cid[1]; ?>
<?php echo $cid[2]; ?>
//...
//...
<?php echo $cid[48]; ?>
<?php echo $cid[49]; ?>
<?php echo $cid[50]; ?>
--<?php echo $random_hash_alt; echo "\n"; ?>
Content-Type: text/html; charset="Windows-1256"
Content-Transfer-Encoding: 8bit
<center>
blah<br>
blah<br>
blah<br>
and lots of HTML with echos<br>
<br>
<img src="cid:<?php echo $cid[0]; ?>" border=1>
<P>
<img src="cid:<?php echo $cid[1]; ?>" border=1>
<P>
<img src="cid:<?php echo $cid[2]; ?>" border=1>
<P>
<!-- ...
...
... -->
<img src="cid:<?php echo $cid[48]; ?>" border=1>
<P>
<img src="cid:<?php echo $cid[49]; ?>" border=1>
<P>
<img src="cid:<?php echo $cid[50]; ?>" border=1>
</center>
--<?php echo $random_hash_alt; ?>
<?php
$i = 0;
foreach ($img as $v)
{
//read the atachment file contents into a string,
//encode it with MIME base64,
//and split it into smaller chunks
$attachment = chunk_split(base64_encode(file_get_contents($v))); //second reason for slow throughput
echo "\n";
echo "--".$random_hash_mixed."\n";
echo "Content-Type: image/jpeg; name=\"".basename($v)."\""."\n";
echo "Content-Transfer-Encoding: base64"."\n";
echo "Content-ID: <".$cid[$i].">"."\n";
echo "Content-Disposition: inline; name=\"".basename($v)."\""."\n\n";
echo $attachment."\n";
$i++;
}
?>
--<?php echo $random_hash_mixed; ?>--
<?php
$message = ob_get_clean();
$mail_sent = @mail( $to, $subject, $message, $headers );
echo $mail_sent ? "Mail sent" : "Mail failed"; //can't get the page to load correctly and display status on Firefox :-(
?>آراؤكم؟

