< STRONG> Факты

Я использую 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 = '<slevin@gmail.com>';
$to = '<slevinkelevra@gmal.com>';
$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' => '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 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 29 Авг 2017 в 18:20

8 ответов

Лучший ответ

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

1. проверьте phpinfo

Я рекомендую проверить phpinfo(), чтобы проверить, все ли модули включены. Проверьте почту, fsockopen.

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.

6
shyammakwana.me 8 Сен 2017 в 11:38

Ваш код правильный

Я пытался проверить свою учетную запись 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 7 Сен 2017 в 07:28

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

В PHP 7.2 мне пришлось сделать больше: установить «auth» в PLAIN, а затем добавить «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'
));
0
user9359265 14 Фев 2018 в 09:36

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

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

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

    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 и доступ к Gmail SMTP: снова в командной строке cmd и php php -a выполните свой собственный код (как вы разместили в этой теме)

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

4
Nasir Iqbal 8 Сен 2017 в 11:37

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

Вы выполняете свою работу за вас - как тот, кто публикует вопрос, - должен создать пример Minimal, Complete и Verifiable.

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

Наиболее вероятные причины неудачи:

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

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

+ Изменить

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

Кому

'host' => 'smtp.gmail.com',
6
Adam Lavin 3 Сен 2017 в 01:23

Прежде чем я начну, позвольте мне предвосхитить, что существует множество возможных решений и результатов между вашим сервером и сервером 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 6 Сен 2017 в 18:12