web-dev-qa-db-fra.com

Utilisation de swiftmailer de php avec gmail

J'écris un script simple dans lequel un compte Gmail est utilisé pour envoyer un email à lui-même. 

J'ai modifié le script à partir de référence de SwiftMailer, mais je n'obtiens aucun résultat. Qu'est-ce qui ne va pas? 

Edit: après plus de débogage j'ai trouvé que la déclaration

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

provoque l'échec du code (l'écho en dessous ne s'imprime pas).

Pourquoi est-ce? Parce que le message n'est pas envoyé le programme se bloque? : / 

<!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>

Le formulaire de test:

<!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>
35
andandandand

Ne voulez pas ressusciter un ancien message, mais au cas où d’autres cherchent la réponse, et parce que ce message est apparu lors de ma recherche d’une solution malgré l’âge.

Lorsque vous utilisez PHP SwiftMailer pour vous connecter à des comptes de messagerie Gmail ou Google Apps, vous devez utiliser les éléments suivants:

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

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

Cela fonctionne bien pour moi. Dans le code d'origine, vous utilisez le port 587 et non le port 465 et vous ne spécifiez pas le protocole (ssl). Je ne sais pas si cela compte, mais pour moi le port 587 a échoué et le port 465 a bien fonctionné.

J'espère que cela pourra aider.

85
fullybaked

J'ai trouvé cette question en faisant une recherche sur Google et utilisé le code dans la réponse fournie par Fullybaked. Cela m'a permis de voir dans les exceptions générées que le serveur smtp de Google répondait avec un code d'erreur indiquant le mot de passe et le nom d'utilisateur non acceptés. Après une enquête plus poussée, j'ai trouvé les étapes suivantes. Maintenant, cela fonctionne très bien et je peux continuer à préciser le code de production.

Vous ne savez pas exactement quand Google a effectué la modification, mais en plus de configurer votre code avec votre nom d'utilisateur, votre mot de passe et votre port Google (465/ssl ou 587/tls), vous devez suivre les étapes suivantes pour pouvoir utiliser le serveur smtp de Google.

Pour utiliser le serveur smtp gmail avec votre compte gmail, vous devez:

1) Dans Google "Paramètres du compte", activez "Accès pour les applications moins sécurisées" en le configurant sur "Autoriser".

2) Dans les paramètres Gmail de l'onglet "Transfert et POP/IMAP", cochez la case Statut IMAP, il doit être activé . (Cela permettra aux e-mails envoyés d'être enregistrés dans le dossier envoyé.)

3) Si, après les étapes 1 et 2, vous lancez toujours le smtp .__ de Google. Le serveur n'accepte pas le nom d'utilisateur et le mot de passe dont vous avez besoin pour ouvrir un navigateur, allez sur gmail et connectez-vous, puis ouvrez un autre onglet dans le même navigateur andgo à cette adresse:
https://accounts.google.com/DisplayUnlockCaptcha

According to Google you may have to enter a captcha.

4) Envoyez immédiatement un email à partir de votre code car cela lui permettra d'être autorisé à utiliser votre compte gmail.

J'espère que cela t'aides.

35
Gene

J'ai trouvé que ce que evad avait dit était vrai, mais j'ai dû modifier légèrement son travail pour la version actuelle de Swift Mailer .

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

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

Devrait bien fonctionner.

6
Richard

465 est le port pour SSL, 587 est utilisé pour le chiffrement TLS (regardez http://swiftmailer.org/docs/sending.html#encrypted-smtp )

3
ducin

Le système SMMail de GMail a ses problèmes étant donné le SSL et les ports. J'ai du mal à le faire fonctionner correctement avec PHP.

La meilleure chose que j'ai trouvée, cela fonctionne est phpGMailer . Vous pourrez peut-être examiner ce code pour voir comment il fonctionne, mais cela a toujours fonctionné parfaitement pour moi. 

Je sais que cela ne résout pas le problème de SwiftMail, j'ai juste pensé que je le signalerais :)

3
Brad F Jacobs

Je suis aussi venu ici après des heures de recherche. J'ai finalement trouvé la vraie réponse. Je voulais envoyer des courriers électroniques à partir des serveurs de messagerie google et non de mon hôte avec authentification smtp.

Vous pouvez suivre un e-mail avec ses en-têtes complets dans Gmail. Suivez ce guide.

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

@fullybaked avait la bonne réponse pour authentifier votre email via smtp mais vous l'enverriez toujours via votre hébergeur.

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

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

@ducin était correct avec les différents ports et types de cryptage.

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

OU plus moderne et plus sûr, utilisez;

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

Si vous souhaitez envoyer directement à partir d'un serveur gmail, vous devez définir le mode d'autorisation. Plain est la valeur par défaut.

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

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

@gene est également correct, vous devez authentifier votre application, alors suivez ses instructions.

De plus, pour éviter que vos courriels ne se retrouvent dans le dossier de courrier indésirable, vous devrez également ajouter des enregistrements de texte DNS avec DKIM (clés de domaine).

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

Enregistrements SPF

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

et DMARC

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

0
Dan Kinchen