how - Configuración de DomainKeys/DKIM en un cliente SMTP basado en PHP
how to create a dkim record (4)
¿Has phpMailDomainSigner : phpMailDomainSigner Es compatible con DKIM-Signature y DomainKey-Signature en el estilo orientado a objetos.
Aquí un ejemplo:
// Create mailDomainSigner Object
include_once ''./lib/class.mailDomainSigner.php'';
$mds = &new mailDomainSigner($domain_priv,$domain_d,$domain_s);
$new_data = $mds->sign(
$mail_data,
"Message-ID:Subject:From:Content-Type:MIME-Version:Content-Transfer-Encoding:Received:To:Date",
true,true,false);
Parece que hay algunas bibliotecas excelentes para hacer DomainKeys firmando correos electrónicos en C # / .NET, pero me cuesta mucho encontrar el mismo tipo de soporte para PHP. Tal vez no estoy buscando en el lugar correcto?
El único que encontré es http://php-dkim.sourceforge.net/ ; Se ve increíblemente hacky y soporta solo PHP4. Teniendo en cuenta lo popular que es PHP y la importancia de las claves de dominio para la clasificación de correo electrónico como no spam, esperaría mejores herramientas; ¿Sabes de alguno? ¿Algún otro truco que recomendarías?
Información adicional: estoy usando un proveedor SMTP externo porque necesito enviar miles de correos electrónicos por día.
Este es uno que ha estado en mi radar por un tiempo y no pudo encontrar una respuesta definitiva a la pregunta original en este hilo en ninguna parte de la web. Ahora he podido implementar el envío de correo electrónico SMTP firmado con DKIM con PHP / Pear. A continuación se presentan los pasos necesarios.
Encontré una versión modificada del DKIM de http://www.ra726.net/blog/2010/07/20/sending-email-to-gmail-from-php-without-being-marked-as-spam/ ( puede descargarlo a través de http://www.ra726.net/php-dkim.zip ). Si ya implementó DKIM y solo necesita hacer que funcione con el correo SMP, todo lo que necesita es el archivo dkim.php que, como dice el blog, se modifica ligeramente para manejar los encabezados que se pasan como una matriz. En mi código, lo he llamado dkimNEW.php.
Asegúrese de incluir la mayoría de los encabezados para que el MTA no modifique el mensaje después de haberlo firmado. En mi investigación limitada, los encabezados más agregados son los encabezados de fecha y de ID de mensaje, por lo que mi matriz de encabezados se ve así: Nota: ¡Usé esto para enviar un correo electrónico html, cámbielo! Además, agrega tu dominio como la última parte de la ID de mensaje
$headers = array( ''Subject'' => $subject, ''From'' => $from, ''To'' => $to, ''MIME-Version'' => ''1.0'', ''Date'' => date(''r''), ''Message-ID'' => ''<''.sha1(microtime(true)).''@yourdomain.com>'', ''Content-Type'' => ''text/html'', ''Content-Transfer-Encoding'' => ''quoted-printable'', ); // end $headers
Luego, podrá utilizar el dkim.php modificado mencionado anteriormente para firmar su correo electrónico Y agregar la firma a la matriz de encabezados, también conocido como
require ''dkimNEW.php''; $dkim = AddDKIM($headers, $subject, $body); $headers[''DKIM-Signature''] = $dkim;
El resto del código es el código normal para enviar correos electrónicos a través de SMTP con PHP / Pear. El código de trabajo completo es:
<?php
require_once ''Mail.php'';
require_once ''Mail/mime.php'';
// set all of the parameters
$subject = ''Test of DKIM'';
$from = ''My Name <[email protected]>'';
$to = ''First Recipient <[email protected]>'';
$pbody =''<html><head></head><body><h1>Done! DKIM test</h1>Result, next?</body></html>'';
$text = strip_tags($pbody);
// create the headers
$headers = array(
''Subject'' => $subject,
''From'' => $from,
''To'' => $to,
''MIME-Version'' => ''1.0'',
''Date'' => date(''r''),
''Message-ID'' => ''<''.sha1(microtime(true)).''@mydomain.com>'',
''Content-Type'' => ''text/html'',
''Content-Transfer-Encoding'' => ''quoted-printable'',
); // end $headers
// create the message
$mime = new Mail_mime("/n");
$mime->setTXTBody($text);
$mime->setHTMLBody($pbody);
// always call these methods in this order
$body = $mime->get();
$headers = $mime->headers($headers);
require ''dkimNEW.php'' ;
$dkim = AddDKIM($headers, $subject, $body);
$headers[''DKIM-Signature''] = $dkim;
// create the smtp mail object
$smtp_params = array(
''host'' => ''mail.mydomain.com'',
''auth'' => true,
''username'' => ''myUserName'',
''password'' => ''myPassWord'',
); // end $smtp_params
$smtp = Mail::factory(''smtp'', $smtp_params);
// send the message
$recipients = array(''[email protected]'', ''[email protected]'');
$mail = $smtp->send($recipients, $headers, $body);
?>
PD. ¡En caso de que no lo hayas notado, reemplaza los valores por los tuyos!
Por lo tanto, todo lo que esencialmente se necesita para hacer que DKIM funcione con el correo electrónico SMTP (o incluso con el correo PHP) es asegurarse de que especifica todos los encabezados que su MTA agrega a su correo electrónico, luego firma los encabezados, el asunto y el cuerpo de el mensaje, y finalmente incluir esa parte firmada con su encabezado.
Recomendaría el soporte de DKIM a nivel de MTA para que todos los correos electrónicos generados por su servidor para un dominio dado estén firmados de forma predeterminada. (a menos que tenga una buena razón para no firmar todos los correos electrónicos generados por un servidor para un dominio).
El mejor punto de partida en mi búsqueda de Google para configurar DKIM en LAMP con dkim-milter y sendmail (en CentOS 5.2 en mi caso) fue la publicación de Jeff Atwood sobre el envío de correos electrónicos a través del código .
Estoy de acuerdo con él en que las dos primeras cosas que debe abordar son el registro PTR inverso y la firma DKIM.
También muy importante:
- La dirección IP de la casilla para enviar el correo electrónico que aún no está en la lista negra.
- asegúrese de que [email protected] sea un buzón de correo electrónico válido
- Si su correo electrónico generado por el servidor debe aparecer en otro lugar (como un formulario de contacto que debe provenir del nombre / correo electrónico proporcionado en un formulario), siga estas pautas para los encabezados de correo electrónico .
Aquí está el comprobador de lista negra de direcciones IP de correo electrónico que utilicé.
Esas 5 cosas resolverán quizás el 95% de sus problemas de entrega de correo electrónico.
Esta guía para Fedora / dkim-milter / postfix también es muy buena.
La biblioteca de correo PHP que uso para mi aplicación es PHPMailer 5.1, que es compatible con DKIM (y es solo para PHP 5), pero después de realizar la investigación, decidí que la implementación a nivel de sendmail era una solución mejor. Como puede ver, incluso el autor de PHPMailer 5.1 no sugiere que DKIM a nivel de biblioteca de correo PHP sea la mejor solución http://dkim.worxware.com/ .
La mejor de las suertes para ti.
Una clase exclusiva para DKIM que es un spin-off de PHPMailer, pero con mejoras respecto al respeto de la RFC y el código de limpieza y limpieza:
https://sourceforge.net/projects/dkim-class-php/
Ejemplo:
include_once(''dkim.class.php'');
$dkim = new DKIM();
$dkim_header = $dkim -> get_DKIM_header($to, $subject, $message, $headers);
mail($to, $subject, $message, $dkim_header.$headers);