公司最近安排做收取用户邮件的模块,主要针对一些知名的大牌信箱。首先考虑Gmail,它有2G的容量、Web2.0的框架,是当然不让的首选。
GMail有一个特点,它不直接提供POP3的接口。不过有一个XML的Feeds地址,需要登陆才能查看。地址如下:
https://mail.google.com/mail/feed/atom
登陆进去后,XML格式是这样的:
<? xml version="1.0" encoding="UTF-8" ?>
< feed version ="0.3" xmlns ="http://purl.org/atom/ns#" >
< title > Gmail - Inbox for li.jadesun@gmail.com </ title >
< tagline > New messages in your Gmail Inbox </ tagline >
< fullcount > 1 </ fullcount >
< link rel ="alternate" href ="http://mail.google.com/mail" type ="text/html" />
< modified > 2006-10-24T15:31:48Z </ modified >
< entry >
< title > 欢迎光临Yahoo! - 请激活您的帐户 </ title >
< summary > width=1 帐户信息 帮助 不要回复此封邮件。如果您没有创建一个帐户,请 … </ summary >
< link rel ="alternate" href ="http://mail.google.com/mail?xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" type ="text/html" />
< modified > 2006-10-24T09:34:37Z </ modified >
< issued > 2006-10-24T09:34:37Z </ issued >
< id > tag:gmail.google.com,2004:1218112365137369397 </ id >
< author >
< name > my-yahoo-register </ name >
< email > my-yahoo-register@yahoo-inc.com </ email >
</ author >
</ entry >
</ feed >
研究了一天,用.net实现了登陆收取的方法,采用WebRequest对象来实现的。
wrGETURL
=
WebRequest.Create( " https://mail.google.com/mail/feed/atom " );
if (clsMain.g_UseProxy)
... {
wrGETURL.Proxy = clsMain.GetProxy();
}
bytes = Encoding.ASCII.GetBytes(txtUserName.Text.Trim() + " : "
+ txtUserPassword.Text.Trim());
wrGETURL.Headers.Add( " Authorization " ,
" Basic " + Convert.ToBase64String(bytes));
Stream feedStream =
wrGETURL.GetResponse().GetResponseStream();
Atom.Core.AtomFeed myFeed;
myFeed = Atom.Core.AtomFeed.Load(feedStream);
// Get the date and time of the feed.
strFeedTime = myFeed.Modified.DateTime.Day.ToString() + " - "
+ myFeed.Modified.DateTime.ToString( " MMM " ) + " - "
+ myFeed.Modified.DateTime.Year.ToString() + " "
+ myFeed.Modified.DateTime.TimeOfDay.ToString();
feedTime = DateTime.Parse(strFeedTime);
Atom.Core.Collections.AtomEntryCollection ents =
myFeed.Entries;
foreach (Atom.Core.AtomEntry ent in ents)
... { ...{
FromName = ent.Author.Name;
Title = ent.Title.Content;
Content = ent.Summary.Content;
//Do something else
}
WebRequest.Create( " https://mail.google.com/mail/feed/atom " );
if (clsMain.g_UseProxy)
... {
wrGETURL.Proxy = clsMain.GetProxy();
}
bytes = Encoding.ASCII.GetBytes(txtUserName.Text.Trim() + " : "
+ txtUserPassword.Text.Trim());
wrGETURL.Headers.Add( " Authorization " ,
" Basic " + Convert.ToBase64String(bytes));
Stream feedStream =
wrGETURL.GetResponse().GetResponseStream();
Atom.Core.AtomFeed myFeed;
myFeed = Atom.Core.AtomFeed.Load(feedStream);
// Get the date and time of the feed.
strFeedTime = myFeed.Modified.DateTime.Day.ToString() + " - "
+ myFeed.Modified.DateTime.ToString( " MMM " ) + " - "
+ myFeed.Modified.DateTime.Year.ToString() + " "
+ myFeed.Modified.DateTime.TimeOfDay.ToString();
feedTime = DateTime.Parse(strFeedTime);
Atom.Core.Collections.AtomEntryCollection ents =
myFeed.Entries;
foreach (Atom.Core.AtomEntry ent in ents)
... { ...{
FromName = ent.Author.Name;
Title = ent.Title.Content;
Content = ent.Summary.Content;
//Do something else
}
这里用到了一个开源的组件支持(Atom),把Stream流数据转成了XML数据,并进行了解析,可以在http://atomnet.sourceforge.net/下载得到。
该代码经同事帮忙,改写在JAVA下面了,终于能在项目中应用,我顺便把JAVA代码贴出来,写在Action中的。
import
java.net.URL;
import java.net.URLConnection;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import sun.misc.BASE64Encoder;
public class GmailAction extends Action ... {
/** *//**
* Gmail feed get
*/
@Override
public ActionForward execute(ActionMapping mapping,ActionForm form,
HttpServletRequest request,HttpServletResponse response) throws Exception ...{
String username =request.getParameter("username");
String password =request.getParameter("password");
URL server = new URL("https://mail.google.com/mail/feed/atom");
URLConnection connection = server.openConnection();
PasswordAuthentication pa = Authenticator.requestPasswordAuthentication(
InetAddress.getByName(connection.getURL().getHost()),
connection.getURL().getPort(),
connection.getURL().getProtocol(),
null,
"Basic");
StringBuffer buf = new StringBuffer(username);
buf.append(":");
buf.append(password);
String encoded = new BASE64Encoder().encode(buf.toString().getBytes());;
connection.setRequestProperty ("Authorization", "Basic " + encoded);
connection.connect();
InputStream in = connection.getInputStream();
byte [] data = new byte [1<<10];
ByteArrayOutputStream baos = new ByteArrayOutputStream();
for(int i; (i=in.read(data))!=-1; baos.write(data,0,i));
byte [] badata = baos.toByteArray();
response.getOutputStream().write(badata);
return null;
}
}
import java.net.URLConnection;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import sun.misc.BASE64Encoder;
public class GmailAction extends Action ... {
/** *//**
* Gmail feed get
*/
@Override
public ActionForward execute(ActionMapping mapping,ActionForm form,
HttpServletRequest request,HttpServletResponse response) throws Exception ...{
String username =request.getParameter("username");
String password =request.getParameter("password");
URL server = new URL("https://mail.google.com/mail/feed/atom");
URLConnection connection = server.openConnection();
PasswordAuthentication pa = Authenticator.requestPasswordAuthentication(
InetAddress.getByName(connection.getURL().getHost()),
connection.getURL().getPort(),
connection.getURL().getProtocol(),
null,
"Basic");
StringBuffer buf = new StringBuffer(username);
buf.append(":");
buf.append(password);
String encoded = new BASE64Encoder().encode(buf.toString().getBytes());;
connection.setRequestProperty ("Authorization", "Basic " + encoded);
connection.connect();
InputStream in = connection.getInputStream();
byte [] data = new byte [1<<10];
ByteArrayOutputStream baos = new ByteArrayOutputStream();
for(int i; (i=in.read(data))!=-1; baos.write(data,0,i));
byte [] badata = baos.toByteArray();
response.getOutputStream().write(badata);
return null;
}
}
response.getOutputStream().write(badata); 输出的就是XML数据,拿着用就是了。解决了收取GMail邮件的问题。