web-dev-qa-db-ja.com

PEARメールはGmail SMTPに接続できません。ソケットに接続できませんでした

事実

PEARメールを使用しています。GmailSMTPを使用してメールを送信したいです。 Apache/2.4.27(Win64)PHP/7.2.0beta3、PEAR 1.10.15、Mail 1.4.1、Net_SMTP 1.8.0、Net_Socket 1.2.2があります。

_php.ini_に行き、_extension = php_openssl.dll_を追加しました。 _error.log_は、ssl関連のエラーを与えません。

ここにコードがあります

_require_once "Mail.php";

$from = '<[email protected]>';
$to = '<[email protected]>';
$subject = 'Hi!';
$body = "Hi,\n\nHow are you?";

$headers = array(
    'From' => $from,
    'To' => $to,
    'Subject' => $subject
);

$smtp = Mail::factory('smtp', array(
        'Host' => 'ssl://smtp.gmail.com',
        'port' => '465',
        'auth' => true,
        'username' => '[email protected]',
        'password' => 'mypassword'
    ));

$mail = $smtp->send($to, $headers, $body);

if (PEAR::isError($mail)) {
    echo('<p>' . $mail->getMessage() . '</p>');
} else {
    echo('<p>Message successfully sent!</p>');
}
_

問題

このエラーが表示されます

Failed to connect to ssl://smtp.gmail.com:465 [SMTP: Failed to connect socket: fsockopen(): unable to connect to ssl://smtp.gmail.com:465 (Unknown error) (code: -1, response: )]

どうすればいいのかわからない、グーグルで検索したが、もっと混乱した。

これを修正する方法についてアドバイスしてください。ありがとうございました

更新

Symcbeanの指示に従って、次の結果が得られました。

_bool(true) 

array(5) { 
[0]=> string(31) "alt3.gmail-smtp-in.l.google.com" 
[1]=> string(26) "gmail-smtp-in.l.google.com" 
[2]=> string(31) "alt4.gmail-smtp-in.l.google.com" 
[3]=> string(31) "alt1.gmail-smtp-in.l.google.com" 
[4]=> string(31) "alt2.gmail-smtp-in.l.google.com" } 
IPV4 address = 64.233.188.27

If you've got this far without errors then problem is with your SSL config

Check you've got your cacerts deployed in one of the following locations
default_cert_file = C:\Program Files\Common Files\SSL/cert.pem
default_cert_file_env = SSL_CERT_FILE
default_cert_dir = C:\Program Files\Common Files\SSL/certs
default_cert_dir_env = SSL_CERT_DIR
default_private_dir = C:\Program Files\Common Files\SSL/private
default_default_cert_area = C:\Program Files\Common Files\SSL
ini_cafile = 
ini_capath = 

If all good so far, then this bit should work....
fsockopen 
Warning: fsockopen(): SSL operation failed with code 1. OpenSSL Error messages: error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed in C:\Apache24\htdocs\phptest2.php on line 28

Warning: fsockopen(): Failed to enable crypto in C:\Apache24\htdocs\phptest2.php on line 28

Warning: fsockopen(): unable to connect to ssl://smtp.gmail.com:465 (Unknown error) in C:\Apache24\htdocs\phptest2.php on line 28
bool(false) int(0) string(0) "" 
_

行28はこの行var_dump(fsockopen("ssl://smtp.gmail.com", 465, $errno, $errstr, 3.0));です

再度、感謝します

#2を更新

「fsockopen():SSL操作はコード1で失敗しました。」最初の警告の。

