Utiliser swiftmailer de php avec gmail

j'écris un script simple dans lequel un compte gmail est utilisé pour envoyer un e-mail à lui-même.

j'ai modifié le script à partir de SwiftMailer référence, mais je n'obtiens aucun résultat. Quel est le problème?

Edit: après un nouveau débogage, j'ai trouvé que la déclaration

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

provoque l'échec du code (l'écho ci-dessous ne s'affiche pas).

Pourquoi est-ce? Juste parce que le message n'est pas envoyé le programme s'écrase? :/

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

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>
34
demandé sur gibberish 2010-08-13 20:33:49

6 réponses

Je ne veux pas ressusciter un vieux post, mais juste au cas où d'autres sont à la recherche de la réponse, et parce que ce post est venu pendant ma recherche d'une solution malgré l'âge.

lorsque vous utilisez PHP SwiftMailer pour vous connecter à des comptes de messagerie Gmail ou Googleapps, vous devez utiliser

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

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

Cela fonctionne très bien pour moi. Dans le code original, vous utilisez le port 587 et non 465 et vous ne spécifiez pas le protocole (ssl). Ne sais pas si cela peu importe, mais pour moi le port 587 a échoué et le 465 A bien fonctionné.

J'espère que ça aidera.

83
répondu fullybaked 2014-02-23 06:58:19

j'ai trouvé cette question en faisant une recherche google et j'ai utilisé le code dans la réponse fournie par fullybaked. Cela m'a amené au point où je pouvais voir dans les Exceptions lancées que le serveur Google smtp répondait avec un code d'erreur indiquant le mot de passe et le nom d'Utilisateur pas accepté. Après enquête, j'ai trouvé les étapes suivantes. Maintenant cela fonctionne bien et je peux continuer à étoffer le code pour la production.

pas sûr quand Google a fait le changement, mais en plus de la 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 Google smtp.

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

1) dans Google "Account settings" activer "Access for less secured apps" en le paramétrant à "Allow".

2) dans les paramètres gmail sous l'onglet "Forwarding et POP/IMAP", cochez la case IMAP statut, il doit être activé. (Cela permettra de sauvegarder les e-mails envoyés dans le dossier envoyé.)

3) si après les étapes 1 et 2 Vous lancez toujours L'Exception smtp de Google le serveur n'accepte pas le nom d'utilisateur et le mot de passe, vous devez les ouvrir un navigateur, aller à gmail et se connecter, puis ouvrir un autre onglet dans le même navigateur et allez à 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 comme ceci cela lui permet d'être autorisé à utiliser votre compte gmail.

Espérons que cette aide.

32
répondu Gene 2015-04-19 09:03:16

j'ai trouvé que ce que evad a dit était vrai, mais j'ai dû changer un peu son travail pour la version actuelle de Swift Mailer. Maintenant, c'est:

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

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

ça devrait marcher.

6
répondu Richard 2012-02-15 11:22:55

le système SMTP de GMail a ses problèmes avec le SSL et les ports. J'ai du mal à le faire fonctionner avec PHP.

La meilleure chose que j'ai trouvé, qui ne fonctionne pas est phpGMailer. Vous pouvez peut-être passer au crible ce code pour voir comment ils l'ont fait fonctionner, mais cela a toujours fonctionné parfaitement pour moi.

je sais que ce n'est pas l'adresse de SwiftMail problème, juste pensé que je voudrais le signaler :)

3
répondu Brad F Jacobs 2010-08-13 16:47:18

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

3
répondu ducin 2012-09-23 12:07:20

je suis aussi venu ici après des heures de recherche. J'ai enfin trouvé la vraie réponse. Je voulais envoyer des e-mails depuis des serveurs de messagerie google et non depuis mon hôte avec une authentification smtp.

vous pouvez tracer un email avec ses en-têtes complets à l'intérieur de gmail, suivez ce guide.

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

@fullybaked avait la bonne réponse pour authentifier votre e-mail via smtp mais vous serait toujours envoyer via votre hôte.

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

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

@ducin avait raison 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, de l'utilisation;

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

si vous souhaitez envoyer directement depuis un serveur gmail, vous devez définir le mode d'autorisation. La plaine est par défaut.

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

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

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

en outre pour empêcher votre e-mail d'atterrir dans le dossier spam, vous devra aussi ajouter des enregistrements de texte DNS avec DKIM (domaine keys)

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

SPF records

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

et DMARC

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

0
répondu Dan Kinchen 2017-12-08 00:57:49