Ответ 1
Использовать SMTP-сервер Gmail в этом руководстве говорит, что вам нужно включить" Менее безопасные приложения".
Факты
Я использую PEAR Mail, я хочу использовать gmail SMTP для отправки почты. У меня есть 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: )]
И я понятия не имею, что делать, я Googled, но я был более смущен.
Проконсультируйтесь о том, как это исправить. Спасибо вам
Обновление
Следуя инструкциям 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
Я googled просто "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)]
Итак, я googled code: 534, response: 5.7.14
и end-up здесь, следуя инструкциям первого ответа emgh3i, разрешил менее защищенные подключения и разрешил доступ к моей учетной записи google
И теперь он отлично работает.
Использовать SMTP-сервер Gmail в этом руководстве говорит, что вам нужно включить" Менее безопасные приложения".
Несколько шагов отладки:
Я рекомендую проверить 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
не должна содержать протокол. Причина, по которой это происходит, заключается в том, что она, вероятно, пытается выполнить поиск DNS на ssl://smtp.gmail.com
и не работает.
Изменить
'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)
string (0) ""
Только Kyung-yong является единственным человеком, который внес существенный вклад в решение проблемы до сих пор (+1 Been!). Я могу подтвердить его результат. И я бы порекомендовал вам попробовать то же самое. В настоящее время вы пытаетесь отладить довольно сложный стек компонентов:
Работает для вас - как человек, задающий вопрос - должен создать минимальный, полный и проверенный пример
Это, мы надеемся, также предоставит более значимую диагностическую информацию.
Наиболее вероятными причинами этого являются:
Следовательно, вы можете рассмотреть эту более сложную реализацию теста script:
<?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) ""
Учитывая, что мы не можем реплицировать вашу ошибку, мы не можем дать окончательного ответа, что проблема, но я предполагаю, что у вас есть" t настроить openSSL.
Прежде чем начать, позвольте мне предисловие к этому, что есть много возможных решений и результатов между вашим сервером и сервером google, поэтому они могут или не могут работать для разных людей.
1) SMTP не очень безопасен, поэтому Google может отклонить ваш запрос. У меня была эта проблема 6 месяцев назад, и это решение позволяло создавать небезопасные приложения под именем "myaccount.google.com"
2) Если это не работает для вас, вы можете рассмотреть возможность переключения протоколов.
от
'host' => 'ssl://smtp.gmail.com',
к
'host' => 'tls://smtp.gmail.com:587';
Когда что-то терпит неудачу, и мы не знаем причину, мы должны отлаживать. Таким образом, вместо того, чтобы отвечать на запросы, я прошу вас выполнить некоторые тесты
подтвердите подключение системы к Интернету: Откройте терминал CMD и введите
ping smtp.gmail.com
подтвердить брандмауэр: введите следующее в терминале cmd
telnet smtp.gmail.com 465
подтвердить настройку php: введите php -a
на терминал cmd и в командной строке php выполнить (скопировать/вставить, а затем нажмите клавишу ввода) следующего кода.
$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 и доступ к SMTP Gmail: снова в командной строке cmd и php php -a
выполните свой собственный код (как вы разместили в этом потоке)
И дайте знать, где он сломается, и какова ошибка. Только после этого мы можем помочь