2016-06-17 3 views
25

PHP 5.6에서 스트림 소켓과 SSL에 문제가 있습니다. SSL이 출력을 버퍼링하는 것 같습니다. 아래 예제에서 "ehlo"명령은 무시됩니다 (서버가 응답하지 않음). 하지만 "ehlo"다음에 다른 메일이 전송되면 fwrite에 대한 또 다른 호출의 새 행은 서버가 응답을 보냅니다.SSL을 사용하는 스트림 소켓

$errno = ''; 
$errstr = ''; 
$timeout = 5; 
$streamContext = stream_context_create(); 
$host = 'ssl://smtp.some.server.com:465'; 
$stream = stream_socket_client($host, $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, $streamContext); 
stream_set_blocking($stream, 1); 
stream_set_timeout($stream, $timeout); 
stream_set_write_buffer($stream, 0); 

$fgets = fgets($stream); 
print_r($fgets); 

fwrite($stream, "ehlo [127.0.0.1]\r\n"); 

$response = ''; 
do { 
    $line = fgets($stream); 
    $response .= $line; 
} while (null !== $line && false !== $line && ' ' != $line{3}); 

print_r($response); 

fclose($stream); 

나는 응답을 가지고 :

220 epicserver.net.pl ESMTP IdeaSmtpServer v0.80.2 ready.

는 (먼저 print_r에서이다).

그러나 줄 끝 때 fwrite($stream, "ehlo [127.0.0.1]\r\n"); I 추가 소켓 쓰기를 추가

나는 그것이 PHP의 SSL 래퍼 문제가 있는지 확인되는 Stunnel을 사용하려고했습니다
220 epicserver.net.pl ESMTP IdeaSmtpServer v0.80.2 ready. 
250-epicserver.net.pl Hello ip-166-242.pl [94.183.162.232], pleased to meet you 
250-PIPELINING 
250-ENHANCEDSTATUSCODES 
250-SIZE 
250-8BITMIME 
250-AUTH PLAIN LOGIN 
250-AUTH=PLAIN LOGIN 
250 HELP 

내가 변경할 때 $host$host = 'localhost:110;'에 : fwrite($stream, "\n"); 출력은 괜찮습니다 (내 stunnel 구성) 모든 것이 완벽하게 작동합니다 (특별한 fwrite 메서드를 추가하지 않고).

누구에게이 문제가 발생 했습니까?

$fgets = ''; 
while (is_resource($stream) && !feof($stream)) { 
    $fgets .= fgets($stream); 
} 
+0

예컨대 않습니다 – VolkerK

+0

예, 해당 테스트 코드는 swiftmailer 구현에서 가져온 것입니다. –

+0

그렇다면, ssl : //smtp.some.server.com : 465와 함께 swiftmailer를 사용하면 핸드 셰이크가 완료되지 않아 작동하지 않습니까? – VolkerK

답변

1

확실히는 fgets가 제대로 라인 종결을 이해하는 것으로,이 코드 첫번째는 fgets 교체 http://swiftmailer.org에서도 같은 문제가 발생합니까? 그렇지 않다면, 당신은 당신과 그 구현을 비교할 수 있습니다.
관련 문제