使用搜狐Sendcloud的Webapi发送邮件:Jodd和Apache Httpclient
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>
提交工单,与客服和技术支持,交流了几个小时,终于解决了问题。
第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方法替代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);
}
使用搜狐Sendcloud的Webapi发送邮件:Jodd和Apache Httpclient的更多相关文章
- 山寨Unity3D?搜狐畅游的免费开源游戏引擎Genesis-3D
在CSDN上看到了<搜狐畅游发布3D游戏引擎Genesis-3D 基于MIT协议开源>(http://www.csdn.net/article/2013-11-21/2817585-cha ...
- jquery仿搜狐投票动画代码
体验效果:http://hovertree.com/texiao/jquery/21/ 这是一款基于jquery实现的仿搜狐投票动画特效源码,运行该源码可见VS图标首先出现在中间位置,紧接着随着投票比 ...
- crawler4j源码学习(1):搜狐新闻网新闻标题采集爬虫
crawler4j是用Java实现的开源网络爬虫.提供了简单易用的接口,可以在几分钟内创建一个多线程网络爬虫.下面实例结合jsoup,采集搜狐新闻网(http://news.sohu.com/)新闻标 ...
- 搜狗输入法弹出搜狐新闻的解决办法(sohunews.exe)
狗输入法弹出搜狐新闻的解决办法(sohunews.exe) 1.找到搜狗输入法的安装目录(一般是C:\program files\sougou input\版本号\)2.右键点击sohunews.ex ...
- centos6.5适用的国内yum源:网易、搜狐
设置方法如下: 1,进入yum源配置目录cd /etc/yum.repos.d 2,备份系统自带的yum源mv CentOS-Base.repo CentOS-Base.repo.bak 下载163网 ...
- Python伪开发者对于搜狐云景的测评
Python伪开发者对于搜狐云景的测评 本人是GAE和OpenShift的狂热爱好者,玩过各种国外PaaS.某次想搞个稍微复杂点的Python Web程序,需要比较好的网络传输速度,就试图找前PM(P ...
- 搜狐云景paas平台实践之路
前言: 搜狐云景作为搜狐的paas平台,在2014年5月22日的云计算大会上正式发布了公测.初测,注册用户必须先申请邀请码参与公测会赠送用户100元电子券,经过实名认证之后会再赠送100电子券,目测可 ...
- SAE、搜狐云景和百度云之初见
近期有需求将我们的应用部署到公有云的服务平台上,于是找了几家公有云服务做了一下调研, 首先对比一下他们提供的功能: 功能 SAE 搜狐云景 百度云 版本控制工具 svn GIT,和百度云的比起来,用 ...
- 继网易博客后搜狐博客也增加了nofollow标签
继网易博客后搜狐博客也增加了nofollow标签 今天在搜狐博客发表了篇文章,在末端添加上我的版权,结果回头查看是发现,这个锚文本被加上了nofollow标签,也就是说这样的外链已经没有传递权重的作用 ...
随机推荐
- CentOS 6 IPv6 关闭方法
http://www.linuxidc.com/Linux/2012-06/63642.htm http://blog.csdn.net/ccscu/article/details/7814028
- 在手机中预置联系人/Service Number
代码分为两部分: Part One 将预置的联系人插入到数据库中: Part Two 保证预置联系人仅仅读,无法被编辑删除(在三个地方屏蔽对预置联系人进行编辑处理:联系人详情界面.联系人多选界面.新建 ...
- 怎样让索引仅仅能被一个SQL使用
有个徒弟问我,要创建一个索引,去优化一个SQL,可是创建了索引之后其它 SQL 也要用 这个索引,其它SQL慢死了.要优化的SQL又快.遇到这样的问题咋搞? 一般遇到这样的问题还是非常少的.处理的方法 ...
- 开源课程管理系统(CMS):Moodle
开源课程管理系统(CMS):Moodle 一.总结 1.php开发的cms,可借鉴参考用 二.Moodle(百度) Moodle(Modular Object-Oriented Dynamic Lea ...
- Django模板变量,过滤器和静态文件引用
模版路径查找 首先去settings.py里面找TEMPLATES ,在TEMPLATES下面找DIRS,找到就返回,没找到就继续往下,如果APP_DIRS设置为为Ture,那么就会到上面 INSTA ...
- 【CS Round #46 (Div. 1.5) C】Set Subtraction
[链接]h在这里写链接 [题意] 一开始有n个数字,然后有一个数字X,把每个数字都减去X,又生成N个新的数字. 然后把这2*N个数字混在一起. 告诉你这2*N个数字是什么.让你复原出原来的N个数字,以 ...
- Java 学习(17): Java 泛型
Java 泛型 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型. 泛型的本质是参数化类型,也就是说将 ...
- UIViewController所有API的学习。
<欢迎大家加入iOS开发学习交流群:QQ529560119> /* UIViewController is a generic controller base class tha ...
- 编程——C语言的问题,堆栈
堆和栈的区别一.预备知识—程序的内存分配一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结 ...
- POJ 2014 Flow Layout 模拟
http://poj.org/problem?id=2014 嘻嘻2014要到啦,于是去做Prob.ID 为2014的题~~~~祝大家新年快乐~~ 题目大意: 给你一个最大宽度的矩形,要求把小矩形排放 ...