2010-08-13 15 views
32

Estoy escribiendo un script simple en el que se usa una cuenta de gmail para enviarse un correo electrónico.Uso del swiftmailer de php con gmail

He alterado la secuencia de comandos del reference de SwiftMailer, pero no estoy obteniendo ningún resultado. ¿Qué pasa?

Editar: Después de una nueva depuración he encontrado que la declaración

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

hace que el código para fallar (el eco de abajo no se imprime).

¿Por qué es esto? ¿Solo porque el mensaje no se envía, el programa falla? :/

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
</head> 

<body> 
<?php 
    require_once '/var/www/swift/lib/swift_required.php'; 
    echo 'Mail sent <br />'; 

/* //create the transport 
    $transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 587); 
     ->setUsername('[email protected]') 
     ->setPassword('softrain1234') 
    ; 
*/ 

    $transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 587) 
     ->setUsername('[email protected]') 
     ->setPassword('password') 
    ; 

    echo 'line 40 <br />'; 
    $mailer = Swift_Mailer::newInstance($transport); 
    $message = Swift_Message::newInstance('Wonderful Subject') 
     ->setFrom(array('[email protected]' => 'Evaluaciones')) 
     ->setTo(array('[email protected]'=> 'A name')) 
     ->setBody('Test Message Body') 
    ; 
    echo 'line 52 <br />'; 

    $result = $mailer->send($message); 
    echo $result; 
    echo 'line 58 <br />'; 

?> 
</body> 
</html> 

La forma de la prueba:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> 
     <title>Test Mail Script</title> 
    </head> 
    <body> 
     <form action="scriptmail.php" method="post"> 
      <input type="submit"/> 
      </table> 
     </form> 
    </body> 
</html> 
+0

Esto puede ser útil: http: // stackoverflow.com/a/12317831/386579 –

+0

me es útil: [Symfony - Cómo usar Gmail para enviar correos electrónicos] (http://symfony.com/doc/current/email/gmail.html) – Trix

+0

esto puede ser útil: https: //stackoverflow.com/a/46864725/4680523 – manish1706

Respuesta

3

El sistema SMTP de Gmail tiene sus problemas dado el SSL y puertos. Me resulta difícil hacer que funcione con PHP muy bien.

Lo mejor que he encontrado, que funciona es phpGMailer. Es posible que pueda examinar ese código para ver cómo lo hicieron funcionar, pero eso siempre me ha funcionado a la perfección.

Sé que esto no se aborda la cuestión SwiftMail, simplemente pensé que podría señalar eso :)

+0

Gracias, lo buscaré. Aún así, quiero arreglar esto. – andandandand

82

no me refiero a resucitar un antiguo puesto, pero en caso de que otros están buscando la respuesta, y porque esta publicación surgió durante mi búsqueda de una solución a pesar de la edad.

Cuando se usa PHP SwiftMailer para conectarse a Gmail o correo electrónico cuentas de Google Apps es necesario utilizar la siguiente

$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl') 
    ->setUsername($this->username) 
    ->setPassword($this->password); 

$this->mailer = Swift_Mailer::newInstance($transporter); 

Esto funciona muy bien para mí. En el código original, está utilizando el puerto 587 no 465 y no está especificando el protocolo (ssl). No sé si ese poco importa, pero para mí el puerto 587 falló y 465 funcionó bien.

Espero que ayude.

+2

Muchas gracias. Ahora funciona ^^ –

+6

Para aquellos que tienen habilitada la verificación en dos pasos en Goole, debe usar su contraseña generada. – singles

+0

bien, he declarado un transportista pero no el anuncio publicitario. demasiadas abstracciones para mi pequeña cabeza :-) +1 de todos modos –

5

Descubrí que lo que Evad dijo era verdad, pero tuve que cambiar un poco su trabajo para la versión actual de Swift Mailer. Ahora bien, es :

$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl') 
    ->setUsername('[email protected]') 
    ->setPassword('password'); 

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

