使用搜狐Sendcloud的Webapi发送邮件:Jodd和Apache Httpclient
2015-03-11 20:18
507 查看
最近,在使用搜狐Sendcloud发邮件。
Sendcloud提供http格式的webapi,方便地发送邮件,当然是要付费的。
很早之前,http工具一直用Httpclient,后来觉得jodd更简单,就倾向于jodd的一些工具库了。
使用jodd遇到一个问题:
当邮件内容比较大时,比如1万多字符的时候,发送邮件失败。
Sendcloud服务器所在的Nginx,提示
“
“<html><head><title>414 Request-URI Too Large</title></head>
<body bgcolor="white">
<center><h1>414 Request-URI Too Large</h1></center>
<hr><center>nginx</center>
</body>
</html>”
提交工单,与客服和技术支持,交流了几个小时,终于解决了问题。
第1种方法:使用官方给的Apache Httpclient的例子,发送邮件。
第2种方法:原来用Jodd,使用方式有问题。
这个地方用的是“post” ,但是参数仍然放在了url后面,当数据量过大时,就有问题了。
正确的做法是: HttpResponse response = HttpRequest.post(URL)// .contentType(contentType) .form(queryMap).send();
用form方法替代query方法。
有2个疑惑:
1.用post发送,为啥会把参数放在url后面?或者说,url后面接参数,还是post发送么?
2. jodd官方,有这句话:
Query parameters may be specified in the URL line (but then they have to be correctly encoded).
为啥是“可能”?
以下是一些代码 Apache发送:
Jodd发送:
jodd资料:http://jodd.org/doc/http.html
Sendcloud提供http格式的webapi,方便地发送邮件,当然是要付费的。
很早之前,http工具一直用Httpclient,后来觉得jodd更简单,就倾向于jodd的一些工具库了。
使用jodd遇到一个问题:
当邮件内容比较大时,比如1万多字符的时候,发送邮件失败。
Sendcloud服务器所在的Nginx,提示
“
414 Request-URI Too Large
”“<html><head><title>414 Request-URI Too Large</title></head>
<body bgcolor="white">
<center><h1>414 Request-URI Too Large</h1></center>
<hr><center>nginx</center>
</body>
</html>”
提交工单,与客服和技术支持,交流了几个小时,终于解决了问题。
第1种方法:使用官方给的Apache Httpclient的例子,发送邮件。
第2种方法:原来用Jodd,使用方式有问题。
Map<String, String> queryMap = new HashMap<String, String>(); queryMap.put("api_user", API_USER); queryMap.put("api_key", API_KEY); queryMap.put("from", FROM); queryMap.put("to", to); queryMap.put("subject", subject); queryMap.put("html", html.substring(0,html.length())); HttpResponse response = HttpRequest.post(URL)// .contentType(contentType) .query(queryMap).send(); String body = response.bodyText();
这个地方用的是“post” ,但是参数仍然放在了url后面,当数据量过大时,就有问题了。
正确的做法是: HttpResponse response = HttpRequest.post(URL)// .contentType(contentType) .form(queryMap).send();
用form方法替代query方法。
有2个疑惑:
1.用post发送,为啥会把参数放在url后面?或者说,url后面接参数,还是post发送么?
2. jodd官方,有这句话:
Query parameters may be specified in the URL line (but then they have to be correctly encoded).
为啥是“可能”?
以下是一些代码 Apache发送:
public static void send(String to, String subject, String html) { if (!check()) { return; } String url = URL; HttpClient httpclient = new DefaultHttpClient(); HttpPost httpost = new HttpPost(url); List nvps = new ArrayList(); nvps.add(new BasicNameValuePair("api_user", API_USER)); nvps.add(new BasicNameValuePair("api_key", API_KEY)); nvps.add(new BasicNameValuePair("from", FROM)); nvps.add(new BasicNameValuePair("to", to)); nvps.add(new BasicNameValuePair("subject", subject)); nvps.add(new BasicNameValuePair("html", html)); try { httpost.setEntity(new UrlEncodedFormEntity(nvps, "UTF-8")); HttpResponse response = httpclient.execute(httpost); if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { // 正常返回 HttpEntity entity = response.getEntity(); System.out.println(EntityUtils.toString(entity)); } else { System.err.println("error"); } } catch (Exception e) { e.printStackTrace(); } }
Jodd发送:
public static void send(String to, String subject, String html) { if (!check()) { return; } Map<String, Object> queryMap = new HashMap<String, Object>(); queryMap.put("api_user", API_USER); queryMap.put("api_key", API_KEY); queryMap.put("from", FROM); queryMap.put("to", to); queryMap.put("subject", subject); queryMap.put("html", html.substring(0,html.length())); HttpResponse response = HttpRequest.post(URL)// .contentType(contentType) .form(queryMap).send(); String body = response.bodyText(); try { JSONObject jsonObject = JSONObject.parseObject(body); MailMessage msg = JSONObject.toJavaObject(jsonObject, MailMessage.class); String sendInfo = "to=" + to + ",subject=" + subject; if (msg.getMessage().equals(MailMessage.ERROR)) { logger.error("sendcloud,send mail failed:" + msg + ",sendInfo:" + sendInfo); } else if (msg.getMessage().equals(MailMessage.SUCCESS)) { logger.info("sendcloud,send mail ok,sendInfo:" + sendInfo); } } catch (Exception e) { logger.error("send mail failed",e); logger.info(body); } // System.out.println(response); }
jodd资料:http://jodd.org/doc/http.html
相关文章推荐
- 使用搜狐Sendcloud的Webapi发送邮件:Jodd和Apache Httpclient
- 使用搜狐Sendcloud的Webapi发送邮件:Jodd和Apache Httpclient
- 使用搜狐Sendcloud的Webapi发送邮件:Jodd和Apache Httpclient
- 使用Apache提供的HttpClient发送https请求
- Android使用Apache HttpClient发送GET、POST请求
- android使用apache httpclient发送post请求
- 使用Apache HttpClient4.x 发送 GET POST 请求
- 使用apache的httpclient发送post请求传送和解析json
- Android使用Apache HttpClient发送GET、POST请求
- Java--org.apache.http.client的HttpClient发送Post请求,获取返回Header
- windows 8上使用SmtpClient.Send()发送邮件失败的原因分析。
- [转]使用 Apache HttpClient 突破 J2EE 站点认证
- Apache Common HttpClient使用之七种武器
- Java用org.apache.http.client的HttpClient发送Post请求 可获取返回Header
- Imail 邮件服务器的SMTP配置与 .NET 下使用 System.Net.SmtpClient 发送邮件
- 使用org.apache.commons.mail 发送邮件
- java 发送邮件 例子 (带附件的) 使用org.apache.commons.mail
- 使用org.apache.commons.mail发送邮件
- 使用smtpClient发送邮件时
- 使用apache.commons.mail包发送邮件,例子