PEAR Mail не удалось подключиться к Gmail SMTP, не удалось подключиться к сокету

Факты

Я использую 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

И теперь он отлично работает.

Ответы

Ответ 2

Несколько шагов отладки:

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.

Ответ 3

Конфигурация host не должна содержать протокол. Причина, по которой это происходит, заключается в том, что она, вероятно, пытается выполнить поиск DNS на ssl://smtp.gmail.com и не работает.

Изменить

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

к

'host' => 'smtp.gmail.com',

Ответ 4

Правильный код

Я попытался проверить свою учетную запись 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) ""

Ответ 5

Только Kyung-yong является единственным человеком, который внес существенный вклад в решение проблемы до сих пор (+1 Been!). Я могу подтвердить его результат. И я бы порекомендовал вам попробовать то же самое. В настоящее время вы пытаетесь отладить довольно сложный стек компонентов:

Работает для вас - как человек, задающий вопрос - должен создать минимальный, полный и проверенный пример

Это, мы надеемся, также предоставит более значимую диагностическую информацию.

Наиболее вероятными причинами этого являются:

  • хост, на котором вы выполняете это, не может маршрутизировать исходящие подключения к Интернету (но поскольку вы, кажется, используете настольный ПК, я думаю, вы могли бы заметить это к настоящему времени)
  • код работает в изолированной программной среде (но MSWindows действительно не имеет таких вещей)
  • хост не может решить имя хоста (см. первый пункт о маршрутизации)
  • хост может подключиться, но не может проверить сертификат

Следовательно, вы можете рассмотреть эту более сложную реализацию теста 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.

Ответ 6

Прежде чем начать, позвольте мне предисловие к этому, что есть много возможных решений и результатов между вашим сервером и сервером google, поэтому они могут или не могут работать для разных людей.

1) SMTP не очень безопасен, поэтому Google может отклонить ваш запрос. У меня была эта проблема 6 месяцев назад, и это решение позволяло создавать небезопасные приложения под именем "myaccount.google.com"

введите описание изображения здесь

2) Если это не работает для вас, вы можете рассмотреть возможность переключения протоколов.

от

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

к

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

Ответ 7

Когда что-то терпит неудачу, и мы не знаем причину, мы должны отлаживать. Таким образом, вместо того, чтобы отвечать на запросы, я прошу вас выполнить некоторые тесты

  • подтвердите подключение системы к Интернету: Откройте терминал 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 выполните свой собственный код (как вы разместили в этом потоке)

И дайте знать, где он сломается, и какова ошибка. Только после этого мы можем помочь