2014-08-29 117 views
12

当我尝试使用Gmail的SMTP通过Laravel发送电子邮件,我会遇到以下错误:通过Laravel为使用Gmail SMTP:连接无法与主机smtp.gmail.com建立[连接超时#110]

Swift_TransportException 

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

这是错误的轨迹:

... 
} 
$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 . ']'... 

,这里是我的邮件配置:

'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 

我使用共享主机,并且localhost上的端口587已打开。

回答

1

尝试

'encryption' => 'ssl', 

'port' => 465, 
0

如果它不是Google Apps帐户,则建议您可以使用安全性较低的应用进行访问。如果你不这样做,它不会工作。

如果它是一个Google Apps帐户(即它是一个商业帐户),那么有一个管理面板来管理访问。您需要确保它只是通过身份验证指定访问权限,而不是通过IP指定访问权限,因为如果通过IP,您的IP大概不在列表中。

最后要尝试的是使用smtp.gmail.com的IPv4地址代替代码中的域名。我发现我的连接不会使用域(因为解析为IPv6地址),而是会在我使用原始IP时连接。

26

我有同样的问题,我解决它以这样的方式

'driver' => 'sendmail', 

你只需要改变该行。

+0

你用Gmail的smtp?那么我认为司机应该是smtp,不是? – Ahmad 2015-01-23 18:18:43

+1

这是通过,但**电子邮件**不发送。 – ihue 2015-11-10 13:20:46

+0

我在哪里可以找到这些配置? – mr5 2016-02-09 07:51:25

3

问题是smtp.gmail.com正在解析IPv6地址,而且Google服务只能侦听IPv4。你需要做的是设置源IP,以确保域名解析为IPv4而不是IPv6。

的重要方法:

->setSourceIp('0.0.0.0') 

了如何在代码中使用它:启用

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

我可以在哪里设置? 也许你可以帮助我。看看这个:https://stackoverflow.com/questions/48654849/how-can-i-solve-connection-could-not-be-established-with-host-smtp-gmail-com – 2018-02-07 09:40:18

0

该错误可能是由于两步骤验证。在这种情况下,您需要创建gmail应用程序密码并将其用作密码。

4

适用于我,除了加密和端口相同的设置。更改为:

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

由于这仅适用于本地主机加密行,因此也应该是特定于环境的。所以不是上面我没有以下内容:

env('MAIL_ENCRYPTION','tls'), 

现在你可以在.ENV文件,这是特定环境,应该是在的.gitignore

+0

这一个适合我! – codecarver 2017-08-31 09:17:39

0

我使用Swiftmailer

反正同样的问题设置此,一个你不应该使用的快速肮脏的黑客将编辑swiftmailer \ swiftmailer \ lib \ classes \ Swift \ Transport \ StreamBuffer.php。在_establishSocketConnection()线253取代:

$options = array(); 

像这样的东西:

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

这将改变stream_context_create的)的SSL选项((几行低于$选项):

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

这里有一个肮脏的黑客You can find it here

此外我的ENV是设置为

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

此命令优先考虑的IPv4在你的终端使用

须藤UFW允许 “后缀提交” 这使用于SMTP的端口587

2

通过更改我的.env文件解决了我的问题,如下所示:

'driver' => 'sendmail', 
+0

这对我工作.. – 2017-09-18 04:33:20

0

您需要在Google帐户中创建2个因子认证和自定义密码。另外不要忘记为每个正在使用的新主机添加自定义密码。

相关问题