Fget в функции smtp

#php

#php

Вопрос:

Я хочу прочитать последнюю строку, которая равна 250, из команды Ehlo. В настоящее время он считывает первую строку, которая содержит 250 . Вот текущий код

 fputs($socket, "EHLO server1.aa.comrn"); // ehlo command

$res = fgets($socket, 1024); // read output

if (substr(trim($res), 0, 3) != "250") {
  

Пожалуйста, помогите мне изменить код

Ответ №1:

Ожидаемый вами ответ выглядит следующим образом

 250-foo
250-bar
250 OK
  

последняя строка отмечена не - после трехзначного кода, а пробелом.
=> прочитайте все строки, содержащие 3-значный код, за которым следует что-то еще, кроме пробела.

 function fetch_esmtp_response($source) {
    $response = array();
    do
    {
        $s = fgets($source, 1024);
        $response[] = $s;
    }   while( strlen($s) > 3 amp;amp; ' '!==$s[3]);
    return $response;
}

fputs($socket, "EHLO server1.aa.comrn"); // ehlo command
$response = fetch_esmtp_response($socket);
var_dump($response);
  

о, и кстати: если это не предназначено исключительно для образовательных целей, не кодируйте это самостоятельно, а используйте библиотеку электронной почты, например, Swiftmailer

Ответ №2:

Когда вы выполняете fgets() (или что-либо еще) над сокетом, не гарантируется, что вы получите указанный объем данных. Что, я думаю, вам следует сделать, так это извлечь все данные в строковый буфер и анализировать этот буфер, пока не найдете нужные вам данные.