邮件客户端应用例外

时间:2014-03-20 16:00:29

标签: c# .net xamarin.ios

我正在使用xamarin studio开发应用程序。我的目标是连接到pop3并将电子邮件下载到我的应用程序。 我使用以下代码,但我遇到这些问题:  a)sslstream.AuthenticateAsClient("pop.gmail.com");上的例外情况。 (身份验证或解密失败)。 b)我到处都有sw.Flush()我正在例外:在成功通过验证之前,此操作无效。

TcpClient tcpclient = new TcpClient();
tcpclient.Connect("pop.gmail.com", 995);            
System.Net.Security.SslStream sslstream = new SslStream(tcpclient.GetStream());
sslstream.AuthenticateAsClient("pop.gmail.com"); 
StreamWriter sw = new StreamWriter(sslstream);
System.IO.StreamReader reader = new StreamReader(sslstream); 
sw.WriteLine("USER myusername");  
sw.Flush();
sw.WriteLine("PASS *****");
sw.Flush();
sw.WriteLine("RETR 1");
sw.Flush();
sw.WriteLine("Quit ");
sw.Flush();
string str = string.Empty;
string strTemp = string.Empty;
while((strTemp = reader.ReadLine()) !=null){
    if(".".Equals(strTemp)){
        break;
    }
    if(strTemp.IndexOf("-ERR") != -1){
        break;
    }
    str +=strTemp;
}
reader.Close();
sw.Close();
tcpclient.Close();

修改

我使用mailkit,这是一个很好的解决方案。我可以检索电子邮件但我有问题。当我下载了一些邮件(不是特定的号码。对于不同的帐号是不同的邮件数量) 我收到以下错误: system.ArgumentOutOfRangeException上的var message = client.GetMessage(i, cancel.Token);partial void btnlogin (NSObject sender) { using (var client = new Pop3Client ()) { var credentials = new NetworkCredential (Convert.ToString(txtusername.Text).Trim(), Convert.ToString(txtpassword.Text).Trim()); // Note: if the server requires SSL-on-connect, use the "pops" protocol instead var uri = new Uri (Convert.ToString("pops://pop.gmail.com")); using (var cancel = new CancellationTokenSource ()) { client.Connect (uri, cancel.Token); client.Authenticate (credentials, cancel.Token); int count = client.GetMessageCount (cancel.Token); var list= new List<string>(); for (int i = 0; i < count; i++) { var message = client.GetMessage (i, cancel.Token); Console.WriteLine ("From: {0}", message.From); list.Add(Convert.ToString(message.From)); } client.Disconnect (true, cancel.Token); } } } 我的登录代码:

{{1}}

3 个答案:

答案 0 :(得分:2)

我来这里建议使用MailKit而不是为此编写自己的库。 MailKit也特别适合与Xamarin合作(因为我在Xamarin工作)。 MailSystem.NET非常糟糕(我在StackOverflow上的其他地方大肆宣传),所以我绝对不建议使用它。

也就是说,您可能需要查看使用此版本的SslStream .ctor而不是您正在使用的版本。问题可能是默认.ctor未验证SSL证书,因为它不是“受信任的”。

答案 1 :(得分:0)

我会使用现有的C#库来执行此操作。

在过去的某个时刻,我使用MailSystem.NET并能够将他们的库移植到MonoTouch。我不确定它的许可证适用于你,但你会比使用它自己更好地使用它。

答案 2 :(得分:0)

我还认为为此编写自己的图书馆会浪费任何人的时间。我还没有尝试使用Mail Kit(肯定会这样做),但是当我需要通过POP3从我的电子邮件服务器备份我的电子邮件时,我最近使用了Rebex Mail。幸运的是,这只是一次性任务,因此我没有付费,因为我只使用了没有任何限制的30-day free trial

        using Rebex.Mail;
        using Rebex.Net;

        Pop3 client = new Pop3();
        client.Connect("pop.gmail.com", SslMode.Implicit);
        client.Login("gmailuser", "password");

        var messageInfos = client.GetMessageList(Pop3ListFields.FullHeaders);
        foreach (Pop3MessageInfo message in messageInfos)
            client.GetMessage(message.SequenceNumber, string.Format(@"C:\gmail-pop3-backup\{0}-{1}.eml", message.Subject, message.UniqueId));

        client.Disconnect();