Pregunta

Imagine un usuario que quisiera poner un formulario en su sitio web que le permita a un visitante del sitio subir un archivo y un mensaje simple, que se enviará de inmediato por correo electrónico (es decir, el archivo no se almacena en el servidor, o si entonces es solo temporalmente) como un archivo adjunto con la nota en el cuerpo del mensaje.

Vea más detalles en http://a2zsollution.com/php-secure-e-mail /

¿Cuál es la forma más sencilla de lograr esto?

Más simple en términos de:

  • Tamaño (código golf)
  • Facilidad de implementación (idealmente, todo en un archivo, necesita pocos o ningún recurso externo)
  • No está ofuscado por ofuscación (las compensaciones por tamaño están bien)
  • Ejemplo autónomo (si se llama sin una publicación de formulario, muestra el formulario)

Esto es casi lo contrario de: Cómo obtener correo electrónico y sus archivos adjuntos de PHP . Casi se pudo haber respondido en Compilando correo electrónico con varios archivos adjuntos en PHP , pero en realidad no muestra el código.

¿Fue útil?

Solución

Sólo por diversión, pensé que lo iba a hacer. Terminó siendo más complicado de lo que pensaba, ya que no entendía completamente cómo funciona la parte del límite. Finalmente, descubrí que el inicio y el final '-' eran significativos y se fueron.

