腾讯企业邮箱API实现单点登录和获取企业未读邮件

应公司要求在ERP平台的OA系统上显示企业邮箱的未读邮件数量,并且实现单点登录.也就是点击数字可以直接进入腾讯企业邮箱不用登录.既然用到这个API肯定大家也都有腾讯企业邮箱OpenApi协议v1.4文档了.我这是1.4的.

有了文档就可以按照上面的步骤根据需要调用API就可以了.刚开始的时候拿到这个文档都还不知道怎么做,百度下感觉效果不明显,所以想写一个稍微完整一点的实例可以供大家参考

首先我是用Java写的,根据文档需要去访问它给的地址并携带正确参数才能返回我们需要的结果.

为了发送请求所以用了HttpClient

package com.platform.util.common;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.ParseException;
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.HttpUriRequest;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.apache.log4j.Logger;

/**
 * 
 * ============================================
*  功能描述:发送POST/GET请求
============================================
 */
public class HttpXmlClient {  
    private static Logger log = Logger.getLogger(HttpXmlClient.class);  
      
    public static String post(String url, Map<String, String> params) {  
        DefaultHttpClient httpclient = new DefaultHttpClient();  
        String body = null;  
          
        log.info("create httppost:" + url);  
        HttpPost post = postForm(url, params);  
          
        body = invoke(httpclient, post);  
          
        httpclient.getConnectionManager().shutdown();  
          
        return body;  
    }  
      
    public static String get(String url) {  
        DefaultHttpClient httpclient = new DefaultHttpClient();  
        String body = null;  
          
        log.info("create httppost:" + url);  
        HttpGet get = new HttpGet(url);  
        body = invoke(httpclient, get);  
          
        httpclient.getConnectionManager().shutdown();  
          
        return body;  
    }  
          
      
    private static String invoke(DefaultHttpClient httpclient,  
            HttpUriRequest httpost) {  
          
        HttpResponse response = sendRequest(httpclient, httpost);  
        String body = paseResponse(response);  
          
        return body;  
    }  
  
    private static String paseResponse(HttpResponse response) {  
        log.info("get response from http server..");  
        HttpEntity entity = response.getEntity();  
          
        log.info("response status: " + response.getStatusLine());  
        String charset = EntityUtils.getContentCharSet(entity);  
        log.info(charset);  
          
        String body = null;  
        try {  
            body = EntityUtils.toString(entity);  
            log.info(body);  
        } catch (ParseException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
          
        return body;  
    }  
  
    private static HttpResponse sendRequest(DefaultHttpClient httpclient,  
            HttpUriRequest httpost) {  
        log.info("execute post...");  
        HttpResponse response = null;  
          
        try {  
            response = httpclient.execute(httpost);  
        } catch (ClientProtocolException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        return response;  
    }  
  
    private static HttpPost postForm(String url, Map<String, String> params){  
          
        HttpPost httpost = new HttpPost(url);  
        List<NameValuePair> nvps = new ArrayList <NameValuePair>();  
          
        Set<String> keySet = params.keySet();  
        for(String key : keySet) {  
            nvps.add(new BasicNameValuePair(key, params.get(key)));  
        }  
          
        try {  
            log.info("set utf-8 form entity to httppost");  
            httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));  
        } catch (UnsupportedEncodingException e) {  
            e.printStackTrace();  
        }  
          
        return httpost;  
    }  
    
} 

上面的方法都是百度找的直接贴过来就可以用了.也不用去纠结主要是看效果对吧!其实也不难理解.

然后可以发送请求就简单了,直接调用就好了

