事実
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アカウントへのアクセスを許可しました
そして今、完全に機能しています。
このガイドの "Gmail SMTPサーバーを使用" セクションには、 「安全性の低いアプリ」を有効にする が必要であると記載されています。
いくつかのデバッグ手順:
phpinfo()
をチェックして、すべてのモジュールが有効になっているかどうかを確認することをお勧めします。メールを確認します、fsocketopen。
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サーバーに接続することさえできません。
Host
構成にプロトコルを含めないでください。失敗する理由は、おそらくssl://smtp.gmail.com
でDNSルックアップを実行しようとして失敗しているためです。
変化する
'Host' => 'ssl://smtp.gmail.com',
に
'Host' => 'smtp.gmail.com',
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) ""
何かが失敗し、デバッグが必要な原因がわからない場合。だからここに答えを出す代わりに、いくつかのテストを実行するように要求しています
インターネットとのシステム接続を確認:cmdターミナルを開いて入力
ping smtp.gmail.com
ファイアウォールの確認:cmdターミナルに次のように入力します
telnet smtp.gmail.com 465
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';
}
pear MailライブラリとGmail SMTPアクセスを確認します:もう一度cmdとphpプロンプトphp -a
で独自のコードを実行します(このスレッドに投稿したとおり)
そして、それがどこで壊れているか、そして何がエラーなのかを知ることができます。その後のみ私たちは助けることができます
ビーン・キョンヨンは、これまで問題の解決に有意義な貢献をした唯一の人物です(+1ビーン!)。彼の結果を確認できます。そして、同じことを試してみることをお勧めします。現在、かなり複雑なコンポーネントのスタックをデバッグしようとしています:
質問を投稿している人として、あなたのために仕事をしているのは 最小、完全、検証可能な例
これは、より意味のある診断情報も提供することを期待しています。
これが失敗する最も可能性の高い理由は次のとおりです。
したがって、テストスクリプトのより複雑な実装を検討することができます。
<?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を設定していない です。
始める前に、サーバーとgoogleサーバーの間に多くの解決策と結果がある可能性があるため、これらを別の人に使用できる場合としない場合があることを、序文で述べておきます。
1)SMTPはあまり安全ではないため、Googleがリクエストを拒否している可能性があります。 6か月前にこの問題が発生しましたが、ソリューションは「myaccount.google.com」で安全でないアプリを有効にしていました
2)それがうまくいかない場合は、プロトコルの切り替えを検討してください。
から
'Host' => 'ssl://smtp.gmail.com',
に
'Host' => 'tls://smtp.gmail.com:587';
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'
));