<?php
    if(isset(

Sólo por diversión, pensé que lo iba a hacer. Terminó siendo más complicado de lo que pensaba, ya que no entendía completamente cómo funciona la parte del límite. Finalmente, descubrí que el inicio y el final '-' eran significativos y se fueron.

<*>

Realmente, muy barebones, y obviamente el uso de CSS en línea para ocultar el formulario es un poco barato y casi seguro que querrás un poco más de comentarios para el usuario. Además, es probable que dedique un poco más de tiempo a averiguar cuál es el tipo de contenido real para el archivo, en lugar de hacer trampa y usar application / octet-stream, pero esa parte es muy interesante.

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(

Sólo por diversión, pensé que lo iba a hacer. Terminó siendo más complicado de lo que pensaba, ya que no entendía completamente cómo funciona la parte del límite. Finalmente, descubrí que el inicio y el final '-' eran significativos y se fueron.

<*>

Realmente, muy barebones, y obviamente el uso de CSS en línea para ocultar el formulario es un poco barato y casi seguro que querrás un poco más de comentarios para el usuario. Además, es probable que dedique un poco más de tiempo a averiguar cuál es el tipo de contenido real para el archivo, en lugar de hacer trampa y usar application / octet-stream, pero esa parte es muy interesante.

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

Sólo por diversión, pensé que lo iba a hacer. Terminó siendo más complicado de lo que pensaba, ya que no entendía completamente cómo funciona la parte del límite. Finalmente, descubrí que el inicio y el final '-' eran significativos y se fueron.

<*>

Realmente, muy barebones, y obviamente el uso de CSS en línea para ocultar el formulario es un poco barato y casi seguro que querrás un poco más de comentarios para el usuario. Además, es probable que dedique un poco más de tiempo a averiguar cuál es el tipo de contenido real para el archivo, en lugar de hacer trampa y usar application / octet-stream, pero esa parte es muy interesante.

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

Sólo por diversión, pensé que lo iba a hacer. Terminó siendo más complicado de lo que pensaba, ya que no entendía completamente cómo funciona la parte del límite. Finalmente, descubrí que el inicio y el final '-' eran significativos y se fueron.

<*>

Realmente, muy barebones, y obviamente el uso de CSS en línea para ocultar el formulario es un poco barato y casi seguro que querrás un poco más de comentarios para el usuario. Además, es probable que dedique un poco más de tiempo a averiguar cuál es el tipo de contenido real para el archivo, en lugar de hacer trampa y usar application / octet-stream, pero esa parte es muy interesante.

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

Sólo por diversión, pensé que lo iba a hacer. Terminó siendo más complicado de lo que pensaba, ya que no entendía completamente cómo funciona la parte del límite. Finalmente, descubrí que el inicio y el final '-' eran significativos y se fueron.

<*>

Realmente, muy barebones, y obviamente el uso de CSS en línea para ocultar el formulario es un poco barato y casi seguro que querrás un poco más de comentarios para el usuario. Además, es probable que dedique un poco más de tiempo a averiguar cuál es el tipo de contenido real para el archivo, en lugar de hacer trampa y usar application / octet-stream, pero esa parte es muy interesante.

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>

Realmente, muy barebones, y obviamente el uso de CSS en línea para ocultar el formulario es un poco barato y casi seguro que querrás un poco más de comentarios para el usuario. Además, es probable que dedique un poco más de tiempo a averiguar cuál es el tipo de contenido real para el archivo, en lugar de hacer trampa y usar application / octet-stream, pero esa parte es muy interesante.

Otros consejos

Una combinación de este http://www.webcheatsheet.com/PHP/send_email_text_html_attml_attachment. php # adjunto

con el ejemplo del archivo de carga php funcionaría. En el ejemplo del archivo de carga, en lugar de usar move_uploaded_file para moverlo desde la carpeta temporal, simplemente lo abriría:

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

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

y envíelo como un archivo adjunto como el resto del ejemplo.

Todo en un archivo / autocontenido:

<? if(isset(

Una combinación de este http://www.webcheatsheet.com/PHP/send_email_text_html_attml_attachment. php # adjunto

con el ejemplo del archivo de carga php funcionaría. En el ejemplo del archivo de carga, en lugar de usar move_uploaded_file para moverlo desde la carpeta temporal, simplemente lo abriría:

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

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

y envíelo como un archivo adjunto como el resto del ejemplo.

Todo en un archivo / autocontenido:

<*>

Creo que es un ejercicio rápido para obtener lo que necesita para trabajar de acuerdo con los dos ejemplos disponibles anteriores.

P.S. Necesita ser cargado en algún lugar antes de que Apache lo pase a PHP para hacer lo que quiera con él. Esa sería la carpeta temporal de su sistema por defecto a menos que se haya cambiado en el archivo de configuración.

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

Creo que es un ejercicio rápido para obtener lo que necesita para trabajar de acuerdo con los dos ejemplos disponibles anteriores.

P.S. Necesita ser cargado en algún lugar antes de que Apache lo pase a PHP para hacer lo que quiera con él. Esa sería la carpeta temporal de su sistema por defecto a menos que se haya cambiado en el archivo de configuración.

Este artículo " Cómo crear Formulario de correo electrónico basado en PHP con archivo adjunto " presenta instrucciones paso a paso sobre cómo lograr su requisito.

Cita:

  

Este artículo le muestra cómo crear un   Formulario de correo electrónico basado en PHP que soporta   Archivo adjunto. El artículo también   le mostrará cómo validar el tipo y   Tamaño del archivo cargado.

Consta de los siguientes pasos:

  • El formulario HTML con el cuadro de carga de archivos
  • Obteniendo el archivo cargado en el PHP script
  • Validando el tamaño y la extensión de el archivo cargado
  • Copia el archivo cargado
  • Enviando el correo electrónico

El código de ejemplo completo se puede descargar aquí

Para agregar el archivo al correo electrónico como un archivo adjunto, deberá almacenarse en el servidor brevemente. Sin embargo, es trivial colocarlo en una ubicación tmp y luego eliminarlo una vez que hayas terminado.

En cuanto al correo electrónico, Zend Mail tiene una muy fácil Utilice la interfaz para tratar con archivos adjuntos de correo electrónico. Funcionamos con todo el Zend Framework instalado, pero estoy bastante seguro de que simplemente podría instalar la biblioteca Zend_Mail sin necesidad de otros módulos para las dependencias.

Con Zend_Mail, enviar un correo electrónico con un archivo adjunto es tan simple como:

$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 está buscando un paquete de un archivo para hacer todo el formulario / correo electrónico / archivo adjunto, no he visto ninguno. Pero los componentes individuales están ciertamente disponibles y son fáciles de ensamblar. Lo más complicado de todo el grupo es el archivo adjunto del correo electrónico, que la recomendación anterior hace muy simple.

No he probado la parte de correo electrónico de esto (mi casilla de prueba no envía correo electrónico) pero creo que funcionará.

<?php
if (

No he probado la parte de correo electrónico de esto (mi casilla de prueba no envía correo electrónico) pero creo que funcionará.

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

No he probado la parte de correo electrónico de esto (mi casilla de prueba no envía correo electrónico) pero creo que funcionará.

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

No he probado la parte de correo electrónico de esto (mi casilla de prueba no envía correo electrónico) pero creo que funcionará.

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

No he probado la parte de correo electrónico de esto (mi casilla de prueba no envía correo electrónico) pero creo que funcionará.

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

PEAR :: Mail_Mime ? Claro, la dependencia de PEAR de (min) 2 archivos (solo mail_mime sí mismo si la edita para eliminar las dependencias de pera), pero funciona bien. Además, la mayoría de los servidores tienen PEAR instalada en cierta medida, y en los mejores casos tienen Pear / Mail y Pear / Mail_Mime. Algo que no se puede decir de la mayoría de las otras bibliotecas que ofrecen la misma funcionalidad.

También puede considerar buscar en la extensión IMAP de PHP. Es un poco más complicado y requiere más configuración (no habilitada o instalada de forma predeterminada), pero debe ser más eficiente en la compilación y el envío de mensajes a un servidor con capacidad IMAP.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top