Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从C读取gmail帐户的Atom提要#_C#_Xml_Gmail_Atom Feed - Fatal编程技术网

C# 从C读取gmail帐户的Atom提要#

C# 从C读取gmail帐户的Atom提要#,c#,xml,gmail,atom-feed,C#,Xml,Gmail,Atom Feed,我有一个项目,将发送一封带有特定数据的电子邮件到gmail帐户。我认为阅读Atom提要可能比通过POP连接更容易 根据谷歌的说法,我应该使用的url是: https://gmail.google.com/gmail/feed/atom 问题是:如何验证我想要查看的电子邮件帐户?如果我在Firefox中这样做,它会使用cookies 我还不确定如何“下载”这个请求应该返回的XML文件(我认为正确的术语是流) 编辑1: 我使用的是.NET3.5。.NETFramework3.5提供了本机类来读取提

我有一个项目,将发送一封带有特定数据的电子邮件到gmail帐户。我认为阅读Atom提要可能比通过POP连接更容易

根据谷歌的说法,我应该使用的url是:

https://gmail.google.com/gmail/feed/atom
问题是:如何验证我想要查看的电子邮件帐户?如果我在Firefox中这样做,它会使用cookies

我还不确定如何“下载”这个请求应该返回的XML文件(我认为正确的术语是流)

编辑1:


我使用的是.NET3.5。

.NETFramework3.5提供了本机类来读取提要。文章介绍了如何做到这一点

我还没有使用它,但必须有一些规定,以验证一个网址。你可以看看。我也会这样做,然后把答案寄回来

如果您没有使用Framework3.5,那么您可以尝试一下。我用过一次,但它已经旧了。如果它符合你的需要,你可以试一试

编辑:这是分配用户凭据的代码:

XmlUrlResolver resolver = new XmlUrlResolver();
resolver.Credentials = new NetworkCredential("abc@abc.com", "password");

XmlReaderSettings settings = new XmlReaderSettings();
settings.XmlResolver = resolver;

XmlReader reader = XmlReader.Create("https://gmail.google.com/gmail/feed/atom", settings);

您可以使用基本身份验证。基本上,您发出一个初始请求,服务器用401回复,然后您用base64(在本例中是通过HTTPS)发回密码

