我有一个项目会将包含某些数据的电子邮件发送到Gmail帐户。我认为阅读Atom提要可能更容易,而不是通过POP连接。
根据Google,我应该使用的网址是:
https://gmail.google.com/gmail/feed/atom
问题/问题是:如何验证我想要查看的电子邮件帐户?如果我在Firefox中使用它,它会使用cookie。
我也不确定如何“下载”此请求应返回的XML文件(我相信正确的术语是流)。
修改1:
我正在使用.Net 3.5。
答案 0 :(得分:6)
.NET framework 3.5提供了读取提要的本机类。 This文章介绍了如何操作。
我没有使用它,但必须有一些用于身份验证的规定。你可以检查一下。我也会这样做,并将答案发回。
如果您没有使用框架3.5,那么您可以尝试Atom.NET。我曾经用过一次,但它的旧版本。如果满足您的需求,您可以尝试一下。
编辑:这是分配用户凭据的代码:
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);
答案 1 :(得分:6)
这是我在Vb.net中使用的:
objClient.Credentials = New System.Net.NetworkCredential(username, password)
objClient的类型为System.Net.WebClient。
然后,您可以使用以下内容从Feed中获取电子邮件:
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")
这在C#中应该没有什么不同。
答案 2 :(得分:2)
您使用Basic Auth。基本上,您发出初始请求,服务器回复401,然后您在base64中发回密码(在这种情况下通过HTTPS)。
请注意:
编辑:这是一个用于验证Atom提要并将其加载到XmlDocument中的示例。请注意,这只会提供读取权限。在C#和SMTP上搜索或询问另一个问题以获取信息。由于Mono不喜欢谷歌的证书,ICertificatePolicy垃圾对我来说是必要的。这是一个快速的解决方法,不适合生产。
好的,既然你已经澄清了你实际上正在阅读邮件(而另一个组件正在发送邮件),我建议你使用POP。 :
using System;
using System.Net;
using System.IO;
using System.Security.Cryptography.X509Certificates;
using System.Xml;
public class GmailFeed
{
private class IgnoreBadCerts : ICertificatePolicy
{
public bool CheckValidationResult (ServicePoint sp,
X509Certificate certificate,
WebRequest request,
int error)
{
return true;
}
}
public static void Main(string[] argv)
{
if(argv.Length != 2)
{
Console.Error.WriteLine("Usage: GmailFeed username password");
Environment.ExitCode = 1;
return;
}
ServicePointManager.CertificatePolicy = new IgnoreBadCerts();
NetworkCredential cred = new NetworkCredential();
cred.UserName = argv[0];
cred.Password = argv[1];
WebRequest req = WebRequest.Create("https://gmail.google.com/gmail/feed/atom");
req.Credentials = cred;
Stream resp = req.GetResponse().GetResponseStream();
XmlReader reader = XmlReader.Create(resp);
XmlDocument doc = new XmlDocument();
doc.Load(reader);
}
}
答案 3 :(得分:1)
为了它的价值,我从未通过以下方式进行身份验证:
https://gmail.google.com/gmail/feed/atom
但是我可以随时进行身份验证:
https://mail.google.com/mail/feed/atom
HTH !!
答案 4 :(得分:1)
以下方法似乎可以检查未读邮件的数量。我根本不了解xml所以我无法解析结果而不是检索未读数。 (出错时返回-1)
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;
}
答案 5 :(得分:0)
这是我的精益和平均解决方案:
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 ...
}