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. The error.log не дает ошибок, связанных с ssl.

здесь код

require_once "Mail.php";

$from = '<slevin@gmail.com>';
$to = '<slevinkelevra@gmal.com>';
$subject = 'Hi!';
$body = "Hi,nnHow 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' => 'slevinmail@gmail.com',
        '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 FilesCommon FilesSSL/cert.pem
default_cert_file_env = SSL_CERT_FILE
default_cert_dir = C:Program FilesCommon FilesSSL/certs
default_cert_dir_env = SSL_CERT_DIR
default_private_dir = C:Program FilesCommon FilesSSL/private
default_default_cert_area = C:Program FilesCommon FilesSSL
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:Apache24htdocsphptest2.php on line 28

Warning: fsockopen(): Failed to enable crypto in C:Apache24htdocsphptest2.php on line 28

Warning: fsockopen(): unable to connect to ssl://smtp.gmail.com:465 (Unknown error) in C:Apache24htdocsphptest2.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

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

8 ответов


на "использовать SMTP-сервер Gmail" в разделе этого руководства говорится, что вам нужно включить "менее безопасные приложения".


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

изменить

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

до

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

отладку несколько шагов :

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' => 'xxx@gmail.com',
        '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.


код

Я попытался проверить свою учетную запись gmail. Отправка почты прошла успешно.

Проверьте разъем подключения

<?php

error_reporting(E_ALL);

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

ресурс (4) типа (stream)

int (0)

строка(0) ""


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

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

enter image description here

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

С

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

to

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


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

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

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

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

  • хоста вы используете это на не может маршрутизировать исходящие соединения в интернет (но так как вы, кажется, используете настольный ПК, я думаю, вы могли бы заметить это сейчас)
  • код работает в песочнице безопасности (но 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.


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

  1. подтверждение подключения системы к интернету: откройте терминал cmd и введите

    ping smtp.gmail.com
    
  2. подтвердить брандмауэр: введите следующее в cmd terminal

    telnet smtp.gmail.com 465
    
  3. подтверждение установки php: введите php -a на терминале cmd и в 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 library и Gmail SMTP-доступ: снова на cmd и PHP prompt php -a выполните свой собственный код (как вы опубликовали в этой теме)

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


в PHP 5.3 совет, данный другими о "менее безопасных приложениях", которые необходимо активировать при входе в учетную запись Google Gmail, решил все мои проблемы.

в PHP 7.2 мне пришлось сделать больше: установить "auth" на обычный, а затем добавить "verify_peer" и verify_peer_name для SSL socket_options, как это:

$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' => 'someAccount@gmail.com',
                                   'password' => 'myPassword'
));