通过Laravel使用gmail smtp:无法与主机smtp.gmail.com建立连接[连接超时#110]

时间:2014-08-29 17:04:40

标签: laravel-4 smtp swiftmailer

当我尝试使用GMail SMTP通过Laravel发送电子邮件时,我遇到以下错误:

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' => 'some@example.ir', 'name' => 'some'),

'encryption' => 'tls',

'username' => 'myemail@gmail.com',

'password' => 'mypassword',

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

'pretend' => false

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

17 个答案:

答案 0 :(得分:36)

我遇到了同样的问题,我以这种方式解决了这个问题:

'driver' => 'sendmail',

您只需要更改该行。

答案 1 :(得分:13)

经过大量的研究后,我发现这个很有帮助。

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

打开上面的链接。

单击“启用”。并保存它。

然后尝试再次发送电子邮件。

对我而言,它有效。

答案 2 :(得分:4)

使用laravel forge + digitalocean我遇到了同样的问题。

我在尝试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.

可能是连接超时的IPv6。

所以,我改变gai.conf以优先ipv4而不是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

答案 3 :(得分:4)

除了加密和端口以外,我的设置相同。改为:

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

由于这仅适用于localhost,因此加密线也应该是特定于环境的。所以反过来我做了以下:

env('MAIL_ENCRYPTION','tls'),

现在你可以在.env文件中设置它,这是特定于环境的,应该是.gitignore

答案 4 :(得分:4)

问题是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');

答案 5 :(得分:2)

通过更改我的.env文件解决了我的问题:

'driver' => 'sendmail',

答案 6 :(得分:1)

尝试

'encryption' => 'ssl',

'port' => 465,

答案 7 :(得分:0)

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

答案 8 :(得分:0)

如果是非Google Apps帐户,请务必按照建议启用安全性较低的应用。如果你不这样做,它将无法正常工作。

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

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

答案 9 :(得分: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选项($ options下面几行):

$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
MAIL_USERNAME=noreply@mydomain.com
MAIL_PASSWORD=mypassword

答案 10 :(得分:0)

在您的终端中使用此命令

sudo ufw允许在“Postfix提交”中 这启用SMTP端口587

答案 11 :(得分:0)

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

答案 12 :(得分:0)

对于临时修复,您可以通过将环境文件更新为'driver'=>'sendmail'

来解决此问题

答案 13 :(得分:0)

检查可用磁盘空间。就我而言,我有100%使用过。

答案 14 :(得分:0)

打开您的.env文件并更改它

MAIL_DRIVER=smtp

TO

MAIL_DRIVER=sendmail

这解决了我的问题,希望对您有所帮助。

答案 15 :(得分:0)

对我来说,在尝试了上述所有解决方案后,唯一对我有用的是 暂时禁用我的防火墙和防病毒软件

答案 16 :(得分:0)

我在 MAC 上使用 MAMP。我在 MAC 上遇到了这个问题,需要遵循的步骤来解决这个问题

MAC 操作系统上的 SMTP 邮件

  1. 创建一个文件来存储我们的凭据:
sudo vim /etc/postfix/sasl_passwd
  1. 添加如下内容:
smtp.gmail.com:587 username@gmail.com:password
  1. 现在运行:
sudo postmap /etc/postfix/sasl_passwd
  1. 准备 postfix 主配置文件:
sudo vim /etc/postfix/main.cf
  1. 添加/更新这些行
    relayhost=smtp.gmail.com:587
    smtp_sasl_auth_enable=yes
    smtp_sasl_password_maps=hash:/etc/postfix/sasl_passwd
    smtp_use_tls=yes
    smtp_tls_security_level=encrypt
    tls_random_source=dev:/dev/urandom
    smtp_sasl_security_options = noanonymous
    smtp_always_send_ehlo = yes
    smtp_sasl_mechanism_filter = plain
  1. 停止/启动服务
sudo postfix stop
sudo postfix start
  1. 检查队列是否有任何错误
mailq

您的 .env 配置应如下所示

MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME="username@gmail.com"
MAIL_PASSWORD="password"
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS="username@gmail.com"
MAIL_FROM_NAME="${APP_NAME}"