2009-05-05 9 views
22

Stellen Sie sich einen Benutzer vor, der ein Formular auf seiner Website platzieren möchte, das einem Website-Besucher das Hochladen einer Datei und einer einfachen Nachricht ermöglicht, die sofort per E-Mail gesendet wird. die Datei wird nicht auf dem Server gespeichert, oder wenn es dann nur temporär ist) als Dateianhang mit der Notiz im Nachrichtentext.Einfaches PHP-Formular: Anhang an E-Mail (Code Golf)

mehr Details bei http://a2zsollution.com/php-secure-e-mail/

Was ist der einfachste Weg dies zu erreichen?

Simplest bezüglich:

  • Größe (Code Golf)
  • Einfache Implementierung (idealerweise alle in einer Datei benötigt, wenig bis gar keine externen Ressourcen)
  • Nicht aus Gründen der Verschleierung verschleierten (Vor- und Nachteile für die Größe sind in Ordnung)
  • Selbst Beispiel enthalten (wenn ohne Form-Post genannt, es die Form zeigt)

Dies ist fast das Gegenteil von: How to get email and their attachments from PHP. Es hätte fast in Compiling email with multiple attachments in PHP beantwortet werden können, aber es zeigt Code tatsächlich nicht.

+0

Ich würde meine eigene Lösung anbieten, aber nach bisherigen Code-Golf-Wettbewerben zu urteilen, würde ich gründlich geschlagen werden! –

Antwort

68

Nur zum Spaß dachte ich, ich würde es umwerfen. Am Ende war es schwieriger, als ich dachte, weil ich nicht ganz verstand, wie der Grenzbereich funktioniert, und schließlich habe ich herausgefunden, dass der Anfang und das Ende "-" bedeutungsvoll waren und weg gingen.

<?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 = '[email protected]'; 
     $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: [email protected]\r\nReply-To: [email protected]"; 
     $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> 

Sehr Barebone wirklich, und offensichtlich Inline-CSS die mit dem Formular zu verbergen etwas billig ist, und Sie würden wollen an Sicherheit grenzender Wahrscheinlichkeit ein bisschen mehr Feedback für den Benutzer! Außerdem würde ich wahrscheinlich etwas mehr Zeit damit verbringen herauszufinden, was der eigentliche Inhaltstyp für die Datei ist, anstatt zu mogeln und application/octet-stream zu verwenden, aber dieser Teil ist genauso interessant.

+5

Dies ist meiner Meinung nach die beste Antwort, da Sie als Einziger den vollständigen Code bereitstellen (was die Frage spezifisch erfordert). +1. – pix0r

+3

Es ist in Ordnung, md5 für die Grenze für Golf zu verwenden, aber für die Produktion sollten Sie überprüfen, dass die Grenze nicht in der codierten Anlage auftritt. Einige Kodierungen sind sicherer, zB passt Base64 niemals zufällig auf eine Grenze mit _ _ –

+0

Gibt es eine Möglichkeit, mehrere Dateien anzuhängen? –

16

Eine Kombination dieser http://www.webcheatsheet.com/PHP/send_email_text_html_attachment.php#attachment

mit der PHP-Upload-Datei Beispiel funktionieren würde. In der Datei Beispiel Upload statt move_uploaded_file der Verwendung aus dem temporären Ordner verschieben würden Sie es einfach öffnen:

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

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

und es als eine Anlage, wie der Rest des Beispiels senden.

Alles in einer Datei/Selbstversorger:

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

Ich denke, es ist eine schnelle Bewegung zu bekommen, was Sie zur Verfügung Beispiele basieren auf den beiden oben genannten Arbeiten brauchen.

P.S. Es muss irgendwo hochgeladen werden, bevor Apache es an PHP weitergibt, um zu tun, was es damit will. Das wäre der temporäre Ordner Ihres Systems, wenn er nicht in der Konfigurationsdatei geändert wurde.

4

Dieser Artikel "How to create PHP based email form with file attachment" enthält Schritt-für-Schritt-Anweisungen, wie Sie Ihre Anforderung erfüllen können.

Zitat:

Dieser Artikel zeigt Ihnen, wie Sie eine PHP-basierten E-Mail-Formular erstellen, das Dateianhang unterstützt. Der Artikel wird auch zeigen, wie Sie den Typ und Größe der hochgeladenen Datei überprüfen.

Es besteht aus den folgenden Schritten:

  • Die HTML-Formular mit Datei-Upload-Box
  • gibt es die hochgeladene Datei im PHP Skript
  • Validieren der Größe und Ausdehnung der die hochgeladen Datei
  • Kopieren Sie die hochgeladene Datei
  • Senden der E-Mail

kann der gesamte Beispielcode here

1

PEAR::Mail_Mime heruntergeladen werden? Sicher, PEAR-Abhängigkeit von (min) 2 Dateien (mail_mime selbst, wenn Sie es bearbeiten, um die Pear-Abhängigkeiten zu entfernen), aber es funktioniert gut. Außerdem haben die meisten Server PEAR installiert und in den besten Fällen haben sie Pear/Mail und Pear/Mail_Mime. Etwas, das für die meisten anderen Bibliotheken, die die gleiche Funktionalität bieten, nicht gesagt werden kann.

Sie können auch in PHP IMAP extension suchen. Es ist ein wenig komplizierter und erfordert mehr Setup (nicht aktiviert oder standardmäßig installiert), muss aber effizienter kompilieren und Nachrichten an einen IMAP-fähigen Server senden.

4

Um die Datei als Anlage der E-Mail hinzuzufügen, muss sie kurz auf dem Server gespeichert werden. Es ist jedoch trivial, es in einen tmp-Speicherort zu platzieren und es dann zu löschen, nachdem Sie damit fertig sind.

Wie zum E-Mailen, Zend Mail hat eine sehr einfach zu bedienende Schnittstelle für den Umgang mit E-Mail-Anhänge. Wir laufen mit dem gesamten installierten Zend Framework, aber ich bin mir ziemlich sicher, dass Sie einfach die Zend_Mail-Bibliothek installieren können, ohne irgendwelche anderen Module für Abhängigkeiten zu benötigen.

Mit Zend_Mail, eine E-Mail mit einem Anhang zu senden ist so einfach wie:

$mail = new Zend_Mail(); 
$mail->setSubject("My Email with Attachment"); 
$mail->addTo("[email protected]"); 
$mail->setBodyText("Look at the attachment"); 
$attachment = $mail->createAttachment(file_get_contents('/path/to/file')); 
$mail->send(); 

Wenn Sie sich für ein Ein-Datei-Paket suchen, um das ganze Form/E-Mail/Befestigung, was zu tun, ich haven Hab 'keinen gesehen. Aber die einzelnen Komponenten sind sicher verfügbar und einfach zu montieren. Das Schwierigste am ganzen Bündel ist der E-Mail-Anhang, was die obige Empfehlung sehr einfach macht.

4

Ich habe den E-Mail-Teil nicht getestet (meine Testbox sendet keine E-Mail), aber ich denke, es wird funktionieren.

<?php 
if ($_POST) { 
$s = md5(rand()); 
mail('[email protected]', '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> 
+1

Ich mag deins für kleine und einfache und wünschte, ich hätte euch beiden die Belohnung geben können. –