سؤال

تخيل المستخدم الذي ترغب في وضع نموذج على موقعه على الانترنت التي تسمح زوار موقع لتحميل الملفات و رسالة بسيطة ، والتي سوف يكون على الفور عبر البريد الالكتروني (أي ملف لا يتم تخزينها على الملقم أو إذا كان ثم مؤقتا فقط) كملف مرفق مع ملاحظة في نص الرسالة.

ترى المزيد من التفاصيل في http://a2zsollution.com/php-secure-e-mail/

ما هو أبسط طريقة لتحقيق هذا الهدف ؟

أبسط من حيث:

  • حجم (رمز الجولف)
  • سهولة التنفيذ (مثالي كلها في ملف واحد ، يحتاج قليل إلى أي موارد خارجية)
  • لا غموض أجل التشويش (المفاضلات عن حجم ما يرام)
  • الذاتي الواردة سبيل المثال (إذا دعا من دون شكل آخر ، فإنه يعرض النموذج)

هذا هو تقريبا عكس: كيفية الحصول على البريد الإلكتروني والمرفقات من PHP.تقريبا قد تم الرد عليها في تجميع البريد الإلكتروني مع مرفقات متعددة في PHP, لكن لا تظهر في الواقع رمز.

هل كانت مفيدة؟

المحلول

من أجل المتعة فقط اعتقدت أنني سأقوم بضربه.لقد انتهى الأمر إلى أن يكون الأمر أكثر تعقيدًا مما كنت أعتقد لأنني لم أفهم تمامًا كيفية عمل الجزء الحدودي، وفي النهاية توصلت إلى أن البداية والنهاية "--" كانت مهمة واختفت.

<?php
    if(isset($_POST['submit']))
    {
        //The form has been submitted, prep a nice thank you message
        $output = '<h1>Thanks for your file and message!</h1>';
        //Set the form flag to no display (cheap way!)
        $flags = 'style="display:none;"';

        //Deal with the email
        $to = 'me@example.com';
        $subject = 'a file for you';

        $message = strip_tags($_POST['message']);
        $attachment = chunk_split(base64_encode(file_get_contents($_FILES['file']['tmp_name'])));
        $filename = $_FILES['file']['name'];

        $boundary =md5(date('r', time())); 

        $headers = "From: webmaster@example.com\r\nReply-To: webmaster@example.com";
        $headers .= "\r\nMIME-Version: 1.0\r\nContent-Type: multipart/mixed; boundary=\"_1_$boundary\"";

        $message="This is a multi-part message in MIME format.

--_1_$boundary
Content-Type: multipart/alternative; boundary=\"_2_$boundary\"

--_2_$boundary
Content-Type: text/plain; charset=\"iso-8859-1\"
Content-Transfer-Encoding: 7bit

$message

--_2_$boundary--
--_1_$boundary
Content-Type: application/octet-stream; name=\"$filename\" 
Content-Transfer-Encoding: base64 
Content-Disposition: attachment 

$attachment
--_1_$boundary--";

        mail($to, $subject, $message, $headers);
    }
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>MailFile</title>
</head>

<body>

<?php echo $output; ?>

<form enctype="multipart/form-data" action="<?php echo $_SERVER['PHP_SELF'];?>" method="post" <?php echo $flags;?>>
<p><label for="message">Message</label> <textarea name="message" id="message" cols="20" rows="8"></textarea></p>
<p><label for="file">File</label> <input type="file" name="file" id="file"></p>
<p><input type="submit" name="submit" id="submit" value="send"></p>
</form>
</body>
</html>

مجردة جدًا حقًا، ومن الواضح أن استخدام CSS المضمّن لإخفاء النموذج هو أمر رخيص بعض الشيء ومن المؤكد أنك تريد المزيد من التعليقات للمستخدم!أيضًا، من المحتمل أن أقضي وقتًا أطول قليلاً في تحديد نوع المحتوى الفعلي للملف، بدلاً من الغش واستخدام application/octet-stream ولكن هذا الجزء مثير للاهتمام تمامًا.

نصائح أخرى

مزيج من هذا http://www.webcheatsheet.com/PHP/send_email_text_html_attachment.php#attachment

مع مثال ملف تحميل PHP سيعمل.في مثال ملف التحميل بدلاً من استخدام move_uploaded_file لنقله من المجلد المؤقت، يمكنك فتحه فقط:

