Не удается заставить TcpClient подключиться к Gmail

Я пытаюсь сделать что-то, что будет читать электронную почту, но у меня ничего не работает. Этот код:

TcpClient c = new TcpClient();
c.Connect("imap.gmail.com", 993);
NetworkStream stream = c.GetStream();
stream.ReadTimeout = 1000;
stream.ReadByte();

Швы оказываются там, где ломается любой загружаемый мной код. Последняя строка выдает исключение IOException с сообщением: «Невозможно прочитать данные из транспортного соединения: попытка подключения не удалась, потому что подключенная сторона не ответила должным образом через определенный период времени, или установленное соединение не удалось из-за того, что подключенный хост не ответил. "

Я бы согласился на стороннюю программу, которая автоматически загружает электронную почту в формате, который я могу читать. Я получил Thunderbird для подключения к Gmail, так что проблема наверняка на моей стороне.


person user1820576    schedule 24.11.2012    source источник
comment
Разве вам не нужно что-то писать, прежде чем вы сможете что-то прочитать?   -  person Ry-♦    schedule 24.11.2012
comment
@minitech может быть? Я попытался просто записать нулевой байт в поток, но он все равно ломается.   -  person user1820576    schedule 24.11.2012
comment
@nos Если я изменю тайм-аут на 60 секунд, он все равно сломается.   -  person user1820576    schedule 25.11.2012
comment
@ user1820576: Нет, я думаю, вам нужно отправить действительный запрос, на который Gmail ответит. (Только предположение - я не знаю особенностей IMAP ...)   -  person Ry-♦    schedule 25.11.2012


Ответы (4)


Вы подключаетесь через порт SSL. Если вы не выполните надлежащее квитирование SSL, оно вскоре закроет соединение, не отправив вам никаких данных.

person Max    schedule 24.11.2012
comment
Сообщение будет указывать на отключение. Кроме того, он ничего не отправляет. - person usr; 25.11.2012

Сообщение указывает, что удаленный сервер не ответил. В нем не говорилось, что "подключение к этому порту не разрешено". Не было сказано «Я закрываю соединение». Он ничего не сказал.

Это означает, что вы не можете даже создать соединение на уровне TCP. Попробуй это:

telnet imap.gmail.com 993

Это не удастся. Так что это не имеет никакого отношения к вашему приложению.

person usr    schedule 24.11.2012

используйте openssl для подключения к Gmail. это простой способ добиться своей цели.

person shubendrak    schedule 03.04.2013

Gmail IMAP использует SSL, поэтому вам нужно обернуть сетевой поток SslStream и вызвать AuthenticateAsClient метод (чтобы он выполнял магию установления связи SSL / аутентификации сервера). После этого вы взаимодействуете с ним как с обычным (не SSL) потоком:

TcpClient c = new TcpClient();
c.Connect("imap.gmail.com", 993);
SslStream sslStream = new SslStream(c.GetStream());
sslStream.ReadTimeout = 1000;
sslStream.AuthenticateAsClient("imap.gmail.com");
sslStream.ReadByte();
person pfyod    schedule 03.04.2013