package com20110711;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.client.params.CookiePolicy;
import org.apache.http.client.params.HttpClientParams;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
/****
* 邮件访问
* 目前只针对mail.163.com
* http登陆
* 无验证码情况
* 这里的异常处理请自己根据实际情况自行处理(我这里不知道是集成日志里还是怎么处理,其他运行异常是无法有效处理的,请自行考虑)
* 目前getContact为获取列表的公共方法
*/
public class MailVisit {
/***
* mail163登陆地址
*/
private static final String LOGIN_163URL="http://reg.163.com/login.jsp?type=1&product=mail163&url=http://entry.mail.163.com/coremail/fcg/ntesdoor2?lightweight%3D1%26verifycookie%3D1%26language%3D-1%26from%3Dweb%26df%3Dindex%26style%3D-1";
/***
* mail163编码
*/
private static final String CHARSET="GBK";
/***
* 匹配用户信息正则
*/
private static final String REGEXMESS="\"查看用户信息\">([\\S\\s]*?)</a>[\\S\\s]*?\"查看用户信息\">([\\s\\S]*?)</a>[\\s\\S]*?id=\"[\\s\\S]*?\">([\\d]*?)</a>";
/***
*
* @param username 用户名
* @param password 迷茫
* @return 返回邮箱和名字 key=mailName value=name
* 如果返回null则表示异常导致失败,如果不为null但size=0为正常,但是没有信息
*/
public Map<String,String> getContact(String mailName,String password){
if(mailName==null||password==null)
throw new NullPointerException();
Map<String,String> userMess=null;
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpClientParams.setCookiePolicy(httpclient.getParams(),CookiePolicy.BROWSER_COMPATIBILITY);
int state=LoginContext(httpclient, mailName, password);
if(state!=200)
return null;
String sid=getSid(httpclient);
if(sid==null)
return null;
userMess=getUserMess(httpclient, sid);
httpclient.getConnectionManager().shutdown();
return userMess;
}
/***
* 模拟登陆
* @param httpclient
* @param mailName 邮件名字
* @param password 密码
* @return 200为正常
*/
private int LoginContext(DefaultHttpClient httpclient,String mailName,String password)
{
int state=0;
HttpPost httpost = new HttpPost(LOGIN_163URL);
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("username",mailName));
nvps.add(new BasicNameValuePair("url2", "http%3A%2F%2Femail.163.com%2Ferrorpage%2Ferr_163.htm"));
nvps.add(new BasicNameValuePair("selectDomain","163"));
nvps.add(new BasicNameValuePair("password", password));
nvps.add(new BasicNameValuePair("style163", "-1"));
nvps.add(new BasicNameValuePair("style126=-1", "-1"));
nvps.add(new BasicNameValuePair("styleyeah", "-1"));
nvps.add(new BasicNameValuePair("styleqiye", "-1"));
try {
httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
HttpResponse responses = httpclient.execute(httpost);
state=HttpUitl.printResponseStatus(responses);
} catch (UnsupportedEncodingException e) {
// TODO:/****************这里请考虑集成到程序日志,或者其他操作,在此我不做处理********/
} catch (ClientProtocolException e) {
// TODO:/****************这里请考虑集成到程序日志,或者其他操作,在此我不做处理********/
} catch (IOException e) {
// TODO: /****************这里请考虑集成到程序日志,或者其他操作,在此我不做处理********/
}finally{
closeResources(httpost);
}
return state;
}
/***
* 获取Sid
* @param httpclient
* @return
*/
private String getSid( DefaultHttpClient httpclient) {
HttpGet httpget = new HttpGet("http://entry.mail.163.com/coremail/fcg/ntesdoor2?lightweight=1&verifycookie=1&language=-1&from=web&df=index&style=-1");
HttpResponse responses=null;
String sid=null;
try {
responses = httpclient.execute(httpget,HttpUitl.setCookie(httpclient));
HttpEntity entity = responses.getEntity();
sid=filterSid(HttpUitl.processEntity(entity,CHARSET).toString());
} catch (ClientProtocolException e) {
// TODO: /****************这里请考虑集成到程序日志,或者其他操作,在此我不做处理********/
} catch (IOException e) {
// TODO: /****************这里请考虑集成到程序日志,或者其他操作,在此我不做处理********/
}finally{
closeResources(httpget);
}
return sid;
}
/****
* 获取用户信息
* @param httpclient
* @throws ClientProtocolException
* @throws IOException
*/
private Map<String,String> getUserMess( DefaultHttpClient httpclient,String Sid) {
HttpGet httpget = new HttpGet("http://g4a30.mail.163.com/jy3/address/addrlist.jsp?sid="+Sid+"&gid=all");
HttpResponse responses=null;
Map<String,String> userMess=null;
try {
responses = httpclient.execute(httpget,HttpUitl.setCookie(httpclient));
HttpEntity entity = responses.getEntity();
userMess=getMess( HttpUitl.processEntity(entity,CHARSET).toString());
} catch (ClientProtocolException e) {
// TODO: /****************这里请考虑集成到程序日志,或者其他操作,在此我不做处理********/
} catch (IOException e) {
// TODO: /****************这里请考虑集成到程序日志,或者其他操作,在此我不做处理********/
}finally{
closeResources(httpget);
}
return userMess;
}
/***
* 过滤sid
* @param text 页面内容
* @return sid
*/
private String filterSid(String text) {
if(text==null)
throw new NullPointerException();
Pattern pattern = Pattern.compile("sid=([\\s\\S]*?)\"",Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(text);
if (matcher.find())
return matcher.group(1);
return null;
}
/***
* 获取用户信息
* @param text
* @return 返回kye=mail value=name
*/
private Map<String,String> getMess(String text) {
if(text==null)
throw new NullPointerException();
Map<String,String> userMess=new HashMap<String, String>();
Pattern pattern = Pattern.compile(REGEXMESS,Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(text);
while(matcher.find())
userMess.put(matcher.group(2), matcher.group(1));
return userMess;
}
/****
* 关闭请求资源
*/
private void closeResources(HttpRequestBase requestbase) {
if(requestbase!=null)
requestbase.abort();
}
/****
* 测试用例
* @param args
*/
public static void main(String[] args) {
Map<String ,String > map=new MailVisit().getContact("jihongyu19870122", "huangxiaoling");
Set<String> set=map.keySet();
for(String a:set)
{
System.out.println(a+"|"+map.get(a));
}
}
}