$attachment = chunk_split(base64_encode(file_get_contents($tmp_file))); 

أين $tmp_file = $_FILES['userfile']['tmp_name'];

وأرسله كمرفق مثل بقية المثال.

الكل في ملف واحد / متضمن ذاتيًا:

<? if(isset($_POST['submit'])){
//process and email
}else{
//display form
}
?>

أعتقد أنه تمرين سريع للحصول على ما تحتاجه بناءً على المثالين المتاحين أعلاه.

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

هذه المادة "كيفية إنشاء PHP القائمة على نموذج البريد الإلكتروني مع ملف مرفق"يمثل خطوة بخطوة تعليمات كيفية تحقيق الشرط الخاص بك.

اقتباس:

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

وتتكون من الخطوات التالية:

  • HTML شكل مع تحميل ملف مربع
  • الحصول على الملف الذي تم تحميله في PHP السيناريو
  • التحقق من حجم و تمديد الملف الذي تم تحميله
  • نسخ الملف الذي تم تحميله
  • إرسال البريد الإلكتروني

كامل رمز المثال يمكن تحميلها هنا

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

أما بالنسبة لإرسال البريد الإلكتروني، بريد زند يتمتع بواجهة سهلة الاستخدام للغاية للتعامل مع مرفقات البريد الإلكتروني.نحن نعمل مع تثبيت Zend Framework بالكامل، لكنني متأكد تمامًا من أنه يمكنك فقط تثبيت مكتبة Zend_Mail دون الحاجة إلى أي وحدات أخرى للتبعيات.

باستخدام Zend_Mail، يعد إرسال بريد إلكتروني يحتوي على مرفق أمرًا بسيطًا مثل:

$mail = new Zend_Mail();
$mail->setSubject("My Email with Attachment");
$mail->addTo("foo@bar.baz");
$mail->setBodyText("Look at the attachment");
$attachment = $mail->createAttachment(file_get_contents('/path/to/file'));
$mail->send();

إذا كنت تبحث عن حزمة مكونة من ملف واحد للقيام بالنموذج/البريد الإلكتروني/المرفقات بالكامل، فأنا لم أر واحدة.لكن المكونات الفردية متوفرة بالتأكيد وسهلة التجميع.أصعب شيء في المجموعة بأكملها هو مرفق البريد الإلكتروني، والذي تجعله التوصية أعلاه أمرًا بسيطًا للغاية.

لم أختبر جزء البريد الإلكتروني من هذا (مربع الاختبار الخاص بي لا يرسل بريدًا إلكترونيًا) ولكن أعتقد أنه سيعمل.

<?php
if ($_POST) {
$s = md5(rand());
mail('email@example.com', 'attachment', "--$s

{$_POST['m']}
--$s
Content-Type: application/octet-stream; name=\"f\"
Content-Transfer-Encoding: base64
Content-Disposition: attachment

".chunk_split(base64_encode(join(file($_FILES['f']['tmp_name']))))."
--$s--", "MIME-Version: 1.0\r\nContent-Type: multipart/mixed; boundary=\"$s\"");
exit;
}
?>
<form method="post" enctype="multipart/form-data" action="<?php echo $_SERVER['PHP_SELF'] ?>">
<textarea name="m"></textarea><br>
<input type="file" name="f"/><br>
<input type="submit">
</form>

الكمثرى::Mail_Mime؟بالتأكيد، تبعية PEAR لملفين (على الأقل) (فقط mail_mime نفسه إذا قمت بتحريره لإزالة تبعيات الكمثرى)، لكنه يعمل بشكل جيد.بالإضافة إلى ذلك، فإن معظم الخوادم تحتوي على PEAR مثبتة إلى حد ما، وفي أفضل الحالات تحتوي على Pear/Mail وPear/Mail_Mime.شيء لا يمكن قوله بالنسبة لمعظم المكتبات الأخرى التي تقدم نفس الوظيفة.

قد تفكر أيضًا في البحث عن PHP امتداد IMAP.إنها أكثر تعقيدًا بعض الشيء، وتتطلب مزيدًا من الإعداد (لا يتم تمكينها أو تثبيتها افتراضيًا)، ولكن يجب أن تكون أكثر كفاءة في تجميع الرسائل وإرسالها إلى خادم قادر على الوصول إلى IMAP.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top