我正在使用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}}
答案 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();