الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كود لإرسال ايميل بمرفقات والسؤال هل يمكن تحسينه؟

بدأه Xacker في 27 نوفمبر 2009 · 11 رد · 1,012 مشاهدة · في منتدى تطوير المواقع بـ PHP
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

احتجت إلى كتابة كود لإرسال ايميل بمرفقات (عبارة عن صور منتقاة في مصفوفة يتم تحديد روابطها من الويب)، عدد الصور تقريباً 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 :-(
?>

آراؤكم؟

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#2

ما زال الاستفسار مطروحاً.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#3

يا أخي لما كل هاته الأسئلة

أنا بعضها لم أفهمها

الجزائر قلبي وغزة نبضه

2522zn0.png
#4
dz-php كتب:

يا أخي لما كل هاته الأسئلة

huh.gif

dz-php كتب:

أنا بعضها لم أفهمها

قل لي ما لم تفهمه وأنا أعيد صياغته بشكل آخر!

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#5

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

 

<?php 
function Echo_cids($MaxCids)
{
for( $index=0; $index<=$MaxIndexes; $index++)
	{echo $cid[$index]."</br>";}
}

function ShowImgs($MaxIndexes)
{
for($index=0; $index<=$MaxIndexes; $index++)
	{echo  "<img src=\"cid:\"".$cid[$index]." border=1></BR>";}
}

?> 


....
<?PHP
$img = array();
// 01 and 1 arn't the same ;)
for($index=0; $index<50; $index++)
{$img[$index]="http://domain.com/path/".$index.".jpg";}
?p>

......
and lots of echos 

<?php 
// Define $MaxCids value
echo Echo_cids($MaxCids);
?> 

--<?php echo $random_hash_alt; echo "\n"; ?> 
Content-Type: text/html; charset="Windows-1256" 
Content-Transfer-Encoding: 8bit 

<center> 
blah

blah

blah

and lots of HTML with echos




<?php 
   // Define $MaxIndexes value
   echo ShowImgs($MaxIndexes)
?>
...

تم تعديل هذه المشاركة بواسطة بن العيد في 1 ديسمبر 2009 في 21:38

1
#6

من ناحيتي لا أفضل إرسال مرفقات مع الإيميل لآن هذا يعتمد على حجم بريد المرسل له , لذلك لماذا لا تقم بعمل رفع للصور في البدايه ومن ثم إرفاقها كروابط في نفس الرساله بهذا يكون حجم الرساله صغير ولن يحدث مشاكل فيما لو قمت بإرسال الرساله إلى عدد كبير لآن هذا يؤثر في السيرفر في حال كان حجم الرساله كبير

أعذرني فأنا مشوش لذلك لم أنظر إلى الكود المرفق لأخبرك بإمكانيه التعديل أو لا :)

صحيح يمكنك إستخدام الأجاكس في حال كانت المشكله هي التايم آوت Time out وذلك من خلال رفع صورة صورة

CMS Sfhati , Website Generator


نظام إدارة المحتوى صفحتي ... جربه الآن 


 


small-logo.png

#7

السلام عليكم،

كنت أتابع الجزء من الكود الذي وضعه الأخ بن العيد البارحة حتى غلبني التعب ولم أستطع أن أستخلص منه ما كنت أعتقده المشكلة..

فهل لك أخي الكريم أن تذكر لي الغاية من إدخال هذه الوظائف وما المشكلة التي تحاول حلّه بها؟

بالنسبة لسؤالك أخي bastr3، الخاص بإرسال الملفات كمرفقات، السكربت خاص، وليس للاستخدامه في منظومة برمجية أو ما شابه.

أمر آخر وهو السبب الذي دفعني أكثر إلى إرفاق الملفات وليس استخدام ترميزها فقط هو أنها لم تكن تظهر على IE وتبقى كمربعات X لا يتم تحميلها :huh:

نفس الأمر بالنسبة لـ FF أو باقي المتصفحات الاختلاف الوحيد هو أنها تحل عليهم لو قمت بتصفح صفحة تحوي على الصور بذات الروابط ومن ثم أعدت تحديث صفحة البريد.. cache؟ :huh:

لكن الطريقة لا تنفع مع IE وبكل الأحوال الفكرة فاشلة لأنها على جهازي والهدف أن يتم تحميلها في جهاز من سيستقبل البريد وليس عندي فقط!

* بالمناسبة جربت حتى لو صورة واحدة وليس 50 ولم تظهر :huh:

