Usando swiftmailer de php con gmail



2 Answers

Encontré esta pregunta haciendo una búsqueda en Google y usé 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 realizó el cambio Google, 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 el servidor de Google smtp.

Para usar el servidor smtp de gmail con su cuenta de gmail, necesita:

1) En Google, "Configuración de cuenta" habilita "Acceso para aplicaciones menos seguras" configurándolo en "Permitir".

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

3) Si después de los pasos 1 y 2 sigue lanzando la excepción, el servidor smtp de Google no acepta el nombre de usuario y la contraseña que necesita para abrir un navegador, vaya a gmail e inicie sesión, luego abra otra pestaña en el mismo navegador y acceda a esta dirección :
https://accounts.google.com/DisplayUnlockCaptcha

According to Google you may have to enter a captcha.

4) Inmediatamente envíe un correo electrónico desde su código, ya que esto le permitirá estar autorizado para usar su cuenta de Gmail.

Espero que esto ayude.

Question

Estoy escribiendo un script simple en el que se usa una cuenta de Gmail para enviarse un correo electrónico.

Alteré el guión de la reference de SwiftMailer, pero no estoy obteniendo ningún resultado. ¿Qué pasa?

Editar: después de una nueva depuración, encontré que la afirmación

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

hace que el código falle (el eco debajo 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('softrain.evaluaciones@gmail.com')
      ->setPassword('softrain1234')
    ;
*/

    $transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 587)
      ->setUsername('softrain.evaluaciones@gmail.com')
      ->setPassword('password')
    ;

    echo 'line 40 <br />';
    $mailer = Swift_Mailer::newInstance($transport);
    $message = Swift_Message::newInstance('Wonderful Subject')
      ->setFrom(array('softrain.evaluaciones@gmail.com' => 'Evaluaciones'))
      ->setTo(array('softrain.evaluaciones@gmail.com'=> 'A name'))
      ->setBody('Test Message Body')
    ;
    echo 'line 52 <br />';

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

?>
</body>
</html>

El formulario de 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>



El sistema GMail SMTP tiene sus problemas dado el SSL y los 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 aborda el problema de SwiftMail, solo pensé que lo señalaría :)




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 autenticar su correo electrónico a través de smtp, pero aún estaría enviando a través de su host.

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

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

@ducin fue correcto con los diferentes puertos y tipos de encriptación.

$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 configurar el modo de autorización. Normal es el predeterminado.

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

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

@gene también es correcto, tienes que autenticar tu aplicación, así que sigue sus instrucciones.

Además de evitar que su correo electrónico llegue a la carpeta de spam, también tendrá que agregar registros de texto dns con DKIM (claves 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






Related