/**
     * 获取腾讯企业邮箱未读邮件
     * @Description:   
     * @param    
     * @return void  
     * @author 
     * @since 2015-9-9 上午10:33:01     
     * @throws
     */
    public void getNewCount(HttpServletRequest request,String email, HttpServletResponse response){
        try {
            if(StringUtil.isNotNullOrBlank(email)&&email.contains("@hsjy.com")){
               //String pyName = "";
                /**
                 * 将中文转成拼音再拼接邮箱
                 */
                //pyName = startService.getPingYin(personName);
                
                /**
                 * 封装获取access_token需要的参数
                 */
                Map<String, String> params = new HashMap<String, String>();  
                params.put("client_id", "管理帐号");  //管理帐号
                params.put("grant_type", "client_credentials");  //授权类型
                params.put("client_secret", "接口KEY");  //接口key
                      
                /**
                 * 发送给请求,获取token
                 */
                String token = HttpXmlClient.post("https://exmail.qq.com/cgi-bin/token",params);  
                log.info(token);
                
                /**
                 * 将返回的字符串转成Map,获取access_token
                 */
                Map fromJson = JsonHelper.fromJson(token,Map.class);
                String access_token = (String) fromJson.get("access_token");
                
                /**
                 * 封装获取未读邮件需要的参数
                 */
                Map<String, String> params2 = new HashMap<String, String>();
                params2.put("alias", email);    //需要获取的帐号
                params2.put("access_token", access_token);    //上面获取到的access_token
                
                /**
                 * 发送请求,获取newcount未读邮件
                 */
                String mail = HttpXmlClient.post("http://openapi.exmail.qq.com:12211/openapi/mail/newcount",params2);  
                
                Map json = JsonHelper.fromJson(mail,Map.class);
                String newCount = (String) json.get("NewCount");
                
                log.info(newCount+"条未读邮件");
                
                //如果获取的未读邮件是0或者是null都设置为""页面判断不在显示
                if(newCount!=null&&!"".equals(newCount)&&!"0".equals(newCount)){
                    request.setAttribute("newcount", newCount);
                }else{
                    request.setAttribute("newcount", "");
                }
                /**
                 * 发送请求,获取AuthKey
                 */
                String authKey = HttpXmlClient.post("http://openapi.exmail.qq.com:12211/openapi/mail/authkey",params2); 
                log.info(authKey);
                //将json字符串转成Map
                Map authKeyJson = JsonHelper.fromJson(authKey,Map.class);
                //获取到authKeyValue
                String authKeyValue = (String) authKeyJson.get("auth_key");
                
                //String authKey2 = HttpXmlClient.post("https://exmail.qq.com/cgi-bin/login?fun=bizopenssologin&method=bizauth&agent=hsjyadmin&user="+pyName+"@hsjy.com"+"&ticket="+authKeyValue,params2); 
                
                /**
                 * 设置页面腾讯企业邮箱单点登录页面需要的参数
                 */
                request.setAttribute("pyName", email);
                request.setAttribute("authKeyValue", authKeyValue);
          
/*try { PrintWriter writer = response.getWriter(); writer.write(authKey2); } catch (IOException e) { e.printStackTrace(); }*/ } } catch (Exception e) { e.printStackTrace(); } }
<c:choose>
      <c:when test="${not empty newcount}">
          <dl><dt><a href="<%=common_root%>/admin/oa/commanage/mail/manage.do?formAction=receiveBoxList"><img src="images/2.0/read4.jpg" width="36" height="35" /></a></dt><dd>
              未读信件:内部&nbsp;<a href="<%=common_root%>/admin/oa/commanage/mail/manage.do?formAction=receiveBoxList"><span id="noReadMailCount"></span></a>&nbsp;
              外部 <a href="https://exmail.qq.com/cgi-bin/login?fun=bizopenssologin&method=bizauth&agent=hsjyadmin&user=${pyName}&ticket=${authKeyValue}">${newcount}</a></dd></dl>
      </c:when>
      <c:otherwise>
          <dl><dt><a href="<%=common_root%>/admin/oa/commanage/mail/manage.do?formAction=receiveBoxList"><img src="images/2.0/read4.jpg" width="36" height="35" /></a></dt><dd>
              未读信件:&nbsp;<a href="<%=common_root%>/admin/oa/commanage/mail/manage.do?formAction=receiveBoxList"><span id="noReadMailCount"></span></a></dd></dl>
      </c:otherwise>
      </c:choose>

 

代码已经贴出来了,相当简单吧.

要注意的就是在传参数的时候只需要把获取的access_token传过去就好了,不要去拼接前面授权类型.

此博文仅供参考.欢迎留言交流学习.

 =================================================华=丽=分=割=线(更新时间:2016/12/6)==============================================

 下面有个C#的园友咨询获取不到auth_key的问题,今天做下更新. 

上面的代码没问题,而是现在腾讯企业邮箱在获取token的时候需要设置可使用此开放接口的IP,如果没有在指定的IP内会报出100001错误码.设置好了就可以了.这里设置的是外网IP不是局域网IP.也就是在百度里面搜索IP显示的地址

设置此开放接口的IP需要用管理员登录企业邮箱 工具箱->开放接口里面设置的.最多只能有5个

 

posted @ 2015-09-15 17:46  我的代码之路  阅读(11920)  评论(5编辑  收藏  举报