لذلك قمت بإرفاقها ولم أجد أي مشكلة أبداً مع الصور حينها، يتم تحميلها بشكل جيد على كافة المتصفحات.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#8
اقتباس
هل من الممكن تحسين الكود بشكل ما ليكون التنفيذ أسرع، بحيث لا يتم الاعتماد على سرعة التصفح لدى الزائر والتي تجعل من مسألة تنفيذ file_get_contents() بطيئة وإنما تتم عملية الجلب من طرف السيرفر مثلاً؟

بما أن كود php يتم تنفيذه في ناحية السيرفر إذن تنفيذ file_get_contents سيعتمد على سرعة السيرفر وليس على سرعة الانترنت لدى الزائر ..

تم تعديل هذه المشاركة بواسطة المبرمج أحمد في 2 ديسمبر 2009 في 19:12

سبحان الله وبحمده ... سبحان الله العظيم

#9
المبرمج أحمد كتب:

بما أن كود php يتم تنفيذه في ناحية السيرفر إذن تنفيذ file_get_contents سيعتمد على سرعة السيرفر وليس على سرعة الانترنت لدى الزائر ..

شكراً يا ريّس أحمد على التوضيح.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#10

حلوه الفكرة :) فكرة إرسال الصور لكي تظهر

على كل عملت كود ممكن ترفق من خلاله صورة كمرفقات وماجربت أرسلها من خلال الرساله نفسها

على كل هاد مثال للسكريبت

http://www.urorbit.com/xacker.php?email=youmail@domain.com

رح تصلك رساله فيها صورتين

حاولت الحين أعمل عرض للصورة بس ماعرفت كيف :)

وهاد الكود :

	<?php
 	if($_GET[email]){


$email_from = "bassam@saprinna.com"; // Who the email is from
$email_subject = "hi man"; // The Subject of the email
$email_message = "this from urorbit! <br /><img src='urorbit.gif' />"; // Message that the email has in it

$email_to = $_GET[email]; // Who the email is too

$headers = "From: ".$email_from;



$semi_rand = md5(time());
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";

$headers .= "\nMIME-Version: 1.0\n" .
"Content-Type: multipart/mixed;\n" .
" boundary=\"{$mime_boundary}\"";

$email_message .= "This is a multi-part message in MIME format.\n\n" .
"--{$mime_boundary}\n" .
"Content-Type:text/html; charset=\"iso-8859-1\"\n" .
"Content-Transfer-Encoding: 7bit\n\n" .
$email_message . "\n\n";


/** file 1 */
$fileatt = "images/logogifempty.gif"; // Path to the file
$fileatt_type = "image/gif"; // File Type
$fileatt_name = "urorbit.gif"; // Filename that will be used for the file as the attachment
$file = fopen($fileatt,'rb');
$data = fread($file,filesize($fileatt));
fclose($file);
$data = chunk_split(base64_encode($data));
$email_message .= "--{$mime_boundary}\n" .
"Content-Type: {$fileatt_type};\n" .
" name=\"{$fileatt_name}\"\n" .
"Content-Transfer-Encoding: base64\n\n" .
$data . "\n\n" .
"--{$mime_boundary}\n";

/** file 2 */
$fileatt = "images/160x70.png"; // Path to the file
$fileatt_type = "image/png"; // File Type
$fileatt_name = "urorbit-tools.png"; // Filename that will be used for the file as the attachment
$file = fopen($fileatt,'rb');
$data = fread($file,filesize($fileatt));
fclose($file);
$data = chunk_split(base64_encode($data));
$email_message .= "--{$mime_boundary}\n" .
"Content-Type: {$fileatt_type};\n" .
" name=\"{$fileatt_name}\"\n" .
"Content-Transfer-Encoding: base64\n\n" .
$data . "\n\n" .
"--{$mime_boundary}\n";


$ok = @mail($email_to, $email_subject, $email_message, $headers);

if($ok) {
echo "<font face=verdana size=2>The file was successfully sent!</font>";
} else {
die("Sorry but the email could not be sent. Please go back and try again!");
}
}
?>
1

CMS Sfhati , Website Generator


نظام إدارة المحتوى صفحتي ... جربه الآن 


 


small-logo.png

#11

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

Xacker كل ما قمت به هو تحسين الشفرة و تحويل التعليمات المتكررة إلى حلقات معرفة في دوال.

#12

أعتذر عن عدم المتابعة في الموضوع في الأيام الماضية فقد كان لدي امتحان اليوم، سأعود للإطلاع على المشاركات بشكل أفضل - لم أنسى - وأشكر المساهمين فيه سلفاً، الأخوة bastr3 و بن العيد.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…