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' => '[email protected]', 'name' => 'some'),
'encryption' => 'tls',
'username' => '[email protected]',
'password' => 'mypassword',
'sendmail' => '/usr/sbin/sendmail -bs',
'pretend' => false
共有ホストを使用し、localhostのポート587が開いています。
私は同じ問題を抱えていたので、この方法で解決しました。
'driver' => 'sendmail',
その行のみを変更する必要があります。
多くの研究を行った後、私はこれが役立つことを発見しました。
https://www.google.com/settings/security/lesssecureapps 。
上記のリンクを開きます。
有効化をクリックします。そして保存します。
その後、もう一度メールを送信してください。
私にとってはうまくいった。
問題は、smtp.gmail.comがIPv6アドレスを解決しており、GoogleサービスがIPv4でのみリッスンしていることです。必要なのは、ドメインがIPv6ではなくIPv4として解決されるようにソースIPを設定することです。
重要な方法:
->setSourceIp('0.0.0.0')
コードでの使用方法:
$this->_transport = Swift_SmtpTransport::newInstance
(
'smtp.gmail.com',
465,
'ssl'
)
->setUsername('username')
->setSourceIp('0.0.0.0')
->setPassword('password');
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を変更して、ipv6よりもipv4を優先します。
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
暗号化とポートを除く同じ設定で動作します。への変更:
'encryption' => ssl,
'port' => 465,
これはローカルホスト専用であるため、暗号化行も環境固有でなければなりません。だから代わりに私は次のことをしました:
env('MAIL_ENCRYPTION','tls'),
これを.envファイルで設定できます。これは環境固有であり、.gitignoreにあるはずです
私の.envファイルを次のように変更して解決しました。
'driver' => 'sendmail',
試して
'encryption' => 'ssl',
'port' => 465,
エラーは、2ステップ検証が有効になっていることが原因である可能性があります。その場合、Gmailアプリのパスワードを作成し、これをパスワードとして使用する必要があります。
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));
これには汚いハックがあります ここで見つけることができます
また、ENVは
MAIL_DRIVER=smtp
MAIL_Host=mail.mydomain.com
MAIL_PORT=587
[email protected]
MAIL_PASSWORD=mypassword
googleアカウントに2要素認証とカスタムパスワードを作成する必要があります。また、使用する新しいホストごとにカスタムパスワードを追加することを忘れないでください。
Google Apps以外のアカウントの場合は、推奨されているように、安全性の低いアプリからのアクセスを必ず有効にしてください。そうしないと機能しません。
Google Appsアカウント(つまり、ビジネスアカウント)の場合、アクセスを管理する管理パネルがあります。 IPによるものである場合、IPはおそらくリストにないため、IPによるものではなく、認証によるアクセスのみを指定していることを確認する必要があります。
最後に試すべきことは、コードでそのドメイン名の代わりにsmtp.gmail.comのIPv4アドレスを使用することです。私は、IPv6アドレスに解決されたために、ドメインを使用して接続しませんが、代わりにraw IPを使用すると接続します。
ディスクの空き容量を確認してください。私の場合、100%使用しています。
一時的な修正として、envファイルを'driver' => 'sendmail'として更新することで問題を解決できます
端末でこのコマンドを使用します
「Postfix Submission」でSudo ufwを許可すると、SMTPのポート587が有効になります