07 diciembre 2007

Enviar correos desde php mediante gmail

Después de pasar largas horas investigando como se puede enviar un correo mediante php sin utilizar la función mail(), que tiene más complicación a la hora de dar formato al mensaje y utilizar adjuntos, llegué a phpmailer como la librería ideal para realizarlo.

phpmailer

Por desgracia en mi caso no he podido conseguirlo, a pesar de poder configurar bien el uso de openssl, siguiendo las instrucciones del primer comentario de esta página:

Openssl en php

Finalmente he encontrado otra librería llamada SwiftMailer, que hace lo mismo que phpmailer y que me ha funcionado a la primera.

Swiftmailer

Básicamente, puedo enviar un correo a través de gmail y o de cualquier otro servidor que utilice autencicación TSL o SSL y los puertos 465 o 587 mediante esta pequeña secuencia de código:
require_once "lib/Swift.php";
require_once "lib/Swift/Connection/SMTP.php";

$smtp =& new Swift_Connection_SMTP("smtp.gmail.com", Swift_Connection_SMTP::PORT_SECURE, Swift_Connection_SMTP::ENC_TLS);
$smtp->setUsername("miusuario");
$smtp->setpassword("miclave");

$swift =& new Swift($smtp);

$message =& new Swift_Message("Prueba", "Prueba");

if ($swift->send($message, "prueba@gmail.com", "prueba@gmail.com")) echo "Funciona";
else echo "Algo raro ha pasado";

Espero que esto le sea de ayuda a alguien y se ahorre unos buenos ratitos.

Ahora sólo queda empezar a profundizar en las capacidades de formato que proporciona swiftmailer. Aquí hay una lista de las ventajas que ellos indican en su página web:
  • Persistent connectivity improves performance
  • Connection types selected by user - extendable
  • Complete header control with RFC 2822 requirements handled
  • Internationalization support (i18n)
  • Connection redundancy support
  • Load balancing and/or throttling support
  • SSL & TLS Support - for Gmail servers
  • Embedded images or other file types
  • Full MIME 1.0 library included (create multipart messages, attachments etc)
  • Batch mail processing
  • Smart runtime caching (in small, self-maintained packets)
  • Send attachments of any size even with PHP's 8MB Memory Limit
  • Support for multiple attachments
  • Lossless protection against header injection (encode, don't strip)
  • Set message priority
  • Request read receipts
  • Pluggable SMTP authentication (LOGIN, PLAIN, MD5-CRAM, POP Before SMTP)
  • Anti-flooding support for servers with limits on emails-per-connection
  • Bandwidth monitor included
  • Extensive event-driven plugin support (easy to write)
No está mal.

10 comentarios:

Anónimo dijo...

No funciona.

Me sale este error

Fatal error: Uncaught exception 'Swift_ConnectionException' with message 'The SMTP connection failed to start [tls://smtp.gmail.com:465]: fsockopen returned Error Number 108536248 and Error String 'Unable to find the socket transport "tls" - did you forget to enable it when you configured PHP?'' in C:\xampp\htdocs\mail\SwiftMailer\lib\Swift\Connection\SMTP.php:309 Stack trace: #0 C:\xampp\htdocs\mail\SwiftMailer\lib\Swift.php(216): Swift_Connection_SMTP->start() #1 C:\xampp\htdocs\mail\SwiftMailer\lib\Swift.php(101): Swift->connect() #2 C:\xampp\htdocs\mail\SwiftMailer\enviar.php(26): Swift->__construct(Object(Swift_Connection_SMTP)) #3 {main} thrown in C:\xampp\htdocs\mail\SwiftMailer\lib\Swift\Connection\SMTP.php on line 309

Tengo ssl habilitado



Alguna otra idea?

Antonio dijo...

Lo primero sería comprobar como tienes los firewall, por si acaso hay algún bloque que impide llegar al servidor.

En su momento también leí algo sobre problemas en el uso de SSL en Windows. ¿Tienes posibilidad de probarlo en Linux o en algún servidor de pruebas? Eso te ayudaría a descartar cosas.

Suerte.

Anónimo dijo...

Hola, yo llevo toda la tarde intentando mandar un correo A gmail, no DESDE gmail y no soy capaz...

te pego el código por si acaso, pero es muy sencillito y muy similar al tuyo. Con las cuentas de mi dominio sí q funciona, pero con gmail y hotmail no...
///////////////////////////////////////////
$message = Swift_Message::newInstance()

->setSubject('Generado Automáticamente')
->setFrom(array('administrador@midominio.es' => 'midominio.es'))

->setTo(array('********@gmail.com' => 'Nombre'))

->setBody('Mensaje Leñe')
->attach(Swift_Attachment::fromPath('pie_mail.jpg'));


//Create the Transport
$transport = Swift_SmtpTransport::newInstance('smtp.******.es', 25);
$transport->setUsername('administrador');
$transport->setPassword('******');

$mailer = Swift_Mailer::newInstance($transport);

$result = $mailer->send($message);

///////////////////////////////////////////

En la cuenta de Gmail ni aparece en Spam ni en ningún lado...

Si se te ocurre alguna cosa...

No obstante muy bueno el blog :)

Antonio dijo...

¿Has comprobado si te envia a cualquier otra dirección?

Lo que sí te puedo confirmar es que yo envío a cuentas de gmail diariamente y no he tenido problema nunca, por eso se me ocurre que quizás no te está enviando correos a ninguna parte. ¿Podría ser?

Wilfo dijo...

AMIGO LES COMENTYO QUE NO ME FUNCIONA PODRIAN ENVIARME UN EJEMPLO MI CORREO ES WILFOLIGHTFIRE18@HOTMAIL.COM .DE ANTEMANO AGRADESCO POR TODO

richard venegas dijo...

simplemente podrian pner un ejemplo con todo el codigo ya que por ej donde ponen todo ese pequeño codigo que describen , donde se gusrdan las librerias???? etc

Antonio dijo...

Ese código iría dentro de la página php desde la que quieres enviar el correo.

Las librerías de swiftmail las tienes que ubicar en alguna carpeta de tu proyecto. Luego lo indicas mediante el "require_once". En mi caso, si te fijas, las tengo dentro de una carpeta llamada "lib".

Si te has descargado las librerías de swift_mail encontrarás una carpeta llena de ejemplos concretos llamada "test", además de la carpeta "docs", que contiene la documentación sobre cómo usar de forma más concreta la librería.

Hosting dijo...

tener en cuenta que gmail para pop3 imap debe habilitar la funcion en el panel de configuracion. saludos.

geek dijo...

hola, ¿qué versión de switfmailer tienes? Yo me he bajado la 4.0.6 y no encuentro el directorio Connection ni el fichero smtp.php ¿algún consejo?
Gracias

Antonio dijo...

Buff, acabo de mirar y lo monté con la versión 3.3.2, del año 2007.

Creo que me va tocando renovarla.