Flux rss

[Lenguajes] Enviar un email con un archivo adjunto

Publicado por Carlos-vialfa, última actualización el viernes, 15 de agosto de 2008, 01:37:33 por Carlos-vialfa
Tanto los emails como las páginas web contienen cabeceras (headers en inglés).
Estas cabeceras sirven para dar información necesaria como la dirección del destinatario, la del remitente, la fecha de envío, el asunto del email, etc.
Estas son organizadas de la siguiente manera:
Nombre_cabecera: valor\n\r
Nombre_cabecera: valor\n\r
[...]
Nombre_cabecera: valor\n\n\r
Cuerpo del mensaje…

Donde “\n” significa retorno a la línea, y “\r” para situarse al inicio de la línea.

En parte trabajando con estas cabeceras es que podemos enviar un email con un archivo adjunto por medio de un programa.
Las cabeceras indican también el tipo de mensaje: email en html, email con solo texto, etc.
Para enviar un email con un archivo adjunto, debemos darle el tipo multipart/mixed para señalar que se encontrarán varias partes en ese email (aquí, el mensaje principal y el archivo adjunto).

Para separar estas partes se utiliza lo que se llama una “frontera” (boundary en inglés).
Esta frontera debe ser una cadena de caracteres única para que no sea encontrada en nuestro mensaje principal.

Por ejemplo "didondinaditondelosdudosdodudundodudindon" (utiliza de preferencia caracteres acsii, yo no sé como un cliente de correo electrónico reaccionara con caracteres avanzados).
Para nuestras cabeceras nos contentaremos con declarar la dirección del remitente, la versión de MIME y el tipo de mensaje, y como es un mensaje con archivo adjunto, debemos precisar la frontera:
From: remitente@dominio.es\r\n
MIME-Version: 1.0\r\n
Content-Type: multipart/mixed; boundary="didondinaditondelosdudosdodudundodudindon"\r\n\n

(Observa que el final de las cabeceras se caracteriza por dos saltos de línea).
Para comenzar una parte del cuerpo del email, comenzaremos mostrando la frontera. Cuando una frontera abre una parte, es precedida de dos guiones: “—“. La terminaremos con un salto de línea:
--didondinaditondelosdudosdodudundodudindon\n


Vamos a indicar que el mensaje legible del email será un simple texto. Entonces ponemos le tipo de esta parte (con el conjunto de caracteres que conviene, aquí el conjunto de caracteres que utiliza el alfabeto español):
Content-Type: text/plain; charset=ISO-8859-1\r\n\n

Mensaje principal del mail.\n\n
En lo que sigue, nos interesaremos al archivo adjunto. Para poner datos binarios en un email, por lo general se utiliza un estándar llamado base64 que permite transformar estos datos en caracteres.
Entonces vamos a mover nuestra frontera para delimitar esta parte y precisar en nuestras cabeceras:
-El tipo de archivo (vamos a utilizar un doc como Word)
-El tipo de codificación del archivo (aquí base64)
-la disposición del archivo en el email (archivo adjunto) y su nombre.
--didondinaditondelosdudosdodudundodudindon\n
Content-Type: application/msword; name="nombre_archivo"\r\n
Content-Transfer-Encoding: base64\r\n
Content-Disposition: attachment; filename="nombre_archivo"\r\n\n


A continuación, mostraremos el contenido de nuestro archivo codificado en base64.

Y finalmente, cerraremos nuestra frontera.
Para cerrar una frontera, hay que hacerla seguir y preceder de dos guiones "--", o sea:
--didondinaditondelosdudosdodudundodudindon--\n

Y listo el email no tiene más que ser enviado.
Cuestión de concretizar todo esto, vamos a implementar el envío de este email en Php (práctico con sus funciones email() y base64_encode() todas listas):
<?php
$boundary='didondinaditondelosdudosdodudundodudindon';
//Cabeceras del email
$headers="From: remitente@dominio.es\r\n
MIME-Version: 1.0\r\n
Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n\n";

//Cuerpo del email comenzando por el mensaje principal
$body="--". $boundary ."\n
Content-Type: text/plain; charset=ISO-8859-1\r\n\n
Mensaje principal del email.\n\n";

/* Archivo adjunto, vamos a indicar que nuestro archivo se llama bidule.doc y que se encuentra
 en el directorio actual */

$archivo=file_get_contents('./bidule.doc');
/* Utilizaremos chunk_split() que organizará come se debe la codificación hecha en base 64 para
 estar conforme a los estándares */
$archivo=chunk_split( base64_encode($archivo) );

//Escritura del archivo adjunto
$body = $body . "--" .$boundary. "\n
Content-Type: application/msword; name=\"nombre_archivo\"\r\n
Content-Transfer-Encoding: base64\r\n
Content-Disposition: attachment; filename=\"nombre_archivo\"\r\n\n
$archivo";

//Cierre de la frontera
$body = $body . "--" . $boundary ."--";

//Envío del email
email("destinatario@bidule.es", "objeto", $body, $headers);
?>

Y listo :-)

Fuente:
-http://www.hochfeiler.it/alvise/smtp.htm
-http://fr2.php.net/manual/es/function.mail.php (ver ejemplos en la discusión)

PD: El artículo original fue escrito por kilian contribuidor de CommentCaMarche

Resultados de

