insertar - enviar html email php
¿Es esta la forma correcta de enviar correo electrónico con PHP? (2)
Estoy un poco preocupado si esta función envía correos electrónicos que pueden ser reconocidos correctamente en la mayoría de los clientes de correo electrónico y correo web de la forma que debería, específicamente estoy más preocupado por estas dudas:
- ¿Están bien formadas las declaraciones y los archivos adjuntos de la UTF-8?
- ¿Necesito usar quoted_printable_decode ()? ¿Si sí donde?
- Codificación de transferencia de contenido: 7 u 8 bits? Siempre he visto 7, pero desde que envío un correo codificado en UTF-8, no estoy seguro.
- ¿Debo usar mb_send_mail () o mail () es suficiente?
EDIT: No sé por qué, pero el código no se muestra correctamente, lo hice disponible en http://gist.github.com/104818
EDIT 2: Estoy al tanto de otras alternativas (bibliotecas) para el manejo del correo electrónico, pero por mi propia curiosidad y conocimiento, solo quiero saber si este código es 100% bueno o si tiene errores.
function Email($name, $from, $to, $subject, $message, $bcc = null, $attachments = null)
{
ini_set(''SMTP'', ''localhost'');
ini_set(''sendmail_from'', $from);
$name = filter_var($name, FILTER_SANITIZE_STRING);
$from = filter_var($from, FILTER_SANITIZE_EMAIL);
$subject = filter_var($subject, FILTER_SANITIZE_STRING);
$boundary = ''_Boundary_'' . md5(microtime(true) . mt_rand(0, PHP_INT_MAX));
$headers = array
(
''MIME-Version: 1.0'',
''Content-Type: multipart/mixed; boundary="Mixed'' . $boundary . ''"'',
''Date: '' . date(''r'', time()),
''From: "'' . $name . ''" <'' . $from . ''>'',
''Reply-To: "'' . $name . ''" <'' . $from . ''>'',
''Return-Path: "'' . $name . ''" <'' . $from . ''>'',
''X-Mailer: PHP '' . phpversion(),
''X-Priority: 2'',
''X-MSMail-Priority: High'',
''X-Originating-IP: '' . $_SERVER[''SERVER_ADDR''],
);
if (is_null($to) === false)
{
if (is_array($to) === false)
{
$to = explode('','', $to);
}
foreach ($to as $key => $value)
{
$to[$key] = filter_var($value, FILTER_SANITIZE_EMAIL);
}
$to = implode('', '', array_filter($to));
}
if (is_null($bcc) === false)
{
if (is_array($bcc) === false)
{
$bcc = explode('','', $bcc);
}
foreach ($bcc as $key => $value)
{
$bcc[$key] = filter_var($value, FILTER_SANITIZE_EMAIL);
}
$headers[] = ''BCC: '' . implode('', '', array_filter($bcc));
}
if (is_null($attachments) === false)
{
settype($attachments, ''array'');
foreach ($attachments as $key => $value)
{
if (is_file($value) === true)
{
$attachments[$key] = array
(
'''',
''--Mixed'' . $boundary,
''Content-Type: application/octet-stream; name="'' . basename($value) . ''"'',
''Content-Disposition: attachment; filename="'' . basename($value) . ''"'',
''Content-Transfer-Encoding: base64'',
'''',
trim(chunk_split(base64_encode(file_get_contents($value)))),
);
$attachments[$key] = implode("/n", $attachments[$key]);
}
else
{
unset($attachments[$key]);
}
}
$attachments = implode("/n", $attachments) . "/n";
}
$message = array
(
''This is a multi-part message in MIME format.'',
'''',
''--Mixed'' . $boundary,
''Content-Type: multipart/alternative; boundary="Alt'' . $boundary . ''"'',
'''',
''--Alt'' . $boundary,
''Content-Type: text/plain; charset="UTF-8"'',
''Content-Disposition: inline'',
''Content-Transfer-Encoding: 8bit'',
'''',
trim(strip_tags($message, ''<a>'')),
'''',
''--Alt'' . $boundary,
''Content-Type: text/html; charset="UTF-8"'',
''Content-Disposition: inline'',
''Content-Transfer-Encoding: 8bit'',
'''',
trim($message),
'''',
''--Alt'' . $boundary . ''--'',
$attachments,
''--Mixed'' . $boundary . ''--'',
);
if (@mail($to, stripslashes($subject), implode("/n", $message), implode("/n", $headers)) === true)
{
return true;
}
return false;
}
En la mayoría de las situaciones, lo hago todo para usted, pero en lo que respecta al correo, recomiendo encarecidamente hacerlo más fácil para usted y usar algo como Swift Mailer o PHPMailer (en ese orden, por mi dinero).
Como beneficio adicional (y suponiendo que especifique la respuesta a, etc.), también tiene menos posibilidades de ser etiquetado como spam.
Si bien eso debería funcionar, recomendaría encarecidamente el uso de una clase de correo / SMTP Zend_Mail como Zend_Mail . Si bien no creo que todo el Zend Framework sea el pijama del gato, tengo una muy buena opinión de su código de manejo de correo.
EDITAR: También debo agregar que el uso de una clase de correo / SMTP precompilada abstraerá casi toda la complejidad / estructura de los correos electrónicos de varias partes.
Actualización 2009-05-06: Respondiendo su pregunta directamente.
- ¿Están bien formadas las declaraciones y los archivos adjuntos de la UTF-8?
Se ven lo suficientemente decentes.
- ¿Necesito usar
quoted_printable_decode()
? ¿Si sí donde?
No. quoted_printable_decode()
usar quoted_printable_decode()
solo si está decodificando un mensaje de correo electrónico. No cuando estás codificando uno. ¿Debería usar quoted_printable_encode()
? Voy a discutir esto a continuación.
- Codificación de transferencia de contenido: 7 u 8 bits? Siempre he visto 7, pero desde que envío un correo codificado en UTF-8, no estoy seguro.
Utilice la codificación de 8 bits solo si sabe que el servidor SMTP de destino puede admitirlo. Sin embargo, ya que está pasando su correo electrónico al MTA local, no recomendaría establecer este valor. El valor predeterminado es la codificación de 7 bits, pero tiene su propio conjunto de restricciones: hasta 998 octetos por línea del rango de códigos 1-127 con CR y LF que solo pueden aparecer como parte de la línea CRLF que termina ( http://tools.ietf.org/html/rfc2045#section-2.7 ).
Le recomendaría que utilice la codificación de transferencia de contenido de Quoted-Printable ( http://tools.ietf.org/html/rfc2045#section-6.7 ). Cuando llame a trim(strip_tags($message, ''<a>''))
y trim($message)
, querrá quoted_printable_encode(trim(...))
con quoted_printable_encode(trim(...))
.
- ¿Debo usar
mb_send_mail()
omail()
es suficiente?
Si sabe que no va a manejar mensajes multibyte (japonés, coreano, chino, etc.), entonces el mail()
debería ser suficiente.
Ahora que he respondido sus preguntas iniciales, permítame decirle dónde existen algunos problemas.
- Está especificando que el conjunto de caracteres de sus partes de contenido de texto sin formato y HTML es UTF-8, sin embargo, no aparece, ya que realmente garantiza que realmente están codificados en UTF-8.
- Está verificando
null
en$to
,$bcc
,$attachments
antes de continuar procesándolos, sin embargo, no está haciendo nada cuando en realidad pueden sernull
. Por lo tanto, si recibe unnull
de$to
, no procesa la variable, pero continúa enviando un correo electrónico anull
.
A partir de ahora, eso es todo lo que voy a hacer, pero aún así voy a recomendar altamente una solución precompilada, ya que han tenido muchos usuarios / tiempo para resolver los errores.