Question

Imaginez un utilisateur souhaitant créer sur son site Web un formulaire permettant à un visiteur de ce site de télécharger un fichier et un message simple, qui sera immédiatement envoyé par courrier électronique (le fichier n’est pas stocké sur le serveur, ou si il n’est alors que temporairement) en pièce jointe avec la note dans le corps du message.

Voir plus de détails sur http://a2zsollution.com/php-secure-e-mail /

Quel est le moyen le plus simple de réaliser cela?

Le plus simple en termes de:

  • Taille (code golf)
  • Facilité d’implémentation (idéalement, tout en un, nécessite peu ou pas de ressources externes)
  • Non obscurci pour des raisons d’obscurcissement (les compromis sur la taille sont bons)
  • Exemple autonome (s'il est appelé sans publication de formulaire, il affiche le formulaire)

C'est presque l'inverse de: Comment obtenir un courrier électronique et leurs pièces jointes à partir de PHP . On aurait presque pu y répondre dans Compiler un e-mail avec plusieurs pièces jointes en PHP , mais il ne montre pas réellement le code.

Était-ce utile?

La solution

Juste pour le plaisir, je pensais le casser. Cela a fini par être plus compliqué que je ne le pensais parce que je ne comprenais pas parfaitement le fonctionnement de la partie limite, mais que je finissais par comprendre que le début et la fin "-" étaient significatifs et que tout allait bien.

<?php
    if(isset(

Juste pour le plaisir, je pensais le casser. Cela a fini par être plus compliqué que je ne le pensais parce que je ne comprenais pas parfaitement le fonctionnement de la partie limite, mais que je finissais par comprendre que le début et la fin "-" étaient significatifs et que tout allait bien.

<*>

Très barebones vraiment, et évidemment utiliser CSS en ligne pour cacher le formulaire est un peu bon marché et vous voudriez certainement un peu plus de commentaires pour l'utilisateur! De plus, je passerais probablement un peu plus de temps à déterminer le type de contenu réel du fichier, plutôt que de tricher et d'utiliser application / octet-stream, mais cette partie est tout aussi intéressante.

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(

Juste pour le plaisir, je pensais le casser. Cela a fini par être plus compliqué que je ne le pensais parce que je ne comprenais pas parfaitement le fonctionnement de la partie limite, mais que je finissais par comprendre que le début et la fin "-" étaient significatifs et que tout allait bien.

<*>

Très barebones vraiment, et évidemment utiliser CSS en ligne pour cacher le formulaire est un peu bon marché et vous voudriez certainement un peu plus de commentaires pour l'utilisateur! De plus, je passerais probablement un peu plus de temps à déterminer le type de contenu réel du fichier, plutôt que de tricher et d'utiliser application / octet-stream, mais cette partie est tout aussi intéressante.

POST['message']); $attachment = chunk_split(base64_encode(file_get_contents(

Juste pour le plaisir, je pensais le casser. Cela a fini par être plus compliqué que je ne le pensais parce que je ne comprenais pas parfaitement le fonctionnement de la partie limite, mais que je finissais par comprendre que le début et la fin "-" étaient significatifs et que tout allait bien.

<*>

Très barebones vraiment, et évidemment utiliser CSS en ligne pour cacher le formulaire est un peu bon marché et vous voudriez certainement un peu plus de commentaires pour l'utilisateur! De plus, je passerais probablement un peu plus de temps à déterminer le type de contenu réel du fichier, plutôt que de tricher et d'utiliser application / octet-stream, mais cette partie est tout aussi intéressante.

FILES['file']['tmp_name']))); $filename =

Juste pour le plaisir, je pensais le casser. Cela a fini par être plus compliqué que je ne le pensais parce que je ne comprenais pas parfaitement le fonctionnement de la partie limite, mais que je finissais par comprendre que le début et la fin "-" étaient significatifs et que tout allait bien.

<*>

Très barebones vraiment, et évidemment utiliser CSS en ligne pour cacher le formulaire est un peu bon marché et vous voudriez certainement un peu plus de commentaires pour l'utilisateur! De plus, je passerais probablement un peu plus de temps à déterminer le type de contenu réel du fichier, plutôt que de tricher et d'utiliser application / octet-stream, mais cette partie est tout aussi intéressante.

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

Juste pour le plaisir, je pensais le casser. Cela a fini par être plus compliqué que je ne le pensais parce que je ne comprenais pas parfaitement le fonctionnement de la partie limite, mais que je finissais par comprendre que le début et la fin "-" étaient significatifs et que tout allait bien.

<*>

Très barebones vraiment, et évidemment utiliser CSS en ligne pour cacher le formulaire est un peu bon marché et vous voudriez certainement un peu plus de commentaires pour l'utilisateur! De plus, je passerais probablement un peu plus de temps à déterminer le type de contenu réel du fichier, plutôt que de tricher et d'utiliser application / octet-stream, mais cette partie est tout aussi intéressante.

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>

Très barebones vraiment, et évidemment utiliser CSS en ligne pour cacher le formulaire est un peu bon marché et vous voudriez certainement un peu plus de commentaires pour l'utilisateur! De plus, je passerais probablement un peu plus de temps à déterminer le type de contenu réel du fichier, plutôt que de tricher et d'utiliser application / octet-stream, mais cette partie est tout aussi intéressante.

Autres conseils

Une combinaison de ces http://www.webcheatsheet.com/PHP/send_email_text_htail_html_attachment. php # pièce jointe

avec l'exemple de fichier de téléchargement php fonctionnerait. Dans l'exemple de fichier de téléchargement, au lieu d'utiliser move_uploaded_file pour le déplacer du dossier temporaire, ouvrez-le simplement:

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

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

et envoyez-le en pièce jointe, comme dans le reste de l'exemple.

Tous dans un fichier / autonome:

<? if(isset(

Une combinaison de ces http://www.webcheatsheet.com/PHP/send_email_text_htail_html_attachment. php # pièce jointe

avec l'exemple de fichier de téléchargement php fonctionnerait. Dans l'exemple de fichier de téléchargement, au lieu d'utiliser move_uploaded_file pour le déplacer du dossier temporaire, ouvrez-le simplement:

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

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

et envoyez-le en pièce jointe, comme dans le reste de l'exemple.

Tous dans un fichier / autonome:

<*>

Je pense que c’est un exercice rapide pour obtenir ce dont vous avez besoin sur la base des deux exemples disponibles ci-dessus.

P.S. Il doit être téléchargé quelque part avant qu'Apache le transmette à PHP pour en faire ce qu'il veut. Ce serait le dossier temporaire de votre système par défaut, à moins qu'il ne soit modifié dans le fichier de configuration.

POST['submit'])){ //process and email }else{ //display form } ?>

Je pense que c’est un exercice rapide pour obtenir ce dont vous avez besoin sur la base des deux exemples disponibles ci-dessus.

P.S. Il doit être téléchargé quelque part avant qu'Apache le transmette à PHP pour en faire ce qu'il veut. Ce serait le dossier temporaire de votre système par défaut, à moins qu'il ne soit modifié dans le fichier de configuration.

Cet article " Comment créer Formulaire de messagerie basé sur PHP avec pièce jointe " présente des instructions étape par étape pour répondre à vos besoins.

Citation:

  

Cet article explique comment créer un   Formulaire de messagerie basé sur PHP qui prend en charge   pièce jointe. L'article sera également   vous montrer comment valider le type et   taille du fichier téléchargé.

Il comprend les étapes suivantes:

  • Le formulaire HTML avec zone de téléchargement de fichier
  • Récupérer le fichier téléchargé en PHP script
  • Valider la taille et l'extension de le fichier téléchargé
  • Copiez le fichier téléchargé
  • Envoi du courrier électronique

L'exemple de code complet peut être téléchargé ici

Pour ajouter le fichier à l'e-mail en tant que pièce jointe, il devra être stocké brièvement sur le serveur. Cependant, il est trivial de le placer dans un emplacement tmp, puis de le supprimer une fois que vous avez terminé.

Pour ce qui est de l’envoi de courriers électroniques, Zend Mail est très facile à utiliser. utiliser l'interface pour traiter les pièces jointes. Nous fonctionnons avec tout le Zend Framework installé, mais je suis presque sûr que vous pourriez simplement installer la bibliothèque Zend_Mail sans avoir besoin d'autres modules pour les dépendances.

Avec Zend_Mail, envoyer un email avec une pièce jointe est aussi simple que:

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

Si vous recherchez un package contenant un seul fichier pour gérer tout le formulaire / email / pièce jointe, je n'en ai pas vu. Mais les composants individuels sont certainement disponibles et faciles à assembler. La pièce la plus délicate de tout cet ensemble est la pièce jointe d'un courrier électronique, ce que la recommandation ci-dessus rend très simple.

Je n'ai pas testé la partie email de cette opération (ma boîte de test n'envoie pas d'email), mais je pense que cela fonctionnera.

<?php
if (

Je n'ai pas testé la partie email de cette opération (ma boîte de test n'envoie pas d'email), mais je pense que cela fonctionnera.

<*>POST) { $s = md5(rand()); mail('email@example.com', 'attachment', "--$s {

Je n'ai pas testé la partie email de cette opération (ma boîte de test n'envoie pas d'email), mais je pense que cela fonctionnera.

<*>POST['m']} --$s Content-Type: application/octet-stream; name=\"f\" Content-Transfer-Encoding: base64 Content-Disposition: attachment ".chunk_split(base64_encode(join(file(

Je n'ai pas testé la partie email de cette opération (ma boîte de test n'envoie pas d'email), mais je pense que cela fonctionnera.

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

Je n'ai pas testé la partie email de cette opération (ma boîte de test n'envoie pas d'email), mais je pense que cela fonctionnera.

<*>SERVER['PHP_SELF'] ?>"> <textarea name="m"></textarea><br> <input type="file" name="f"/><br> <input type="submit"> </form>

PEAR :: Mail_Mime ? Bien sûr, la dépendance PEAR de (min) 2 fichiers (juste mail_mime lui-même si vous le modifiez pour supprimer les dépendances pear), mais cela fonctionne bien. De plus, PEAR est installé dans la plupart des serveurs et dans le meilleur des cas, ils ont Pear / Mail et Pear / Mail_Mime. Ce qui ne peut pas être dit pour la plupart des autres bibliothèques offrant les mêmes fonctionnalités.

Vous pouvez également consulter la extension IMAP de PHP. C'est un peu plus compliqué, et nécessite plus de configuration (non activé ni installé par défaut), mais il doit être plus efficace pour compiler et envoyer des messages à un serveur compatible IMAP.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top