Enviar archivos adjuntos voluminosos por email Por lo general, los sistemas de mensajería no permiten el envio de archivos adjuntos de gran tamaño. Entonces ¿cómo podemos hacer para enviar un archivo ajunto de varios MB? La solución consiste en utilizar un servicio de alojamiento temporal de... es.kioskea.net/faq/sujet-296-enviar-archivos-adjuntos-voluminosos-por-email
No puedo ver los archivos adjuntos Hola, tengo un problema y esque no puedo ver los videos ni los archivos adjuntos ni los articulos que me envian por el msn...solo puedo ver fotos.Que tengo que hacer?Tengo windows vista. es.kioskea.net/forum/affich-19607-no-puedo-ver-los-archivos-adjuntos
Mandar por archivo adjunto un trabajo en powe Hola, quiero mandar por mail un archivo adjunto de un trabajo creado con power point y no me permite, cómo hago o cómo puedo enviarlo? es.kioskea.net/forum/affich-33756-mandar-por-archivo-adjunto-un-trabajo-en-powe

Resultados de

[Mozilla Thunderbird] El archivo winmail.datEl problema: Un amigo te envía un email con un archivo adjunto, pero éste no aparece en el email: sólo aparece un archivo winmail.dat adjunto. Explicación: Este problema se presenta cuando alguien nos envía un email en formato rtf. Este... es.kioskea.net/faq/sujet-1027-mozilla-thunderbird-el-archivo-winmail-dat
[PHP] Subir archivosEl lenguaje PHP permite administrar los archivos enviados (subidos) gracias a un formulario HTML. Formulario de envío de archivos Configuración de PHP para subir archivos Recuperar el archivo con PHP Formulario de envío de archivos Lo primero... es.kioskea.net/faq/sujet-286-php-subir-archivos
Hi5 = SpamMito Hi5 es un medio para enviar spam, que nos envía emails no solicitados a nuestra libreta de direcciones! Realidad VERDADERO Y FALSO Explicación Posiblemente ya hayas recibido un email de uno de tus contactos del MSN invitándote a unirte a... es.kioskea.net/faq/sujet-1385-hi5-spam

Resultados de

No puedo abrir datos adjuntos en hotmailHola, a ver si me pueden ayudar, el tema es asi,,,tengo win xp prof y mi servidor de internet es speedy 1m, el problema es q cuando abro mi bandeja de entrada de email y me mandan archivos adjuntos tipo cadenas etc etc no me los abre, me dice q tengo... es.kioskea.net/forum/affich-24367-no-puedo-abrir-datos-adjuntos-en-hotmail
Se me cierra msn al enviar archivos (Resuelto)Hola, despues del arebato con el msn, puedo usar el 7.5 pero cada vez ke kiero enviar una archivo me saca de sesion o me cierra msn... algun alma caritativas ke me pueda ayudar? es.kioskea.net/forum/affich-2192-se-me-cierra-msn-al-enviar-archivos
Script para EmailBuenos días: Estoy lanzando un script desde una HP-UX IA 64 11.23 para enviar Email de monitorización. Este script está probado y funciona correctamente tanto en Linux como en Unix, pero en una HP-UX es la primera vez que lo pruebo, y no funciona. Si... es.kioskea.net/forum/affich-10120-script-para-email

Resultados de

Descargar Live Ad RemoverLive Ad Remover es una utilidad que permitira librarte de la molesta publicidad que hay en MSN. Seguramente alguna vez has pensado en como hacer esto. Con este programa podras bloquear todos esos molestos anuncios que seguramente no te interesan, y... es.kioskea.net/telecharger/telecharger-1135-live-ad-remover
Descargar Java SE Runtime EnvironmentJava SE Runtime Environment te permitira trabajar de manera libre y sin preocupaciones con archivos que corren con Java. Estas aplicaciones son denominadas "Applets" y entre otras tendras la posibilidad de chatear con usuarios al rededor del mundo,... es.kioskea.net/telecharger/telecharger-741-java-se-runtime-environment
Descargar LimeWireEs un programa que te permite compartir cualquier tipo de archivo.Está programado en Java por lo que es necesario tener instalado la JRE (Java Runtime Environment). Aunque la versión para Windows del instalador de LimeWire incluye una versión del... es.kioskea.net/telecharger/telecharger-23-limewire

Resultados de

Correo electrónico Es uno de los servicios en Internet de mayor demanda, pues hace posible el envío de mensajes en forma de archivo de texto. La academia francesa utiliza el vocablo "mél" mientras que los canadienses (generalmente más creativos) adoptaron el vocablo... es.kioskea.net/utile/email.php3
Correo electrónico - Reglas para usar el correo electrónico correctamente Netiquette (una contracción de las palabras "Net" y "etiquette") se refiere al conjunto de reglas que rigen el comportamiento correcto en Internet con el fin de respetar a los demás y ser respetados. Actúan como pautas de cortesía y conducta... es.kioskea.net/courrier-electronique/regles-bon-usage-messagerie.php3
Correo electrónico - MIME MIME (Extensiones Multipropósito de Correo Internet) es un estándar propuesto en 1991 por Bell Communications para expandir las capacidades limitadas del correo electrónico y en particular para permitir la inserción de documentos (como imágenes,... es.kioskea.net/courrier-electronique/mime.php3