SMTP-серверы предваряют каждое сообщение числовым кодом, подобным упоми­навшемуся ранее коду 250 . Первое соединение с сервером позволяет отправить любое количество сообщений 2 2 0. Они содержат комментарии наподобие того, как серверы AOL напоминают о нежелательности использования их в целях рассылки спама. Конец комментария не обозначается никаким кодом; сервер просто прекращает отправлять строки. Напомним, что по умолчанию функция fgets завершает работу после обнаружения максимального количества символов или маркера "конец строки". Это не сработает при неопределенном числе строк. Сценарий будет "зависать" после окончания последнего комментария. Для выхода из этой ситуации необходимо отключить блокировку сокета.
Когда функция set_socket_blocking отключает блокировку, функция fgets завершает работу немедленно с любыми данными, находящимися в буфере. Стратегия заключается в работе в постоянном цикле с проверкой буфера после каждой итерации цикла. Обязательно должна присутствовать определенная задержка между установкой соединения и получением первого сообщения с сервера. Когда появляется сообщение 220, этот сценарий ожидает прекращения поступления данных, что свидетельствует о том, что сервер ожидает команду. Для того чтобы избежать возникновения ситуации, когда сервер не отвечает, следующая проверка должна выполняться с тайм-аутом. По прошествии десяти секунд сервер будет считаться недоступным. Конечно, такая политика может привести к отсеву адресов на "медленных" серверах.