2014-11-23 39 views
7

Mam problem z CSCart, nie wysyła wiadomości za pośrednictwem konta google. Aby sprawdzić, czy jest problem z konfiguracją serwera lub skryptami CSCart, zainstalowałem czystą bibliotekę PHPMailer i próbowałem wysłać wiadomość testową za pomocą skryptu przykładowego. Rezultat jest taki sam: PołączenieOstrzeżenie: stream_socket_enable_crypto(): Operacja SSL nie powiodła się z kodem 1

Warning: stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed in [script path]/class.smtp.php on line 338  

OpenSSL z konsoli działa dobrze.

FreeBSD 10.0, Apache24, php5.6.

Nie mogłem znaleźć żadnych informacji w google i na razie nawet nie wiem, w którym pliku konfiguracyjnym szukać źródła problemu.

+0

Wygląda na to, że w PHP jest włączone ścisłe sprawdzanie zabezpieczeń, a połączenie nie sprawdza tego.Możesz albo naprawić certyfikat, albo obniżyć yoru ustawienia PHP.ini. Dotyczy to szczególnie PHP 5.6. – Synchro

+0

Czy mógłbyś doradzić, które ustawienia powinienem sprawdzić w php.ini? – Eugenijus

Odpowiedz

4

Jest to spowodowane nową zasadą weryfikacji domyślnej w PHP 5.6. Nie jest ustawiony w php.ini; jest to opcja, którą możesz dostarczyć do otworzenia wrapperów lub kontekstów strumieniowych. Spójrz na opcje here, szczególnie verify_peer. PHPMailer pozwala ci ustawić te parametry podczas metody smtpConnect(), ale nie ma opcji, aby przekazać opcje do metody smtpSend(), więc będziesz potrzebować podklasy PHPMailer, aby uzyskać na tym.

Możesz znaleźć alternatywne prostsze - don't try to use a self-signed or unverifiable certificate.

0

w laravel 5,4 ERROR

C: \ xampp \ htdocs \ itis_db \ ​​vendor \ swiftmailer \ swiftmailer \ lib \ Classes \ Swift \ transportowa \ StreamBuffer.php

i dowiedzieć się ta funkcja wewnątrz StreamBuffer.php

private function _establishSocketConnection() 

i wklej dwie linie wewnątrz tej funkcji

$options['ssl']['verify_peer'] = FALSE; 
$options['ssl']['verify_peer_name'] = FALSE; 

i ponownie załaduj przeglądarkę i spróbuj ponownie uruchomić projekt. Dla mnie Włożyłem tak:

private function _establishSocketConnection() 
{ 
    $host = $this->_params['host']; 
    if (!empty($this->_params['protocol'])) { 
     $host = $this->_params['protocol'].'://'.$host; 
    } 
    $timeout = 15; 
    if (!empty($this->_params['timeout'])) { 
     $timeout = $this->_params['timeout']; 
    } 
    $options = array(); 
    if (!empty($this->_params['sourceIp'])) { 
     $options['socket']['bindto'] = $this->_params['sourceIp'].':0'; 
    } 

    $options['ssl']['verify_peer'] = FALSE; 
    $options['ssl']['verify_peer_name'] = FALSE; 

    $this->_stream = @stream_socket_client($host.':'.$this->_params['port'], $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, stream_context_create($options)); 
    if (false === $this->_stream) { 
     throw new Swift_TransportException(
      'Connection could not be established with host '.$this->_params['host']. 
      ' ['.$errstr.' #'.$errno.']' 
      ); 
    } 
    if (!empty($this->_params['blocking'])) { 
     stream_set_blocking($this->_stream, 1); 
    } else { 
     stream_set_blocking($this->_stream, 0); 
    } 
    stream_set_timeout($this->_stream, $timeout); 
    $this->_in = &$this->_stream; 
    $this->_out = &$this->_stream; 
} 

Nadzieja będzie rozwiązać ten problem .....

1

Istnieje wiele configs sprawia, że ​​ten błąd wymyślić, ale częściej jest to, że konfiguracja systemu nie jest poprawnie skonfigurowana. Aby zrobić to poprawnie, wykonaj następujące czynności:

  1. Sprawdź, czy masz plik cacert.pem dla OPENSSL, czy nie. Jeśli nie, pobierz odpowiednią wersję z cacert.pem zgodnie z wersją php i skonfiguruj plik php.ini jako "2"

  2. Jeśli posiadasz ten plik, musisz sprawdzić w swoim php. plik ini i zobacz, czy został w nim ustawiony, czy nie. Aby to zrobić: wyszukiwanie dla linii:

    openssl.cafile ="example address..\cacert.pem"

Jeśli okaże się spójna z określonym adresem, poszukaj pliku cacert.pem w ten adres, jeśli go znaleźć, niż to wszystko jest zrobione z plikiem cacert.pem. W przeciwnym razie powinieneś użyć poprawnego adresu.