腾讯企业邮箱官方api文档很简略还有一些错误和漏洞:
1. 获取token单点登录和获取未读邮件数使用的secret不一致。
此处很容易误解为最初用于获取AccessToken的corpSecret
2.获取未读邮件数这个功能可以被管理员停用,需要开启
停用的时候返回返回?
3.获取未读邮件数的请求为post请求,官方文档是get
4.如果部署的weblogic之类的中间件可以会出现以下问题,请求的https报错证书不一致
此处的问题主要是后台发起请求的时候weblogic会去做安全校验,
解决办法:1.修改weblogic配置
? ? ? ? ? ? ? ? ? 2.?HttpsURLConnection 配合Handler绕开证书校验
? ? ? ? ? ? ? ? ? 3.请求之前信任所有证书
信任证书的方法:
private static void trustALLSSLCertificates(HttpURLConnection con) throws NoSuchAlgorithmException, KeyManagementException {
? ? ? ? ((HttpsURLConnection) con).setHostnameVerifier(new HostnameVerifier() {? ?
? ? ? ? ? ? public boolean verify(String hostname, SSLSession session) {? ?
? ? ? ? ? ? ? ? return true;? ?
? ? ? ? ? ? }?
? ? ? ? });? ?
? ? ? ? // Ignore Certification? ?
? ? ? ? TrustManager ignoreCertificationTrustManger=new X509TrustManager() {? ?
? ? ? ? ? ? public void checkClientTrusted(X509Certificate certificates[], String authType) throws CertificateException {? ?
? ? ? ? ? ? }? ?
? ? ? ? ? ? public void checkServerTrusted(X509Certificate[] ax509certificate, String s) throws CertificateException {? ?
? ? ? ? ? ? }? ?
? ? ? ? ? ? public X509Certificate[] getAcceptedIssuers() {? ?
? ? ? ? ? ? ? ? return null;? ?
? ? ? ? ? ? }?
? ? ? ? };? ?
? ? ? ? // Prepare SSL Context? ?
? ? ? ? TrustManager[] tm={ ignoreCertificationTrustManger };? ?
? ? ? ? SSLContext sslContext=SSLContext.getInstance("SSL");? ?
? ? ? ? sslContext.init(null, tm, new java.security.SecureRandom());? ?
? ? ? ? // 从上述SSLContext对象中得到SSLSocketFactory对象? ?
? ? ? ? SSLSocketFactory ssf=sslContext.getSocketFactory();? ?
? ? ? ? ((HttpsURLConnection) con).setSSLSocketFactory(ssf);? ?
? ? }?
后端请求:
public String httpGetbak(String url) {
? ? ? ? BufferedReader in=null;?
? ? ? ? try {?
? ? ? ? //com.sun.net.ssl.internal.www.protocol.https.Handler
? ? ? ? ? ? URL realUrl=new URL(null,url,new sun.net.www.protocol.https.Handler());?
? ? ? ? ? ? HttpsURLConnection? connection=(HttpsURLConnection) realUrl.openConnection();?
? ? ? ? ? ? trustALLSSLCertificates(connection);
? ? ? ? ? ? connection.setRequestProperty("accept", "*/*");?
? ? ? ? ? ? connection.setRequestProperty("connection", "Keep-Alive");?
? ? ? ? ? ? connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");?
? ? ? ? ? ? connection.setConnectTimeout(5000);?
? ? ? ? ? ? connection.setReadTimeout(5000);?
? ? ? ? ? ? connection.connect();?
? ? ? ? ? ? in=new BufferedReader(new InputStreamReader(connection.getInputStream()));?
? ? ? ? ? ? StringBuffer sb=new StringBuffer();?
? ? ? ? ? ? String line;?
? ? ? ? ? ? while ((line=in.readLine()) !=null) {?
? ? ? ? ? ? ? ? sb.append(line);?
? ? ? ? ? ? }?
? ? ? ? ? ? return sb.toString();?
? ? ? ? } catch (Exception e) {?
? ? ? ? ? e.printStackTrace();
? ? ? ? }?
? ? ? ? finally {?
? ? ? ? ? ? try {?
? ? ? ? ? ? ? ? if (in !=null) {?
? ? ? ? ? ? ? ? ? ? in.close();?
? ? ? ? ? ? ? ? }?
? ? ? ? ? ? } catch (Exception e2) {?
? ? ? ? ? ? ? ? e2.printStackTrace();?
? ? ? ? ? ? }?
? ? ? ? }?
? ? ? ? return null;?
? ? }?
单点登录与获取未读数
public String getEmailUrl(String user, String domain, String usertype){String tokenback=httpGetbak("https://api.exmail.qq.com/cgi-bin/gettoken?corpid=wm8c6ece99e54d4813&corpsecret=r8H0thugLH4ds3Jm4HAhnD_gvVtlsBIaJG4KH-5i5kW4rW_4JPF7FnOKVVa1Bc4L");JSonObject jsStr=JSONObject.fromObject(tokenback);String token=jsStr.getString("access_token");String url=" https://api.exmail.qq.com/cgi-bin/service/get_login_url?access_token="+token+"&userid="+user+"@hnust.edu.cn";String loginUrlBack=httpGetbak(url);JSonObject jsback=JSONObject.fromObject(loginUrlBack);loginUrlBack=jsback.getString("login_url");return loginUrlBack;}
public String getUnRead(String user, String domain, String usertype) throws HttpException, IOException {String email=user +"@"+domain;String tokenback=httpGetbak("https://api.exmail.qq.com/cgi-bin/gettoken?corpid=wm8c6ece99e54d4813&corpsecret=WqG1CvlXqy6nrobMIrYCSXhFe80jgoZEw6Epx3s5XIgkRlvUX9H8NkyENW4uGaBH");JSonObject jsStr=JSONObject.fromObject(tokenback);String token=jsStr.getString("access_token"); Mapparams=new HashMap();
? Date currentTime=new Date();?
? SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MM-dd");?
? String dateNow=formatter.format(currentTime);
? Calendar c=Calendar.getInstance();
? c.setTime(new Date());
? ? ? ? c.add(Calendar.DATE, - 7);
? ? ? ? Date daybefore=c.getTime();
? ? ? ? String dbef=formatter.format(daybefore);
? ? ? ? params.put("type", "0");?
? ? ? ? params.put("begin_date", dateNow);?
? ? ? ? params.put("end_date", dbef);?
? ? ? ? String url="https://api.exmail.qq.com/cgi-bin/mail/newcount?access_token="+token+"&userid="+email;
? ? PostMethod gmethod=new PostMethod(url);
? ? HttpClient httpclient=new HttpClient();
? ? HttpClientParams ps=new HttpClientParams();
? ? ps.setParameter("type", "0");
? ? ps.setParameter("begin_date", dateNow);
? ? ps.setParameter("end_date", dbef);?
? ? httpclient.setParams(ps);
? ? int responseCode=httpclient.executeMethod(gmethod);
? ? String mailContent="";
? ? if (responseCode==HttpURLConnection.HTTP_OK) {
InputStream inputStream=gmethod.getResponseBodyAsStream();
BufferedReader br=new BufferedReader(new InputStreamReader(
inputStream, "ISO-8859-1"));
StringBuffer resBuffer=new StringBuffer();
String tempStr="";
while ((tempStr=br.readLine()) !=null) {
resBuffer.append(new String(tempStr.getBytes("ISO-8859-1"),
"UTF-8"));
}
? ? mailContent=resBuffer.toString();
? ? JSonObject Str=JSONObject.fromObject(mailContent);
String num=Str.getString("count");
return num;
? ? }
? ? ? ? return "0";
}