Basit PHP form: e-Eklenti (kod golf)

6 Cevap php

Bir web sitesi ziyaretçi bir dosya ve hemen ardından ise (yani, dosya sunucusunda depolanan veya değil gönderilecektir olacak basit bir mesaj, upload sağlayacak kendi web sitesinde bir form koymak istiyorum bir kullanıcı düşünün sadece geçici) ileti gövdesinde not ile bir dosya eki olarak.

http://a2zsollution.com/php-secure-e-mail/ daha fazla ayrıntı görmek

Bunu gerçekleştirmek için en basit yolu nedir?

Açısından basit:

  • Boyut (kod golf)
  • Uygulama kolaylığı (ideal hepsi bir dosyada, hiçbir dış kaynaklara birkaç gerekiyor)
  • (Boyutu için ödünler ince) şaşırtmaca uğruna karartılmış değil
  • Kendinden örnek alan (form post olmadan çağrılırsa, bu formu görüntüler)

Bu, yaklaşık tersidir: How to get email and their attachments from PHP. Neredeyse Compiling email with multiple attachments in PHP içinde cevap olabilirdi, ama aslında kod görünmüyor.

6 Cevap

Sadece eğlenmek için ben onu vurmak düşündüm. '-' Önemli ve o gitti kapalı idi ben ben tam sınır kısmı nasıl çalıştığını anlamak değil gitti çünkü, sonunda ben başlangıç ​​ve bitiş amele dışarı düşündüm daha yanıltıcıdır olarak sona erdi.

<?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>

Çok Barebone gerçekten, ve tabii ki formu gizlemek için kullanarak satır içi CSS biraz ucuz ve neredeyse kesinlikle kullanıcıya biraz daha fazla geri bildirim isterdim! Ayrıca, muhtemelen oldukça hile ve application / octet-stream kullanmak yerine, dosya için gerçek Content-Type ne olduğunu çalışma biraz daha vakit geçirmek istiyorum ama bu bölümü oldukça ilginçtir.

Bu http://www.webcheatsheet.com/PHP/send_email_text_html_attachment.php#attachment bir arada

php dosya yükleme örnek ile çalışmak istiyorsunuz. Dosya yükleme örnekte yerine geçici klasörden taşımak için move_uploaded_file kullanarak sadece bunu açacak:

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

burada $tmp_file = $_FILES['userfile']['tmp_name'];

ve örnek kalanı gibi bir eki olarak gönderebilirsiniz.

All in one file / self contained:

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

Ben yukarıdaki iki mevcut örneklere dayalı çalışma ne gerek almak için onun hızlı bir egzersiz düşünüyorum.

P.S. Apache onunla istediğini yapmak için PHP için birlikte geçirmeden önce yere tarih almak gerekiyor. Bu yapılandırma dosyasında değiştirildi sürece varsayılan olarak sisteminizin temp klasörü olacaktır.

Bu makalede, "How to create PHP based email form with file attachment" gereksinimi ulaşmak için nasıl adım adım yönergeler sunuyor.

Alıntı:

This article shows you how to create a PHP based email form that supports file attachment. The article will also show you how to validate the type and size of the uploaded file.

Bu, aşağıdaki adımlardan oluşur:

  • Dosya yükleme kutusu ile HTML formu
  • Getting the uploaded file in the PHP script
  • Validating the size and extension of the uploaded file
  • Yüklenen dosyayı kopyalayın
  • E-posta gönderme

Tüm örnek kodu indirebilirsiniz here

Ek olarak e-postaya dosya eklemek için, bu will kısaca sunucuda depolanan gerekir. Bu onunla bittikten sonra bile, bir tmp konuma yerleştirmek için silin, önemsiz bulunuyor.

E-posta gelince, Zend Mail e-posta ekleri ile ilgili arabirimi kullanmak için bir çok kolay sahiptir. Biz yüklü bütün Zend Framework ile çalışan, ama ben sadece bağımlılıkları için diğer modülleri ihtiyaç duymadan Zend_Mail kütüphane kurmak olabilir eminim.

: Zend_Mail ile eki olan bir e-posta göndermek kadar basittir

$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();

Eğer tüm form / e-posta / eki ​​şey yapmak için bir tek dosya paketi arıyorsanız, ben görmedim. Fakat tek tek bileşenleri kesinlikle kullanılabilir ve montajı kolaydır. Bütün demet trickiest şey yukarıdaki öneri çok basit hale getirir e-posta eki vardır.

Ben bu e-posta kısmını test değil (benim test kutusu e-posta göndermek değil) ama çalışacağını düşünüyorum.

<?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>

PEAR::Mail_Mime? Tabii, (dk) 2 dosya (Eğer armut bağımlılıkları kaldırmak için düzenlemek eğer sadece kendisi mail_mime), ama iyi çalıştığını ARMUT bağımlılık. Ayrıca, en sunucuları ölçüde yüklü PEAR var ve en iyi durumda onlar Armut / Posta ve Armut / Mail_Mime var. Aynı işlevselliği sunan diğer çoğu kütüphaneler için söylenemez şey.

Ayrıca PHP'nin IMAP extension ile bakarak düşünebilirsiniz. Bu biraz daha karmaşık ve daha kurulum (etkin veya varsayılan olarak yüklü değil) gerektirir, ancak compilng ve IMAP yetenekli sunucusu iletileri göndermeyi de şart daha verimlidir.