2012-12-07 70 views
0

我正在编写Windows Store应用程序的类,它可以连接到imap.gmail.com,查找特定消息并从中下载电子邮件附件。我决定编写自己的课程,因为找不到任何适用于Windows应用商店的解决方案。连接到Windows Store应用程序中的imap.gmail.com

即使连接imap服务器,我也有问题,我使用StreamSocket,并不能理解,我做错了什么。这是我的代码:

public sealed class GmailAttachmentDownloader 
{ 
    private HostName HostName; 
    private StreamSocket Socket; 
    private String AccessToken; 
    private String LoginName; 
    private DataWriter Writer; 
    private DataReader Reader; 

    public GmailAttachmentDownloader(String loginName, String accessToken) 
    { 
     HostName = new HostName("imap.gmail.com"); 

     LoginName = loginName; 
     AccessToken = accessToken; 
    } 

    private async Task<bool> Connect() 
    { 
     Socket = new StreamSocket(); 
     try 
     { 
      await Socket.ConnectAsync(HostName, "993", SocketProtectionLevel.SslAllowNullEncryption); 
     } 
     catch 
     { 
      return false; 
     } 

     return true; 
    } 

    private async Task<bool> Write(String msg) 
    { 
     if (Socket == null) 
      if (! await Connect()) 
       throw new Exception("Could not connect to imap.gmail.com"); 

     try { 
      using (Writer = new DataWriter(Socket.OutputStream)) 
      { 
       Writer.WriteString(msg); 
       await Writer.StoreAsync(); 
      } 
     } 
     catch 
     { 
      return false; 
     } 
     return true; 
    } 

    private async Task<String> Read() 
    { 
     if (Socket == null) 
      if (!await Connect()) 
       throw new Exception("Could not connect to imap.gmail.com"); 

     String data; 
     using(Reader = new DataReader(Socket.InputStream)) 
     { 
      Reader.InputStreamOptions = InputStreamOptions.Partial; 
      await Reader.LoadAsync(1024); 
      data = Reader.ReadString(Reader.UnconsumedBufferLength); 
     } 

     return data; 
    } 

    public async void Login() 
    { 
     String data; 
     data = await Read(); 

     await Write("a1 AUTHENTCATE XOAUTH2 " + EncodeTo64("user=" + LoginName + "\x01auth=Bearer " + AccessToken + "\x01\x01\r\n")); 
     data = await Read(); 
    } 

    static public string EncodeTo64(string toEncode) 
    { 
     byte[] toEncodeAsBytes 
      = System.Text.UTF8Encoding.UTF8.GetBytes(toEncode); 
     string returnValue 
      = System.Convert.ToBase64String(toEncodeAsBytes); 
     return returnValue; 
    } 

    static public string DecodeFrom64(string encodedData) 
    { 
     byte[] encodedDataAsBytes 
      = System.Convert.FromBase64String(encodedData); 
     string returnValue = 
     System.Text.UTF8Encoding.UTF8.GetString(encodedDataAsBytes, 0, encodedDataAsBytes.Count()); 
     return returnValue; 
    } 
} 

任何人都可以帮助我吗?我试图在网络和微软教程中搜索,我也发现this的问题,但它并没有太大的帮助。

UPD:对不起,在我在谷歌搜索异常后,我发现,这个问题是在杀毒软件,当我关闭杀毒软件时,一切正常。如此不同的问题:如何处理它?我不想告诉我的朋友“关闭你的杀毒软件,所以我的程序可以运行”?

+0

究竟是什么问题?你有错误吗? – vcsjones

+0

在连接函数我捕获“一个套接字操作尝试到一个无法访问的主机(异常从HRESULT:0x80072751)”异常 – imslavko

回答

1

好像你的防病毒软件里有防火墙。如果它阻止了您的应用程序,并且您不希望它被阻止,则它会被错误配置。就那么简单。

此外,您应该知道,大多数情况下,防病毒软件只是为了给您一种模糊温暖的感觉,并且 - 在企业环境中 - 避免在发生任何事情时被起诉。最终它不会真正保护你免受伤害。只是说...;)

+0

我想,你没有得到我的问题,我应该澄清:防病毒软件,防火墙阻止连接我的应用程序想建立。我需要一些通用解决方案,因此大多数防病毒软件都可以将我的应用程序识别为可信,无需直接配置 – imslavko

+1

如果有一种方法可以轻松将连接标记为可信,并绕过防病毒软件,则会使这些产品变得更加无用。防火墙也是如此:如果它被配置为阻止来自特定源或特定目标的连接,则无法在应用程序级绕过它,因为这会导致它不真实。 –

+0

你的意思是你什么都不知道?证书,操作系统合同,签名可执行文件? – imslavko

相关问题