私は単純なGmailクライアントをやろうとしています。問題は、私がかなり奇妙な応答を得ていることです。実際に私はSslStream.read
からの応答を全く得ていません。まず、私はクライアントとしてGmailのサーバーに接続するとき、それは完璧に動作します(Connect()
法)が、私は再びleerMensaje()
方法でSslStream.read
を使用して、数オフメールを取得しようとしているときに、それは奇妙な取得し、単に実行を停止し、そしてウェブページに負荷がかかってしまいます。SslStream.readからの応答がありません
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Net;
using System.Net.Sockets;
using System.Net.Security;
using System.Text;
using System.Net.Mail;
namespace GmailClient
{
public class GmailPop
{
private SslStream sslStream;
private String user;
private String pass;
public GmailPop(String user, String pass)
{
this.user = user;
this.pass = pass;
}
public bool Connect()
{
String response;
byte[] buffer = new byte[2048];
int bytes = -1;
TcpClient server = new TcpClient("pop.gmail.com", 995);
sslStream = new SslStream(server.GetStream());
sslStream.AuthenticateAsClient("pop.gmail.com");
bytes = sslStream.Read(buffer, 0, buffer.Length);
response = Encoding.ASCII.GetString(buffer,0,bytes);
sslStream.Write(Encoding.ASCII.GetBytes("USER recent:" + user+"\r\n"));
bytes = sslStream.Read(buffer, 0, buffer.Length);
response = Encoding.ASCII.GetString(buffer,0,bytes);
if(response.StartsWith("+OK")){
sslStream.Write(Encoding.ASCII.GetBytes("PASS "+pass+"\r\n"));
bytes = sslStream.Read(buffer,0,buffer.Length);
response = Encoding.ASCII.GetString(buffer, 0, bytes);
return response.StartsWith("+OK");
}
return false;
}
public int numCorreos()
{
String res = escribirLeer("STAT");
String[] resA = res.Split(' ');
int num = Int32.Parse(resA[1]);
return num;
}
public String leerMensaje()
{
int bytes = -1;
byte[] buffer = new byte[2048];
String msg = "";
do
{
bytes = sslStream.Read(buffer, 0, buffer.Length);
msg += Encoding.ASCII.GetString(buffer, 0, bytes);
} while (bytes != 0);
return msg;
}
public void escribirMsg(String msg)
{
byte[] buffer = Encoding.ASCII.GetBytes(msg);
sslStream.Write(buffer);
sslStream.Flush();
}
public String escribirLeer(String msg)
{
escribirMsg(msg);
String respuesta = leerMensaje();
return respuesta;
}
}
}
そしてここでは、メソッドを呼び出すのaspx Webページです:
GmailPop client;
protected void Page_Load(object sender, EventArgs e)
{
if (Session["user"] != null && Session["pass"] != null)
{
String user = Session["user"].ToString();
String pass = Session["pass"].ToString();
client = new GmailPop(user, pass);
if (client.Connect())
{
Session["active"] = true;
Response.Write(numCorreos());
}
else
{
Session.Remove("pass");
Response.Redirect("login.aspx?error=login");
}
}
else
{
Response.Redirect("login.aspx");
}
}
}
うん、私はあなたが言ってみてください、そして実際に私がreadメソッドのドキュメントの前に読んで、それが読み込んだバイトオフ番号を返すので、それがラインオフ最後に、それは0を返す必要がある場合は、問題があることですプログラムが最初に到達したときにプログラムをデバッグしても、その行を実行した直後にデバッグを停止するだけです。かなり奇妙な行動です。 –
Read()を初めて呼び出すと、コマンドが "\ r \ n"で終了する必要があるためです。あなたは単に "STAT"を送信していますが、代わりに "STAT \ r \ n"を送信する必要があります。私はこれを反映するために私の答えを編集します。しかし、私の元の答えはまだ立っている - 現在のコードはRead()が0を返すことを期待しているので(接続が閉じられていない限り)、コマンドを正しく送信してもハングしますが、代わりにRead()を呼び出す必要があります。 – Iridium
ありがとうございました、クラスの後で真夜中に働いているので、私たちが時々見られないような小さなデータイル。再度、感謝します –