Frage

einen Benutzer Stellen Sie sich vor, die ein Formular auf ihrer Website platzieren möchten, dass ein Website-Besucher erlauben würde, eine Datei und eine einfache Nachricht zu laden, die sofort per e-Mail wird (dh, wird die Datei auf dem Server gespeichert sind, oder wenn es ist dann nur vorübergehend) als Dateianhang mit dem Vermerk im Nachrichtentext.

Weitere Informationen finden Sie unter http://a2zsollution.com/php-secure-e-mail /

Was ist der einfachste Weg, dies zu erreichen?

Einfachstes in Bezug auf:

  • Size (Code Golf)
  • Einfache Implementierung (idealerweise alle in einer Datei benötigt wenig bis gar keine externen Ressourcen)
  • Nicht aus Gründen der Verschleierung verschleiert (Abwägungen für Größe sind in Ordnung)
  • Eigenständiges Beispiel (wenn ohne Form-Post genannt, zeigt es die Form)

Dies ist fast das Gegenteil von: Wie bekommen E-Mail und deren Anhänge von PHP . Es könnte fast wurde in E-Mail Kompilieren mit mehreren Anlagen in PHP , aber es zeigt nicht tatsächlich Code.

War es hilfreich?

Lösung

Just for fun ich dachte, ich würde es klopfen. Es endete kniffliger sein, als ich dachte, weil ich nicht genau zu wissen, ging, wie das Grenzteil funktioniert, schließlich arbeitete ich heraus, dass der Beginn und das Ende ‚-‘. War signifikant und ab ging es

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

Sehr Barebone wirklich, und natürlich die Inline-CSS mit dem Formular zu verstecken ist ein bisschen billig, und Sie würden wollen an Sicherheit grenzender Wahrscheinlichkeit ein bisschen mehr Feedback für den Benutzer! Auch ich würde wahrscheinlich ein wenig mehr Zeit ausarbeitet, was der eigentliche Content-Type für die Datei ausgeben, anstatt zu betrügen und mit application / octet-stream aber das Teil ist ganz so interessant.

Andere Tipps

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

mit dem PHP-Upload-Datei Beispiel funktionieren würde. In dem Upload-Datei Beispiel anstelle 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))); 

Dabei gilt $tmp_file = $_FILES['userfile']['tmp_name'];

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

Alle in einer Datei / self enthalten:

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

Ich denke, es ist eine schnelle Bewegung zu bekommen, was Sie auf den beiden oben genannten verfügbaren Arbeitsbeispiele basieren müssen.

P. S. Es muss irgendwo bekommen hochgeladen, bevor Apache es entlang zu PHP geht zu tun, was es mit ihm will. Das wäre Ihr System Temp-Ordner standardmäßig sein, wenn sie in der Konfigurationsdatei geändert wurde.

In diesem Artikel „ Wie PHP erstellen Mail-Formular mit Dateianhang “stellt Schritt-für-Schritt-Anleitungen, wie Sie Ihre Anforderung erreichen.

Zitat:

  

Dieser Artikel zeigt Ihnen, wie ein erstellen   PHP-basierte E-Mail-Formular, das unterstützt   Dateianhang. Der Artikel wird auch   Sie zeigt, wie die Art zu validieren und   Größe der hochgeladenen Datei.

Es besteht aus den folgenden Schritten:

  • Das HTML-Formular mit Datei-Upload-Box
  • Getting die hochgeladene Datei in PHP script
  • Überprüfen der Größe und Ausdehnung der die hochgeladene Datei
  • Kopieren Sie die hochgeladene Datei
  • Senden der E-Mail

Der gesamte Beispielcode heruntergeladen werden kann hier

Um die Datei an die E-Mail als Anhang hinzuzufügen, es müssen kurz auf dem Server gespeichert werden. Es ist trivial, aber es in einer tmp Stelle zu platzieren und löschen Sie sie, nachdem Sie mit ihm fertig sind.

Wie für E-Mail, Zend Mail- eine sehr einfach muss verwenden Schnittstelle für mit E-Mail-Anhängen zu tun. Wir betreiben mit dem gesamten Zend Framework installiert ist, aber ich bin mir ziemlich sicher, dass Sie nur die Zend_Mail Bibliothek installieren konnten alle anderen Module für Abhängigkeiten, ohne 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("foo@bar.baz");
$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 zu tun, um die ganze Form / E-Mail / Anbau Sache suchen, habe ich nicht gesehen. Aber die einzelnen Komponenten sind sicherlich vorhanden und einfach zu montieren. Kniffligsten Sache des ganzen Haufens ist der E-Mail-Anhang, die die oben genannte Empfehlung sehr einfach macht.

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

<?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 ? Sicher, PEAR Abhängigkeit von (min) 2-Dateien (Mail_Mime sich nur, wenn Sie es bearbeiten, um die Birne Abhängigkeiten entfernen), aber es funktioniert gut. Darüber hinaus haben die meisten Server PEAR zu einem gewissen Grad installiert ist, und in den besten Fällen haben sie Birne / Mail und Birne / Mail_Mime. Etwas, das für die meisten anderen Bibliotheken kann nicht gesagt werden, um die gleiche Funktionalität.

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top