終了 ここ 。答えのように、AVGのメールポートを変更しました。 symcbeanのコードはエラーなしで実行されますが、私のコードはmail error : authentication failure [SMTP: Invalid response code received from server (code: 534, response: 5.7.14 Please log in via your web browser and 5.7.14 then try again. 5.7.14 Learn more at 5.7.14 https://support.google.com/mail/answer/78754 c1sm1243434wre.84 - gsmtp)]で応答しました

だから私は_code: 534, response: 5.7.14_をグーグルで終了しました ここ 、emgh3iによる最初の答えの指示に従い、安全性の低い接続を有効にし、Googleアカウントへのアクセスを許可しました

そして今、完全に機能しています。

17
slevin

このガイドの "Gmail SMTPサーバーを使用" セクションには、 「安全性の低いアプリ」を有効にする が必要であると記載されています。

6
Don't Panic

いくつかのデバッグ手順:

1. phpinfoを確認する

phpinfo()をチェックして、すべてのモジュールが有効になっているかどうかを確認することをお勧めします。メールを確認します、fsocketopen。

2.デバッグフラグを有効にする

debugフラグを有効にして、問題を正確に確認します。以下のように。

$smtp = Mail::factory('smtp', array(
        'Host' => 'ssl://smtp.gmail.com',
        'port' => '465',
        'auth' => true,
        'debug' => true,
        'pipelining' => true,
        'username' => '[email protected]',
        'password' => 'xxx'
    ));

私のマシンで上記のコードを実行した後、私はフォロー応答を得ました。問題はあなたのものとは異なる場合があります。しかし、デバッグは私を助けてくれました。 2FAを有効にしているため、エラーが発生しました。また、ログインがブロックされたというメールも受け取りました。

DEBUG: Recv: 220 smtp.gmail.com ESMTP s65sm4891344pfi.36 - gsmtp DEBUG: Send: EHLO localhost DEBUG: Recv: 250-smtp.gmail.com at your service, [110.227.210.84] DEBUG: Recv: 250-SIZE 35882577 DEBUG: Recv: 250-8BITMIME DEBUG: Recv: 250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH DEBUG: Recv: 250-ENHANCEDSTATUSCODES DEBUG: Recv: 250-PIPELINING DEBUG: Recv: 250-CHUNKING DEBUG: Recv: 250 SMTPUTF8 DEBUG: Send: AUTH LOGIN DEBUG: Recv: 334 VsadfSFcm5hbWU6 DEBUG: Send: cGF0ZWwuZ29wYhkafdaASFnbWFpbC5jb20= DEBUG: Recv: 334 UGFzc3dvcmQ6 DEBUG: Send: OWwzMy5zaHlAbTE4 DEBUG: Recv: 534-5.7.14 Please log in via your web browser and DEBUG: Recv: 534-5.7.14 then try again. DEBUG: Recv: 534-5.7.14 Learn more at DEBUG: Recv: 534 5.7.14 https://support.google.com/mail/answer/78754 s65sm4891344pfi.36 - gsmtp DEBUG: Send: RSET DEBUG: Send: QUIT DEBUG: Recv: 250 2.1.5 Flushed s65sm4891344pfi.36 - gsmtp DEBUG: Recv: 221 2.0.0 closing connection s65sm4891344pfi.36 - gsmtp
authentication failure [SMTP: Invalid response code received from server (code: 534, response: 5.7.14 Please log in via your web browser and 5.7.14 then try again. 5.7.14 Learn more at 5.7.14 https://support.google.com/mail/answer/78754 s65sm4891344pfi.36 - gsmtp)]

更新:

あなたの問題は、PHPはGmailサーバーに接続することさえできません。

6
shyammakwana.me

Host構成にプロトコルを含めないでください。失敗する理由は、おそらくssl://smtp.gmail.comでDNSルックアップを実行しようとして失敗しているためです。

変化する

'Host' => 'ssl://smtp.gmail.com',

'Host' => 'smtp.gmail.com',
6
Adam Lavin

あなたのコードは正しいです

Gmailアカウントをテストしようとしました。メール送信が成功しました。

ソケット接続を確認してください

<?php

error_reporting(E_ALL);

var_dump(fsockopen("ssl://smtp.gmail.com", 465, $errno, $errstr));
var_dump($errno);
var_dump($errstr);

タイプ(ストリーム)のリソース(4)

int(0)

文字列(0) ""

5
Been Kyung-yoon

何かが失敗し、デバッグが必要な原因がわからない場合。だからここに答えを出す代わりに、いくつかのテストを実行するように要求しています

  1. インターネットとのシステム接続を確認:cmdターミナルを開いて入力

    ping smtp.gmail.com
    
  2. ファイアウォールの確認:cmdターミナルに次のように入力します

    telnet smtp.gmail.com 465
    
  3. phpのセットアップを確認します。cmd端末でphp -aと入力し、phpプロンプトで次のコードを実行(コピー/貼り付けしてEnterキーを押します)します。

    $result = fsockopen('ssl://smtp.gmail.com', 465, $error_no, $error_message, 5);
    if ($result === false) {
      echo "error no: $error_no error message: $error_message";
      echo print_r($result, true);
    } else {
      echo 'success';
    }
    
  4. pear MailライブラリとGmail SMTPアクセスを確認します:もう一度cmdとphpプロンプトphp -aで独自のコードを実行します(このスレッドに投稿したとおり)

そして、それがどこで壊れているか、そして何がエラーなのかを知ることができます。その後のみ私たちは助けることができます

4
Nasir Iqbal

ビーン・キョンヨンは、これまで問題の解決に有意義な貢献をした唯一の人物です(+1ビーン!)。彼の結果を確認できます。そして、同じことを試してみることをお勧めします。現在、かなり複雑なコンポーネントのスタックをデバッグしようとしています:

質問を投稿している人として、あなたのために仕事をしているのは 最小、完全、検証可能な例

これは、より意味のある診断情報も提供することを期待しています。

これが失敗する最も可能性の高い理由は次のとおりです。

  • これを実行しているホストは、外部への接続をインターネットにルーティングできません(ただし、デスクトップPCを使用しているように見えるため、これまでにこれに気付いたかもしれません)
  • コードはセキュリティサンドボックス内で実行されています(ただし、MSWindowsにはそのようなものはありません)
  • ホストはホスト名を解決できません(ルーティングに関する最初のポイントを参照)
  • ホストは接続できますが、証明書を検証できません

したがって、テストスクリプトのより複雑な実装を検討することができます。

 <?php

 error_reporting(E_ALL);

 print "DNS\n";
 var_dump(getmxrr('gmail.com',$result));
 var_dump($result);
 $use_ip=gethostbyname($result[0]);
 print "IPV4 address = $use_ip\n";

 print "\nIf you've got this far without errors then problem is with your SSL config\n";
 $calocns=openssl_get_cert_locations();
 if (count($calocns)) {
     print "Check you've got your cacerts deployed in one of the following locations\n";
     foreach ($calocns as $k=>$v) print "$k = $v\n";
 } else {
     print "You've not configured your openssl installation on this Host\n";
 }

 print "\nIf all good so far, then this bit should work....\n";
 print "fsockopen\n";
 var_dump(fsockopen("ssl://smtp.gmail.com", 465, $errno, $errstr, 3.0));
 var_dump($errno);
 var_dump($errstr);

次のような応答が返されます。

 DNS
 bool(true)
 array(5) {
   [0]=>
   string(31) "alt1.gmail-smtp-in.l.google.com"
   [1]=>
   string(31) "alt2.gmail-smtp-in.l.google.com"
   [2]=>
   string(31) "alt4.gmail-smtp-in.l.google.com"
   [3]=>
   string(26) "gmail-smtp-in.l.google.com"
   [4]=>
   string(31) "alt3.gmail-smtp-in.l.google.com"
 }
 IPV4 address = 74.125.131.26

 If you've got this far without errors then problem is with your SSL config
 Check you've got your cacerts deployed in one of the following locations
 default_cert_file = /usr/lib/ssl/cert.pem
 default_cert_file_env = SSL_CERT_FILE
 default_cert_dir = /usr/lib/ssl/certs
 default_cert_dir_env = SSL_CERT_DIR
 default_private_dir = /usr/lib/ssl/private
 default_default_cert_area = /usr/lib/ssl
 ini_cafile =
 ini_capath =

 If all good so far, then this bit should work....
 fsockopen
 resource(4) of type (stream)
 int(0)
 string(0) ""

エラーを再現できないことを考えると、問題が何であるかを明確に答えることはできません-しかし、私の推測では openSSLを設定していない です。

3
symcbean

始める前に、サーバーとgoogleサーバーの間に多くの解決策と結果がある可能性があるため、これらを別の人に使用できる場合としない場合があることを、序文で述べておきます。

1)SMTPはあまり安全ではないため、Googleがリクエストを拒否している可能性があります。 6か月前にこの問題が発生しましたが、ソリューションは「myaccount.google.com」で安全でないアプリを有効にしていました

enter image description here

2)それがうまくいかない場合は、プロトコルの切り替えを検討してください。

から

'Host' => 'ssl://smtp.gmail.com',

'Host' => 'tls://smtp.gmail.com:587';

2
Altimus Prime

PHP 5.3、Google Gmailアカウントにログインしたときにアクティベートする必要がある「安全性の低いアプリ」に関する他の人からのヒントは、私の問題をすべて解決しました。

In PHP 7.2私はもっとやらなければなりませんでした: 'auth'をPLAINに設定し、次のようにssl socket_optionsに "verify_peer"とverify_peer_nameを追加します。

$mail= Mail::factory('smtp', array('Host' => 'ssl://smtp.gmail.com',
                                   'port' => '465',
                                   'auth' => 'PLAIN',
                                   'socket_options' => array('ssl' => array('verify_peer' => false,
                                                                            'verify_peer_name' => false)),
                                   'username' => '[email protected]',
                                   'password' => 'myPassword'
));
0
user9359265