知方号

知方号

腾讯企业邮箱集成的坑<腾讯企业邮箱app>

腾讯企业邮箱集成的坑

腾讯企业邮箱官方api文档很简略还有一些错误和漏洞:

1. 获取token单点登录和获取未读邮件数使用的secret不一致。

此处很容易误解为最初用于获取AccessToken的corpSecret

2.获取未读邮件数这个功能可以被管理员停用,需要开启

停用的时候返回返回 {"errcode":602005,"errmsg":"no privilege to access app"}

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";

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lizi9903@foxmail.com举报,一经查实,本站将立刻删除。