por - Formulario PHP simple: Adjunto al correo electrónico(código de golf)
php mailer enviar adjunto (6)
Este artículo " Cómo crear un formulario de correo electrónico basado en PHP con archivo adjunto " presenta instrucciones paso a paso cómo lograr su requisito.
Citar:
Este artículo muestra cómo crear un formulario de correo electrónico basado en PHP que admita archivos adjuntos. El artículo también le mostrará cómo validar el tipo y el tamaño del archivo cargado.
Consiste en los siguientes pasos:
- El formulario HTML con el cuadro de carga de archivos
- Obtener el archivo cargado en el script PHP
- Validar el tamaño y la extensión del archivo cargado
- Copia el archivo cargado
- Enviando el correo electrónico
El código de ejemplo completo se puede descargar here
Imagine un usuario que desea poner un formulario en su sitio web que permita que un visitante del sitio web cargue 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 es entonces solo temporalmente) como archivo adjunto con la nota en el cuerpo del mensaje.
Ver más detalles en http://a2zsollution.com/php-secure-e-mail/
¿Cuál es la forma más simple de lograr esto?
El más simple en términos de:
- Tamaño (código de golf)
- Facilidad de implementación (idealmente, todo en un archivo, necesita pocos recursos externos o ninguno)
- No ofuscado en aras de la ofuscación (las compensaciones para el tamaño son buenas)
- Ejemplo autónomo (si se llama sin una publicación de formulario, muestra el formulario)
Esto es casi lo opuesto a: cómo obtener el correo electrónico y sus archivos adjuntos de PHP . Casi podría haber sido respondido en la compilación de correo electrónico con múltiples archivos adjuntos en PHP , pero en realidad no muestra el código.
No he probado la parte del correo electrónico de esto (mi cuadro de prueba no envía correos electrónicos) pero creo que funcionará.
<?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>
Para agregar el archivo al correo electrónico como un archivo adjunto, será necesario almacenarlo brevemente en el servidor. Sin embargo, es trivial colocarlo en una ubicación tmp y luego eliminarlo después de que hayas terminado con él.
En cuanto al envío de correos electrónicos, Zend Mail tiene una interfaz muy fácil de usar para manejar archivos adjuntos de correo electrónico. Funcionamos con todo el Zend Framework instalado, pero estoy bastante seguro de que 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("[email protected]");
$mail->setBodyText("Look at the attachment");
$attachment = $mail->createAttachment(file_get_contents(''/path/to/file''));
$mail->send();
Si está buscando un paquete de un solo 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 montar. Lo más complicado de todo el grupo es el archivo adjunto de correo electrónico, que la recomendación anterior hace muy simple.
Solo por diversión, pensé que lo golpearía. Terminó siendo más complicado de lo que pensaba porque no entendía completamente cómo funcionaba la parte límite, eventualmente me di cuenta de que el inicio y el final ''-'' eran significativos y no funcionaban.
<?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>
¡Muy barebones realmente, y obviamente el uso de CSS en línea para ocultar el formulario es un poco barato y casi seguramente querrás un poco más de comentarios para el usuario! Además, probablemente me demore un poco más en averiguar cuál es el tipo de contenido real para el archivo, en lugar de copiar y usar la aplicación / octet-stream, pero esa parte es tan interesante.
Una combinación de este http://www.webcheatsheet.com/PHP/send_email_text_html_attachment.php#attachment
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 de 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 enviarlo como un archivo adjunto como el resto del ejemplo.
Todo en un archivo / autónomo:
<? if(isset($_POST[''submit''])){
//process and email
}else{
//display form
}
?>
Creo que es un ejercicio rápido para obtener lo que necesita en función de los dos ejemplos disponibles.
PD: 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 tu sistema por defecto a menos que se haya cambiado en el archivo de configuración.
PEAR::Mail_Mime ? Claro, la dependencia PEAR de (mínimo) 2 archivos (solo mail_mime en sí mismo si lo edita para eliminar las dependencias pear), pero funciona bien. Además, la mayoría de los servidores tienen PEAR instalado en cierta medida, y en el mejor de los 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 está habilitado o instalado por defecto), pero es más eficiente para compilar y enviar mensajes a un servidor con capacidad IMAP.