web-dev-qa-db-fra.com

Utilisation de gmail smtp via Laravel: la connexion n’a pas pu être établie avec l’hôte smtp.gmail.com [Expiration de la connexion # 110]

Lorsque j'essaie d'utiliser GMail SMTP pour envoyer un courrier électronique via Laravel, je rencontre l'erreur suivante:

Swift_TransportException

Connection could not be established with Host smtp.gmail.com [Connection timed out #110]

C'est la trace de l'erreur:

...
 }
$this->_stream = @stream_socket_client($Host.':'.$this->_params['port'], $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, stream_context_create($options));
if (false === $this->_stream) {
throw new Swift_TransportException(
'Connection could not be established with Host ' . $this->_params['Host'] .
' [' . $errstr . ' #' . $errno . ']'...

et voici ma configuration pour mail:

'driver' => 'smtp',

'Host' => 'smtp.gmail.com',

'port' => 587,

'from' => array('address' => '[email protected]', 'name' => 'some'),

'encryption' => 'tls',

'username' => '[email protected]',

'password' => 'mypassword',

'sendmail' => '/usr/sbin/sendmail -bs',

'pretend' => false

J'utilise un hôte partagé et le port 587 sur localhost est ouvert.

15
Ahmad

J'ai eu le même problème et je l'ai résolu de cette façon:

'driver' => 'sendmail',

Vous devez changer uniquement cette ligne.

33
PapaSmurf

Après de nombreuses recherches, j’ai trouvé celui-ci utile.

https://www.google.com/settings/security/lesssecureapps .

Ouvrez le lien ci-dessus.

Cliquez sur Activer. Et enregistrez-le. 

Ensuite, essayez d'envoyer à nouveau un courrier électronique.

Pour moi cela a fonctionné.

13
Arjita Mitra

Fonctionne pour moi avec les mêmes paramètres sauf le cryptage et le port. Changer en:

'encryption' => ssl,
'port' => 465,

Comme il s’agit uniquement de localhost, la ligne de chiffrement doit également être spécifique à l’environnement. Donc au lieu de cela, j'ai fait ce qui suit:

env('MAIL_ENCRYPTION','tls'),

Maintenant, vous pouvez définir ceci dans un fichier .env, qui est spécifique à l’environnement et qui devrait être au format .gitignore.

5
ruuter

J'ai eu le même problème en utilisant laravel forge + digitalocean.

Je trouve quand j'essaie telnet smtp.gmail.com 465 

telnet smtp.gmail.com 465
Trying 2404:6800:4003:c00::6d...  # more than 30 sec
Trying 74.125.200.108...          # less 1 sec
Connected to smtp.gmail.com.

C'est peut-être IPv6 que la connexion a expiré.

Donc, je change gai.conf pour donner la priorité à ipv4 par rapport à ipv6

vi /etc/gai.conf 

#For sites which prefer IPv4 connections change the last line to
precedence ::ffff:0:0/96 100
...
#    For sites which use site-local IPv4 addresses behind NAT there is
#    the problem that even if IPv4 addresses are preferred they do not
#    have the same scope and are therefore not sorted first.  To change
#    this use only these rules:
#
scopev4 ::ffff:169.254.0.0/112  2
scopev4 ::ffff:127.0.0.0/104    2
scopev4 ::ffff:0.0.0.0/96       14
4
李偉成

Le problème est que smtp.gmail.com résout une adresse IPv6 et que le service Google n'écoute que sur IPv4. Ce que vous devez faire, c'est définir l'adresse IP source pour garantir la résolution des domaines en tant qu'IPv4 et non pas IPv6.

La méthode importante:

    ->setSourceIp('0.0.0.0')

Comment l'utiliser dans le code:

   $this->_transport = Swift_SmtpTransport::newInstance
        (
            'smtp.gmail.com',
            465,
            'ssl'
        )
            ->setUsername('username')
            ->setSourceIp('0.0.0.0')
            ->setPassword('password');
4
John Foley

J'ai résolu le mien en changeant mon fichier .env comme suit:

'driver' => 'sendmail',
2
EasyWay

Essayer 

'encryption' => 'ssl',

'port' => 465,
1

Dans votre terminal, utilisez cette commande

Connectez-vous dans "Soumission Postfix"

1
michael adeyanju

L'erreur peut être due à la vérification en 2 étapes activée. Dans ce cas, vous devez créer un mot de passe pour l'application gmail et l'utiliser comme mot de passe.

0
Sabih Ahmad Khan

J'ai eu le même problème avec Swiftmailer

Quoi qu'il en soit, un hack sale à ne pas utiliser serait de modifier swiftmailer\swiftmailer\lib\classes\Swift\Transport\StreamBuffer.php. Dans _establishSocketConnection (), ligne 253, remplacez:

$options = array();

avec quelque chose comme ça:

$options = array('ssl' => array('allow_self_signed' => true, 'verify_peer' => false));

Cela va changer les options ssl de stream_context_create () (quelques lignes sous $ options):

$this->_stream = @stream_socket_client($Host.':'.$this->_params['port'], $errno, 
$errstr, $timeout, STREAM_CLIENT_CONNECT, stream_context_create($options));

Il y a un sale bidouillage pour cela Vous pouvez le trouver ici

Aussi mon ENV est réglé pour

MAIL_DRIVER=smtp
MAIL_Host=mail.mydomain.com
MAIL_PORT=587
[email protected]
MAIL_PASSWORD=mypassword
0
Bhavesh B

vous devez créer une authentification à 2 facteurs et un mot de passe personnalisé dans un compte Google. N'oubliez pas non plus d'ajouter un mot de passe personnalisé pour chaque nouvel hôte que vous utilisez.

0
Sough

S'il s'agit d'un compte autre que Google Apps, activez définitivement l'accès à partir d'applications moins sécurisées, comme suggéré. Si vous ne faites pas ça, ça ne marchera pas.

S'il s'agit d'un compte Google Apps (c'est-à-dire d'un compte professionnel), un panneau d'administration régit l'accès. Vous devrez vous assurer que c'est uniquement en spécifiant l'accès par authentification et non par IP, car si c'est par IP, votre adresse IP n'est probablement pas sur la liste.

La dernière chose à faire est d'utiliser l'adresse IPv4 de smtp.gmail.com à la place de ce nom de domaine dans votre code. J'ai trouvé que le mien ne se connecterait pas en utilisant le domaine (car il s'agissait d'une adresse IPv6), mais se connectait lorsque j'utilisais l'adresse IP brute à sa place.

0
gregsanderson

Pour une solution temporaire, vous pouvez résoudre le problème en mettant à jour le fichier env en tant que 'driver' => 'sendmail'

0
Jaymin Patel