debería funcionar bien.

+7

¿Hos es diferente de la solución completamente horneada? –

+1

este es el mismo que el anterior –

+0

Si alguien tiene un correo electrónico con una cuenta de aplicaciones de google usando su propio dominio registrado como [email protected]: http://stackoverflow.com/questions/17970096/swiftmailer-send-email- using-gmail-with-custom-domain –

31

me encontré con esta pregunta haciendo una búsqueda en Google y que utiliza el código en la respuesta proporcionada por fullybaked. Me llevó al punto donde pude ver en las Excepciones lanzadas que el servidor smtp de Google estaba respondiendo con un código de error que indicaba que no se aceptaba la contraseña y el nombre de usuario. Tras una investigación más profunda encontré los siguientes pasos. Ahora funciona muy bien y puedo seguir desarrollando el código para la producción.

No estoy seguro de cuándo Google realizó el cambio, pero además de configurar su código con su nombre de usuario, contraseña y puerto de Google (465/ssl o 587/tls) debe seguir los siguientes pasos para poder usar Google servidor SMTP.

para utilizar el servidor SMTP de Gmail con su cuenta de Gmail es necesario:

1) En "Configuración de cuenta" de Google permiten "acceso de aplicaciones menos seguras" estableciéndolo en "Permitir".

2) En la configuración de Gmail en la pestaña "Reenvío y POP/IMAP", verifique el estado IMAP , debe estar habilitado. (Esto permitirá que los correos electrónicos enviados a ser guardado en la carpeta de mensajes enviados.)

3) Si después de los pasos 1 y 2 aún emitir la excepción del servidor de Google SMTP no está aceptando el nombre de usuario y la contraseña es necesario abrir un navegador, ir a Gmail e ingrese, a continuación, abrir otra pestaña en el mismo navegador andgo a esta dirección:
https://accounts.google.com/DisplayUnlockCaptcha

According to Google you may have to enter a captcha. 

4) enviar de inmediato un correo electrónico de su código ya que esto permitirá que se ser autorizado para usar su cuenta de gmail t.

Espero que esto ayude.

+1

¡eres un rockstar! – uchamp

+0

@Gene Querido, he intentado todo esto. Todo funcionó en mi host local pero no en el servidor en vivo. Me enfrento a este error y no tengo éxito hasta después de 4 horas de búsqueda e intento de todo. "No se pudo autenticar en el servidor SMTP con nombre de usuario" [email protected] "usando 2 posibles autenticadores" –

+0

No presté mucha atención al paso 3, pero en realidad resolvió el problema –

0

También vine aquí después de horas de investigación. Finalmente encontré la verdadera respuesta. Quería enviar correos electrónicos desde los servidores de correo de google y no desde mi host con autenticación smtp.

Puede rastrear un correo electrónico con sus encabezados completos dentro de gmail, siga esta guía.

https://support.google.com/mail/answer/29436?hl=en

@fullybaked tenía la respuesta correcta para la autenticación de su correo electrónico a través de SMTP pero todavía sería el envío a través de su anfitrión.

@ducin era correcto con los diferentes puertos y tipos de cifrado.

$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl') 

O más moderno y más seguro, uso;

$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 587, 'tls') 

Si desea enviar directamente desde un servidor de Gmail, debe establecer el modo de autorización. Normal es el predeterminado.

$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 587, 'tls') 
->setAuthMode('login') 
->setUsername('[email protected]') 
->setPassword('password'); 

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

@gene también es correcto, usted tiene que autenticar su aplicación, por lo siga sus instrucciones.

adicional para evitar que su correo electrónico desde el aterrizaje en la carpeta de correo no deseado, también tendrá que añadir registros de texto dns con DKIM (teclas de dominio)

https://support.google.com/a/answer/174124?hl=en

registros SPF

https://support.google.com/a/answer/33786?hl=en

y DMARC

https://support.google.com/a/answer/2466580?hl=en

Cuestiones relacionadas