但请注意:

  • 提要只允许您获取有关帐户的琐碎信息(例如新邮件)。它不允许您发送消息
  • POP也不能用于发送消息
  • 通常使用SMTP,其实并不难
  • 编辑:下面是一个验证Atom提要并将其加载到XmlDocument中的示例。但请注意,这将仅提供读取访问。搜索或询问其他有关C#和SMTP的信息。ICertificatePolicy垃圾对我来说是必要的,因为Mono不喜欢谷歌的证书。这是一个快速的解决办法,不适合生产

    好的,既然你已经澄清你实际上是在阅读邮件(另一个组件正在发送邮件),我建议你使用POP。 :


    这是我在Vb.net中使用的:

    objClient.Credentials = New System.Net.NetworkCredential(username, password)
    
    objClient的类型为System.Net.WebClient

    然后,您可以使用以下方式从提要获取电子邮件:

    Dim nodelist As XmlNodeList
    Dim node As XmlNode
    Dim response As String
    Dim xmlDoc As New XmlDocument
    
    'get emails from gmail
    response = Encoding.UTF8.GetString(objClient.DownloadData("https://mail.google.com/mail/feed/atom"))
    response = response.Replace("<feed version=""0.3"" xmlns=""http://purl.org/atom/ns#"">", "<feed>")
    
    'Get the number of unread emails
    xmlDoc.LoadXml(response)
    node = xmlDoc.SelectSingleNode("/feed/fullcount")
    mailCount = node.InnerText
    nodelist = xmlDoc.SelectNodes("/feed/entry")
    node = xmlDoc.SelectSingleNode("title")
    
    Dim节点列表作为XmlNodeList
    Dim节点作为XmlNode
    作为字符串的暗淡响应
    Dim xmlDoc作为新的XmlDocument
    “从gmail获取电子邮件
    response=Encoding.UTF8.GetString(objClient.DownloadData(“https://mail.google.com/mail/feed/atom"))
    响应=响应。替换(“,”)
    '获取未读电子邮件的数量
    LoadXml(响应)
    node=xmlDoc.SelectSingleNode(“/feed/fullcount”)
    mailCount=node.InnerText
    nodelist=xmlDoc.SelectNodes(“/feed/entry”)
    node=xmlDoc.SelectSingleNode(“标题”)
    

    这在C#中应该不会有太大的不同。

    就其价值而言,我从未能够通过以下方式进行身份验证:

    https://gmail.google.com/gmail/feed/atom
    
    但是,我始终可以在以下位置进行身份验证:

    https://mail.google.com/mail/feed/atom
    

    以下是我的精干而中庸的解决方案:

        public static string TextToBase64(string sAscii)
        {
            System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
            byte[] bytes = encoding.GetBytes(sAscii);
            return System.Convert.ToBase64String(bytes, 0, bytes.Length);
        }
    
        public static void foobar()
        {
            var url = @"https://gmail.google.com/gmail/feed/atom";
    
            var USER = "userName";
            var PASS = "password";
    
            var encoded = TextToBase64(USER + ":" + PASS);
    
            var myWebRequest = HttpWebRequest.Create(url);
            myWebRequest.Method = "POST";
            myWebRequest.ContentLength = 0;
            myWebRequest.Headers.Add("Authorization", "Basic " + encoded);
    
            var response = myWebRequest.GetResponse();
            var stream = response.GetResponseStream();
    
            // Parse the stream using your favorite parsing library or using XmlDocument ... 
        }
    

    下面的方法似乎可以检查未读邮件的数量。我对xml知之甚少,所以除了检索未读计数外,我无法解析结果。(错误时返回-1)


    你能举个例子吗?我真的不知道该怎么做。这个账户只会用作单向系统。gps跳线基本上是以邮件的形式发送的。然后我需要把它们捡起来读一遍,谢谢你的代码,我会尝试一下,我会再次遇到同样的错误。我很困惑,在你的帖子中,你提到用base64发送密码,但在代码中我看不到这一点。你如何请求页面,然后响应页面以提供base64密码?你使用了完整的代码(包括“ServicePointManager.CertificatePolicy=new IgnoreBadCerts();”)吗?Base64是使用的,但在内部,所以您不必担心它。此代码运行良好,谢谢-正如Matthew Flaschen所述,它返回一个401错误,我想我需要以某种方式发送身份验证。有人对此有什么想法吗?我写的代码必须工作得很理想,但我想谷歌的认证方法似乎有些问题。这家伙似乎也有同样的问题-谢谢,我回家后会尝试一下。我在运行此代码时遇到了一个“(407)Proxy Authentication Required”错误,有其他人尝试过吗?这很奇怪。我在日常工作中使用的应用程序中使用了该代码。唯一的办法是如果谷歌改变了一些东西,我有点怀疑(在我使用我的应用程序的这一年里,他们没有改变任何东西)。
        public static string TextToBase64(string sAscii)
        {
            System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
            byte[] bytes = encoding.GetBytes(sAscii);
            return System.Convert.ToBase64String(bytes, 0, bytes.Length);
        }
    
        public static void foobar()
        {
            var url = @"https://gmail.google.com/gmail/feed/atom";
    
            var USER = "userName";
            var PASS = "password";
    
            var encoded = TextToBase64(USER + ":" + PASS);
    
            var myWebRequest = HttpWebRequest.Create(url);
            myWebRequest.Method = "POST";
            myWebRequest.ContentLength = 0;
            myWebRequest.Headers.Add("Authorization", "Basic " + encoded);
    
            var response = myWebRequest.GetResponse();
            var stream = response.GetResponseStream();
    
            // Parse the stream using your favorite parsing library or using XmlDocument ... 
        }
    
    public int GmailUnreadCount(string username, string password)
        {
            XmlUrlResolver resolver = new XmlUrlResolver();
            resolver.Credentials = new NetworkCredential(username, password);
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.XmlResolver = resolver;
            try
            {
                XmlReader reader = XmlReader.Create("https://mail.google.com/mail/feed/atom", settings);
                while (reader.Read())
                {
                    switch (reader.NodeType)
                    {
                        case XmlNodeType.Element:
                            switch (reader.Name)
                            {
                                case "fullcount":
                                    int output;
                                    Int32.TryParse(reader.ReadString(), out output);
                                    return output;
                            }
                            break;
                    }
                }
            }
            catch (Exception a)
            {
                MessageBox.Show(a.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return -1;
            }
            return -1;
        }