我有一个项目会将包含某些数据的电子邮件发送到 gmail 帐户。我认为阅读 Atom 提要可能比通过 POP 连接更容易。
根据谷歌,我应该使用的网址是:
https://gmail.google.com/gmail/feed/atom
问题/问题是:如何验证我想查看的电子邮件帐户?如果我在 Firefox 中执行此操作,它会使用 cookie。
我也不确定如何准确地“下载”这个请求应该返回的 XML 文件(我相信正确的术语是流)。
编辑1:
我正在使用.Net 3.5。
.NET 框架 3.5 提供本机类来读取提要。这篇文章描述了如何做到这一点。
我还没有使用它,但必须有一些对 URL 进行身份验证的规定。你可以检查一下。我也会这样做,并将答案发布回来。
如果您不使用框架 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);
这是我在 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")
这在 C# 中应该没有太大的不同。
您使用基本身份验证。基本上,您发出初始请求,服务器回复 401,然后您以 base64 格式发回密码(在本例中是通过 HTTPS)。
请注意:
编辑:这是一个验证 Atom 提要并将其加载到 XmlDocument 中的示例。请注意,这只会提供读取访问权限。搜索或询问其他问题以获取有关 C# 和 SMTP 的信息。ICertificatePolicy 垃圾对我来说是必要的,因为 Mono 不喜欢 Google 的证书。这是一种快速的解决方法,不适合生产。
好的,既然您已经澄清您实际上是在阅读邮件(并且发送邮件的组件不同),我建议您使用 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);
}
}
对于它的价值,我从未能够通过以下方式进行身份验证:
https://gmail.google.com/gmail/feed/atom
但是我总是可以通过以下方式进行身份验证:
https://mail.google.com/mail/feed/atom
嗯!!
以下方法似乎可以检查未读邮件的数量。我对 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;
}
这是我精益求精的解决方案:
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 ...
}