Во-первых, почтовый сервер IMAP не говорит по Telnet.Telnet - это протокол поверх TCP.См. RFC 854 .Преимущество клиентов Telnet, однако, заключается в том, что, поскольку Telnet является очень минимальным протоколом поверх необработанных TCP-сокетов, вы можете подключаться и взаимодействовать со многими службами, которые также используют текстовые протоколы командных / ответных стилей поверх TCP (POP3, IMAP,SMTP, HTTP и т. Д.).
В конечном итоге вам, вероятно, следует использовать «готовый IMAP-клиент».Случайный поиск в Google привел меня к этому .Я понятия не имею, если это хорошо, но это может привести к быстрым победам с вашей стороны.
Если, однако, вы хотите узнать, как правильно работать в сети TCP / IP, вы должны осознать некоторые основы двунаправленного ввода-вывода.
То, что вы здесь испытываете, вполне нормально.На сокете TCP есть два канала.Один для чтения, один для письма.Эти каналы независимы и потенциально буферизированы.
Буферизация означает, что только то, что вы записали некоторые данные (строку или что-то еще) в отправляющий сокет в вашем клиентском коде, не означает, что они были получены на другом конце.
Поэтому немедленная блокировка чтения после записи может означать, что ваша команда никогда не отправляется, и вы будете блокировать чтение навсегда.
Кроме того, вы можете записывать команды в отправляющий сокет так быстро, как позволит ваша ОС и пропускная способность.Ответы будут возвращаться всякий раз, когда сервер обрабатывает их.Который может быть скоро, а может и никогда.По своей природе программирование сокетов асинхронно и склонно к сбоям (вы имеете дело с удаленной системой через ненадежную сеть).
Обычный подход к работе с асинхронным двунаправленным вводом-выводом состоит в том, чтобы иметь два потока.Один для чтения, а другой для письма.«Веселье» начинается, когда вам нужно согласовать «чат» запросов и ответов между двумя потоками.Здесь могут помочь такие примитивы, как AutoResetEvent и ManualResetEvent.Хотя вам, вероятно, лучше всего взглянуть на C # Reactive Extensions , поскольку они могут сделать работу намного проще.
В целом, я бы предложил чтение по теме .Написание хорошего сетевого кода без ошибок нетривиально даже для «простых» протоколов, таких как SMTP и POP3.
Если вы не привязаны к использованию C # для своего решения и просто пытаетесь автоматизировать какой-то простой сервис в стиле Telnetвзаимодействий, тогда вы должны взглянуть на утилиту Linux / Unix ожидайте , это может сэкономить вам много времени.