Tôi gặp sự cố với ổ cắm luồng và SSL trong PHP 5.6. Dường như SSL đang lưu vào bộ đệm. Trong ví dụ dưới đây, lệnh "ehlo" bị bỏ qua (máy chủ không phản hồi). Nhưng khi một thứ khác được gửi sau "ehlo", ví dụ: một dòng mới trong một cuộc gọi khác đến fwrite
, máy chủ sẽ gửi phản hồi.Ổ cắm luồng với 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);
Tôi đã có một câu trả lời:
220 epicserver.net.pl ESMTP IdeaSmtpServer v0.80.2 ready.
(đó là từ print_r
đầu tiên).
Nhưng khi sau dòng: fwrite($stream, "ehlo [127.0.0.1]\r\n");
tôi bổ sung thêm ổ cắm viết: fwrite($stream, "\n");
đầu ra là ok:
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
Tôi đã cố gắng sử dụng stunnel để kiểm tra xem nó là một vấn đề wrapper PHP SSL và khi tôi thay đổi $host
-$host = 'localhost:110;'
(cấu hình stunnel của tôi) mọi thứ hoạt động hoàn hảo (không thêm phương thức đặc biệt fwrite
).
Có ai phải đối mặt với vấn đề đó không?
Liệu ví dụ http://swiftmailer.org có cùng một vấn đề? Nếu không, bạn _could_ so sánh việc triển khai đó với máy của bạn. – VolkerK
Có, mã kiểm tra đó được lấy từ việc thực hiện swiftmailer. –
Vì vậy, nếu bạn sử dụng swiftmailer với ssl: //smtp.some.server.com: 465 nó không hoạt động vì nó không hoàn thành việc bắt tay? – VolkerK