使用搜狐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标签,也就是说这样的外链已经没有传递权重的作用 ...
随机推荐
- yarn的安装和使用
yarn的简介: Yarn是facebook发布的一款取代npm的包管理工具. yarn的特点: 速度超快. Yarn 缓存了每个下载过的包,所以再次使用时无需重复下载. 同时利用并行下载以最大化资源 ...
- 想知道WiFi是什么样子的么?
据英国<每日邮报>报道.英国纽卡斯尔大学博士生路易斯·赫南日前利用定制的仪器为WiFi信号拍照,绘制出一系列展现人类周围无形网络WiFi连接情况的图,这些盘旋环绕的明亮光束,宛如幽灵一般缠 ...
- 使用IPV6
使用IPV6 知道IPV6已经很久了,但是一直没有使用过. 我使用的IPV4网络一般是 内网-->外网-->互联网,IPV6也不外乎这样,但是对IPV6而言,必须有它的"世界&q ...
- 利用Socket进行大文件传输
分类: WINDOWS 最近接触到利用socket进行大文件传输的技术,有些心得,与大家分享.首先看看这个过程是怎么进行的(如下图): 所以,我们需要三个socket在窗体加载的时候初始化: ...
- 【原创】面向对象版本地CPU资源占用监控脚本
前期准备: 1.python2.7环境 2.相关第三方库下载安装 脚本工作过程: 1.根据输入的进程名判断进程是否存在,如果不存在则进行等待,直到检测到进程PID,中途进程退出抛出异常,键入enter ...
- (转)kvm虚拟机中,如何给子系统更换光盘
转自:http://www.cnblogs.com/york-hust/archive/2012/06/12/2546334.html 启动kvm后,在kvm窗口中,按下CTRL+ALT+2,切换至q ...
- upf1
创建supply net,两种方法 1. creat_supply_net VDD -domain PD_B 2. creat_supply_net VDD
- BAT面试常的问题和最佳答案
原标题:BAT面试常的问题和最佳答案 技术面试 1.servlet执行流程 客户端发出http请求,web服务器将请求转发到servlet容器,servlet容器解析url并根据web.xml找到相对 ...
- [Android 4.4.2] 泛泰A870 Mokee4.4.2 20140531 RC1.0 by syhost
欢迎关注泛泰非盈利专业第三方开发团队 VegaDevTeam (本team 由 syhost suky zhaochengw(z大) xuefy(大星星) tenfar(R大师) loogeo cr ...
- C#利用反射机制,获取实例的属性和属性值
C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值 对应某个类的实例化的对象tc, 遍历获取所有属性(子成员)的方法(采用反射): Type t = tc.GetType();// ...