por - enviar varios archivos adjuntos php
Enviar correo PHP HTML con archivos adjuntos (4)
Para enviar un correo electrónico con un archivo adjunto necesitamos usar el tipo MIME multiparte / mixto que especifica que se incluirán tipos mixtos en el correo electrónico. Además, queremos utilizar el tipo MIME multiparte / alternativa para enviar tanto texto sin formato como la versión HTML del correo electrónico. Eche un vistazo al ejemplo:
<?php
//define the receiver of the email
$to = ''[email protected]'';
//define the subject of the email
$subject = ''Test email with attachment'';
//create a boundary string. It must be unique
//so we use the MD5 algorithm to generate a random hash
$random_hash = md5(date(''r'', time()));
//define the headers we want passed. Note that they are separated with /r/n
$headers = "From: [email protected]/r/nReply-To: [email protected]";
//add boundary string and mime type specification
$headers .= "/r/nContent-Type: multipart/mixed; boundary=/"PHP-mixed-".$random_hash."/"";
//read the atachment file contents into a string,
//encode it with MIME base64,
//and split it into smaller chunks
$attachment = chunk_split(base64_encode(file_get_contents(''attachment.zip'')));
//define the body of the message.
ob_start(); //Turn on output buffering
?>
--PHP-mixed-<?php echo $random_hash; ?>
Content-Type: multipart/alternative; boundary="PHP-alt-<?php echo $random_hash; ?>"
--PHP-alt-<?php echo $random_hash; ?>
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
Hello World!!!
This is simple text email message.
--PHP-alt-<?php echo $random_hash; ?>
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
<h2>Hello World!</h2>
<p>This is something with <b>HTML</b> formatting.</p>
--PHP-alt-<?php echo $random_hash; ?>--
--PHP-mixed-<?php echo $random_hash; ?>
Content-Type: application/zip; name="attachment.zip"
Content-Transfer-Encoding: base64
Content-Disposition: attachment
<?php echo $attachment; ?>
--PHP-mixed-<?php echo $random_hash; ?>--
<?php
//copy current buffer contents into $message variable and delete current output buffer
$message = ob_get_clean();
//send the email
$mail_sent = @mail( $to, $subject, $message, $headers );
//if the message is sent successfully print "Mail sent". Otherwise print "Mail failed"
echo $mail_sent ? "Mail sent" : "Mail failed";
?>
Como puede ver, enviar un correo electrónico con un archivo adjunto es fácil de lograr. En el ejemplo anterior, tenemos el tipo MIME multiparte / mezclado, y dentro de él tenemos el tipo MIME alternativo / múltiple que especifica dos versiones del correo electrónico. Para incluir un archivo adjunto a nuestro mensaje, leemos los datos del archivo especificado en una cadena, lo codificamos con base64, lo dividimos en trozos más pequeños para asegurarnos de que coincida con las especificaciones MIME y luego lo incluimos como un archivo adjunto.
Tengo un problema: hasta hoy, envié correos HTML con PHP usando un encabezado que contiene
Content-type: text/html;
Ahora, agregué funcionalidad para agregar archivos adjuntos. Para esto, tuve que cambiar esta línea a
Content-Type: multipart/mixed;
Ahora, con multipart/mixed
, el resto del correo, por lo que el texto normal, se muestra solo como text / plain. ¿Cómo puedo saber que los archivos adjuntos funcionan y que el texto de correo sigue siendo HTML?
SWIFTMAIL en php funciona gr8 para adjuntar correos.
Descargar swiftmailer desde aquí http://swiftmailer.org/
Mira el código simple a continuación
INCLUIR ARCHIVO
require_once(''path/to/swiftMailer/lib/swift_required.php'');
CREAR TRANSPORTE
//FOR SMTP
// Create the Transport
$transport = Swift_SmtpTransport::newInstance(''smtp.googlemail.com'', 465, ''ssl'')
->setUsername(''[email protected]'')
->setPassword(''gmailpassword'');
O
//FOR NORMAL MAIL
$transport = Swift_MailTransport::newInstance();
OBJETO DE MAILER
// Create the Mailer using your created Transport
$mailer = Swift_Mailer::newInstance($transport);
CREAR OBJETO DE MENSAJE
$message = Swift_Message::newInstance($subject)
->setFrom(array($from => $from))
->setTo($to)
->setBody($body);
$message->attach(Swift_Attachment::fromPath($filepath));
ENVIAR MENSAJE
$result = $mailer->send($message);
Si realmente desea aprender cómo formatear un mensaje de Internet, debe consultar su Solicitud de comentarios (también conocida como RFC). El que define "Extensiones multipropósito de correo de Internet - Formato de los órganos de mensajes de Internet" es RFC2045 emitido en noviembre de 1996.
El formato es de alguna manera muy estricto y debe seguirse tal como está.
Básicamente, el mensaje contiene un encabezado y el cuerpo. El encabezado define el tipo de mensaje, la forma en que está formateado, algunos otros campos que difieren de un tipo a otro.
El cuerpo está formado por diferentes entidades. Una entidad puede ser, por ejemplo, solo un texto simple como "¡Hola!" pero también puede ser una imagen, un archivo adjunto, lo que sea.
NOTA En los ejemplos siguientes, todo lo encerrado entre corchetes (por ejemplo, {hello}) debe reemplazarse con su valor real. Cualquier nueva línea es en realidad CRLF (es decir, ASCII 13 + ASCII 10). Donde vea dos CRLF adherirse a él. Sería el peor momento para mostrar lo creativo que eres.
Básicamente para un mensaje de correo electrónico que tenga datos adjuntos, el encabezado debe tener el siguiente aspecto:
MIME-Version: 1.0
To: {email@domain}
Subject: {email-subject}
X-Priority: {2 (High)}
Content-Type: multipart/mixed; boundary="{mixed-boudary}"
En el ejemplo anterior, {mixed-boudary} puede ser cualquier valor hash único, como 000008050800060107020705. Los demás se explican por sí mismos.
Ahora, cada vez que queremos agregar una nueva entidad al mensaje (como el cuerpo del mensaje, una imagen, un archivo adjunto) tenemos que decirle al agente de correo electrónico que una nueva sección está por llegar , es decir. para prefijar esa entidad con el valor {mixed-boundary}. Llamamos a esto "abrir el límite". Tenga en cuenta que al abrir un límite no insertamos ese límite como se definió inicialmente, usamos dos signos menos al frente, como - {mixed-boudary}. Cuando cerramos un límite procedemos de la misma manera, excepto que tenemos que usar otros 2 signos menos al final, como - {mixed-boudary} -
--{mixed-boudary}
the entity content
--{mixed-boudary}--
Debido a que el agente de correo electrónico debe entender qué tipo tiene el contenido de nuestra nueva entidad insertada, debemos declararlo justo después de la apertura del límite. La declaración es solo un encabezado que contiene solo aquellos parámetros / valores que son compatibles con la entidad.
Para un contenido de cuerpo HTML, mi encabezado de entidad se vería así:
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: 7bit
por lo que todo el cuerpo (encerrado en los límites) finalmente se verá así:
--{mixed-boudary}
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: 7bit
<html>
<head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head>
<body bgcolor="#FFFFFF" text="#000000">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque vel
dapibus arcu. Duis quam dui, ornare non mi nec, luctus faucibus massa. Vivamus
quis purus in erat euismod ullamcorper vitae eget dolor. Aliquam tempor erat
accumsan, consectetur ex et, rhoncus risus.
</body>
</html>
Si tiene que insertarse otra entidad, procederemos exactamente como se indicó anteriormente. Cuando no hay más datos para agregar al mensaje, cerramos el límite mixto, es decir. CRLF + - {mixed-boudary} -.
Si por alguna razón una entidad tiene que ser insertada con una representación alternativa (por ejemplo, un mensaje corporal se inserta como formato de texto plano y también como formato HTML), entonces el contenido de la entidad debe declararse con tipo de contenido multiparte / alternativa (¡aunque el encabezado multipart / mixed global todavía permanece!). Cada representación alternativa estará encerrada por este nuevo límite.
Un ejemplo completo a continuación:
MIME-Version: 1.0
To: {email@domain}
Subject: {email-subject}
X-Priority: {2 (High)}
Content-Type: multipart/mixed; boundary="{mixed-boudary}"
--{mixed-boudary}
Content-Type: multipart/alternative; boundary="{alternative-boudary}"
--{alternative-boudary}
Content-Type: text/plain; charset=utf-8;
Content-Transfer-Encoding: 7bit
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque vel
dapibus arcu. Duis quam dui, ornare non mi nec, luctus faucibus massa. Vivamus
quis purus in erat euismod ullamcorper vitae eget dolor. Aliquam tempor erat
accumsan, consectetur ex et, rhoncus risus.
--{alternative-boudary}
Content-Type: text/html; charset=utf-8;
Content-Transfer-Encoding: 7bit
<html>
<head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head>
<body bgcolor="#FFFFFF" text="#000000">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque vel
dapibus arcu. Duis quam dui, ornare non mi nec, luctus faucibus massa. Vivamus
quis purus in erat euismod ullamcorper vitae eget dolor. Aliquam tempor erat
accumsan, consectetur ex et, rhoncus risus.
</body>
</html>
--{alternative-boudary}--
--{mixed-boudary}
Content-Type: application/pdf; name="myfile.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="myfile.pdf"
JVBERi0xLjINOCAwIG9iag08PCAvTGVuZ3RoIDkgMCBSIC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl
ID4+DXN0cmVhbQ1oQ51bbY/cNg7+BfsfhAUO11w3riW/B7gPaZEAAdpcm06RL8EBzoyn68uM
vZ3xZLv//khKsuUxNaMNiiabpUg+pKiHsmxJEcN/UsgiilP4ab2/+XF1I81vszSqclHIOEpj
sdrf/PC2EFVUpmK1vXkZxVKs1uJlJJVYPYrvPra7XVvvxYdIrE7rL83hhVj97+bNyjUoFam7
FnOB+tubGI3FZEkwmhpKXpVRnqJi0PCyjBJ1DjyOYqWBxxXp/1h3X+ov9abZt434pV0feoG/
ars/xU/9/qEZmm7diJ+abmgOr0TGeFNFEuXx5M4B95Idns/QAaJMI1IpKeXi9+ZhaPafm4NQ
cRwzNpK0iirlRvisRBZpVJa+PP51091kkjBWBXrJxUuZRjIXh0Z8FN3MnB5X5st5Kay9355n
--{mixed-boudary}--
CONSEJOS
Utilice su cliente de correo electrónico preferido (el mío es Thunderbird) y envíe a usted mismo un mensaje de texto simple solamente, un solo HTML, uno mixto, y luego cada uno de los anteriores, pero con un archivo adjunto adjunto. Cuando reciba el mensaje, simplemente estudie su fuente (Ver -> Fuente del mensaje).
@Edit: un caso de estudio muy bien documentado + ejemplo de PHP se puede encontrar aquí
Intenté la Respuesta 1 durante un par de horas sin suerte. Encontré una solución aquí: http://www.finalwebsites.com/forums/topic/php-e-mail-attachment-script
Funciona como un encanto, menos de 5 minutos! Es posible que desee cambiar (como lo hice), el primer tipo de contenido de texto / simple a texto / html.
Aquí está mi versión ligeramente modificada para manejar múltiples archivos adjuntos:
function mail_attachment($files, $path, $mailto, $from_mail, $from_name, $replyto, $subject, $message) {
$uid = md5(uniqid(time()));
$header = "From: ".$from_name." <".$from_mail.">/r/n";
$header .= "Reply-To: ".$replyto."/r/n";
$header .= "MIME-Version: 1.0/r/n";
$header .= "Content-Type: multipart/mixed; boundary=/"".$uid."/"/r/n/r/n";
$header .= "This is a multi-part message in MIME format./r/n";
$header .= "--".$uid."/r/n";
$header .= "Content-type:text/html; charset=iso-8859-1/r/n";
$header .= "Content-Transfer-Encoding: 7bit/r/n/r/n";
$header .= $message."/r/n/r/n";
foreach ($files as $filename) {
$file = $path.$filename;
$file_size = filesize($file);
$handle = fopen($file, "r");
$content = fread($handle, $file_size);
fclose($handle);
$content = chunk_split(base64_encode($content));
$header .= "--".$uid."/r/n";
$header .= "Content-Type: application/octet-stream; name=/"".$filename."/"/r/n"; // use different content types here
$header .= "Content-Transfer-Encoding: base64/r/n";
$header .= "Content-Disposition: attachment; filename=/"".$filename."/"/r/n/r/n";
$header .= $content."/r/n/r/n";
}
$header .= "--".$uid."--";
return mail($mailto, $subject, "", $header);
}