java短信发送
Ⅰ java如何实现发送短信验证码功能
1、创建一个Http的模拟请求工具类,然后写一个POST方法或者GET方法
/** * 文件说明 * @Description:扩展说明 * @Copyright: XXXX dreamtech.com.cn Inc. All right reserved * @Version: V6.0 */package com.demo.util; import java.io.IOException;import java.util.Map; import org.apache.commons.httpclient.HttpClient;import org.apache.commons.httpclient.HttpException;import org.apache.commons.httpclient.SimpleHttpConnectionManager;import org.apache.commons.httpclient.methods.GetMethod;import org.apache.commons.httpclient.methods.PostMethod; /** * @Author: feizi * @Date: XXXX年XX月XX日 XX:XX:XX * @ModifyUser: feizi * @ModifyDate: XXXX年XX月XX日 XX:XX:XX * @Version:V6.0 */public class HttpRequestUtil { /** * HttpClient 模拟POST请求 * 方法说明 * @Discription:扩展说明 * @param url * @param params * @return String * @Author: feizi * @Date: XXXX年XX月XX日 XX:XX:XX * @ModifyUser:feizi * @ModifyDate: XXXX年XX月XX日 XX:XX:XX */ public static String postRequest(String url, Map<String, String> params) { //构造HttpClient的实例 HttpClient httpClient = new HttpClient(); //创建POST方法的实例 PostMethod postMethod = new PostMethod(url); //设置请求头信息 postMethod.setRequestHeader("Connection", "close"); //添加参数 for (Map.Entry<String, String> entry : params.entrySet()) { postMethod.addParameter(entry.getKey(), entry.getValue()); } //使用系统提供的默认的恢复策略,设置请求重试处理,用的是默认的重试处理:请求三次 httpClient.getParams().setBooleanParameter("http.protocol.expect-continue", false); //接收处理结果 String result = null; try { //执行Http Post请求 httpClient.executeMethod(postMethod); //返回处理结果 result = postMethod.getResponseBodyAsString(); } catch (HttpException e) { // 发生致命的异常,可能是协议不对或者返回的内容有问题 System.out.println("请检查输入的URL!"); e.printStackTrace(); } catch (IOException e) { // 发生网络异常 System.out.println("发生网络异常!"); e.printStackTrace(); } finally { //释放链接 postMethod.releaseConnection(); //关闭HttpClient实例 if (httpClient != null) { ((SimpleHttpConnectionManager) httpClient.getHttpConnectionManager()).shutdown(); httpClient = null; } } return result; } /** * HttpClient 模拟GET请求 * 方法说明 * @Discription:扩展说明 * @param url * @param params * @return String * @Author: feizi * @Date: XXXX年XX月XX日 XX:XX:XX * @ModifyUser:feizi * @ModifyDate: XXXX年XX月XX日 XX:XX:XX */ public static String getRequest(String url, Map<String, String> params) { //构造HttpClient实例 HttpClient client = new HttpClient(); //拼接参数 String paramStr = ""; for (String key : params.keySet()) { paramStr = paramStr + "&" + key + "=" + params.get(key); } paramStr = paramStr.substring(1); //创建GET方法的实例 GetMethod method = new GetMethod(url + "?" + paramStr); //接收返回结果 String result = null; try { //执行HTTP GET方法请求 client.executeMethod(method); //返回处理结果 result = method.getResponseBodyAsString(); } catch (HttpException e) { // 发生致命的异常,可能是协议不对或者返回的内容有问题 System.out.println("请检查输入的URL!"); e.printStackTrace(); } catch (IOException e) { // 发生网络异常 System.out.println("发生网络异常!"); e.printStackTrace(); } finally { //释放链接 method.releaseConnection(); //关闭HttpClient实例 if (client != null) { ((SimpleHttpConnectionManager) client.getHttpConnectionManager()).shutdown(); client = null; } } return result; }}
2、在创建一个类,生成验证码,然后传递相应的参数(不同的短信平台接口会有不同的参数要求,这个一般短信平台提供的接口文档中都会有的,直接看文档然后按要求来即可)
/** * 文件说明 * @Description:扩展说明 * @Copyright: XXXX dreamtech.com.cn Inc. All right reserved * @Version: V6.0 */package com.demo.util; import java.net.URLEncoder;import java.util.HashMap;import java.util.Map; /** * @Author: feizi * @Date: XXXX年XX月XX日 XX:XX:XX * @ModifyUser: feizi * @ModifyDate: XXXX年XX月XX日 XX:XX:XX * @Version:V6.0 */public class SendMsgUtil { /** * 发送短信消息 * 方法说明 * @Discription:扩展说明 * @param phones * @param content * @return * @return String * @Author: feizi * @Date: 2015年4月17日 下午7:18:08 * @ModifyUser:feizi * @ModifyDate: 2015年4月17日 下午7:18:08 */ @SuppressWarnings("deprecation") public static String sendMsg(String phones,String content){ //短信接口URL提交地址 String url = "短信接口URL提交地址"; Map<String, String> params = new HashMap<String, String>(); params.put("zh", "用户账号"); params.put("mm", "用户密码"); params.put("dxlbid", "短信类别编号"); params.put("extno", "扩展编号"); //手机号码,多个号码使用英文逗号进行分割 params.put("hm", phones); //将短信内容进行URLEncoder编码 params.put("nr", URLEncoder.encode(content)); return HttpRequestUtil.getRequest(url, params); } /** * 随机生成6位随机验证码 * 方法说明 * @Discription:扩展说明 * @return * @return String * @Author: feizi * @Date: 2015年4月17日 下午7:19:02 * @ModifyUser:feizi * @ModifyDate: 2015年4月17日 下午7:19:02 */ public static String createRandomVcode(){ //验证码 String vcode = ""; for (int i = 0; i < 6; i++) { vcode = vcode + (int)(Math.random() * 9); } return vcode; } /** * 测试 * 方法说明 * @Discription:扩展说明 * @param args * @return void * @Author: feizi * @Date: XXXX年XX月XX日 XX:XX:XX * @ModifyUser:feizi * @ModifyDate: XXXX年XX月XX日 XX:XX:XX */ public static void main(String[] args) {// System.out.println(SendMsgUtil.createRandomVcode());// System.out.println("&ecb=12".substring(1)); System.out.println(sendMsg("18123456789,15123456789", "尊敬的用户,您的验证码为" + SendMsgUtil.createRandomVcode() + ",有效期为60秒,如有疑虑请详询XXX-XXX-XXXX【XXX中心】")); }
然后执行一下,一般的情况下参数传递正确,按照接口文档的规范来操作的话,都会发送成功的,手机都能收到验证码的,然后可能会出现的问题就是:发送的短信内容有可能会出现中文乱码,然后就会发送不成功,按照短信平台的要求进行相应的编码即可。一般都会是UTF-8编码。
Ⅱ java怎么同步发送及异步发送短信例子解析
发送短信的接口
根据自己的情况选择服务商。开发文档
从开发文档中我们可以看到. 可以直接使用http请求也可以使用WebService请求发送短信. 由于DEMO文件夹下的java和jsp文件夹中的代码都是使用http请求发送短信. 所以这里就不再细说了, 我们使用WebService的方式演示发送短信.生成客户端代码
从接口文档中我们知道它的WebService的WSDL的url为:http://106.ihuyi.cn/webservice/sms.php?WSDL那么我们可以执行下面的命令生成客户端代码:
wsimport -keep http://106.ihuyi.cn/webservice/sms.php?WSDL
其中wsimport是JDK自带的工具, -keep url选项是"保留生成的文件". 该命令会在当前目录下生成sms.cn.ihuyi._106包, 以及众多的类. 接下来开始编写我们自己的代码.
定义接口
为了方便, 这里我们首先定义一个接口:
Sms.java
publicinterfaceSms{
/**
*向mobile发送短信,内容为message
*
*@parammobile手机号
*@parammessage短信内容
*@return成功返回-1,否则返回其他值
*/
intsendMessage(Stringmobile,Stringmessage);
}这个接口很简单, 只有一个方法. 这个方法用来发送短信.
同步发送短信
接下来我们首先实现一个同步发送短信的类:
IhuyiSmsImpl.java
{
privateStringaccount;
privateStringpassword;
publicvoidsetAccount(Stringaccount){
this.account=account;
}
publicvoidsetPassword(Stringpassword){
this.password=password;
}
@Override
publicintsendMessage(Stringmobile,Stringmessage){
cn.ihuyi._106.Smsfactory=newcn.ihuyi._106.Sms();
SmsSoapsmsSoap=factory.getSmsSoap();
SubmitResultsubmit=smsSoap.submit(account,password,mobile,message);
intcode=submit.getCode();
if(code==2){
return-1;
}
System.out.println("发送短信失败,code:"+code);
returncode;
}
}异步发送短信
由于发送短信涉及到网络通信, 因此sendMessage方法可能会有一些延迟. 为了改善用户体验, 我们可以使用异步发送短信的方法. 原理很简单: 如果用户请求发送短信, 我们不是直接调用IhuyiSmsImpl的sendMessage方法, 而是将请求保存起来(生产者), 然后告诉用户: 短信发送成功. 之后有若干个消费者取出任务, 调用sendMessage方法发送短信.
这里, 我使用线程池完成上面的任务:
AsyncSmsImpl.java
{
publicSmssendSms;
=Executors.newFixedThreadPool(3);
publicvoidsetSendSms(SmssendSms){
this.sendSms=sendSms;
}
@Override
publicintsendMessage(Stringmobile,Stringmessage){
try{
executorService.submit(()->sendSms.sendMessage(mobile,message));
}
catch(Exceptione){
Sysemt.out.println("提交任务时发生错误"+e);
return0;
}
return-1;
}
publicvoiddestroy(){
try{
executorService.shutdown();
}
catch(Exceptione){}
}
}在第17行, 我们获得远程对象的一个代理对象. 之后就可以通过这个代理对象进行发送短信, 查询账户余额等操作.
第18行, 使用该代理对象的submit方法提交了短信内容. 该方法的参数信息及返回值含义在接口文档中有详细的说明.
第19行我们获得了结果的状态码. 根据文档上的说明, 状态码为2说明提交成功. 简单起见, 这里我们只关注提交成功的情况. 需要注意的是, 状态码为2只是说明提交成功. 根据官网上的"3-5秒内响应、100%到达", 我们可以推测. 如果提交成功, 那么基本上3-5秒内,短信就会发送成功, 根据用户的网络情况, 可能稍有延迟用户就可以收到短信.
使用这段代码发送短信也很简单, 直接new一个对象, 设置好账号和密码就可以发送短信了.
代码很简单, 直接将Sms接口的sendMessage(mobile, message)方法作为一个任务加到线程池的任务队列中. 这样等到有空闲线程时, 就会执行sendSms.sendMessage(mobile, message)发送短信. 这里我们假设只要保存到线程池就可以成功发送短信. 因为发送失败的情况实际上很罕见.
Ⅲ 如何用Java实现短信自动发送功能
Java实现短信自动发送功能主要是用httpclient实现的,要有发短信的端口。
1、硬件设备是一个3G网卡;
2、软件方面需要sun提过的java底层通信common包;
3、此外还需要第三方库SMSLib,这个是开源项目,主要用于实现java发短信的功能;
主要代码如下:
HttpClientclient=newHttpClient();
PostMethodpost=newPostMethod(
"http://cf.lmobile.cn/submitdata/service.asmx/g_Submit");
post.addRequestHeader("Content-Type",
"application/x-www-form-urlencoded;charset=utf-8");//在头文件中设置转码
NameValuePair[]data={newNameValuePair("sname","*****"),
newNameValuePair("spwd","*****"),
newNameValuePair("scorpid","*****"),
newNameValuePair("sprdid","*****"),
newNameValuePair("sdst","*****"),
newNameValuePair("smsg","*****")};
post.setRequestBody(data);
client.executeMethod(post);
Header[]headers=post.getResponseHeaders();
intstatusCode=post.getStatusCode();
System.out.println("statusCode:"+statusCode);
for(Headerh:headers){
System.out.println(h.toString());
}
Stringresult=newString(post.getResponseBodyAsString().getBytes("utf-8"));
System.out.println(result);
post.releaseConnection();
Ⅳ java 异步发送短信,异步怎么实现
java 异步发送短信,异步实现:
1,使用spring框架的异步注解 @Async ,底层应该是一个线程。
2,简单粗暴的方式:开一个线程
new Thread(new Runnable() {
public void run() {
//发送短信
}
}).start();
当然也可以高级一点,使用线程池。
3,更高端一点:使用消息队列MQ
Ⅳ Java怎样实现短信发送与接收
Java实现短信发送与接收
/**
*@Authordengsilinming
*@Date2012-9-18
*
*/
packagecom.dengsilinming.mail;
importjava.io.IOException;
importorg.apache.commons.httpclient.Header;
importorg.apache.commons.httpclient.HttpClient;
importorg.apache.commons.httpclient.HttpException;
importorg.apache.commons.httpclient.NameValuePair;
importorg.apache.commons.httpclient.methods.PostMethod;
publicclassSendMsg_webchinese{
/**
*@authordengsilinming
*@dateSep18,2012
*@time9:38:25AM
*@paramargs
*@throwsIOException
*@throwsHttpException
*@description
*/
publicstaticvoidmain(String[]args)throwsHttpException,IOException{
HttpClientclient=newHttpClient();
PostMethodpost=newPostMethod("http://gbk.sms.webchinese.cn");
//PostMethodpost=newPostMethod("http://sms.webchinese.cn/web_api/");
post.addRequestHeader("Content-Type",
"application/x-www-form-urlencoded;charset=gbk");//在头文件中设置转码
NameValuePair[]data={newNameValuePair("Uid","dengsilinming"),//注册的用户名
newNameValuePair("Key","72da78da5ff54f450505"),//注册成功后,登录网站后得到的密钥
newNameValuePair("smsMob","12345678900"),//手机号码
newNameValuePair("smsText","这是专用于测试的信息,能否正常发短信呢?")};//短信内容
post.setRequestBody(data);
client.executeMethod(post);
Header[]headers=post.getResponseHeaders();
intstatusCode=post.getStatusCode();
System.out.println("statusCode:"+statusCode);
for(Headerh:headers){
System.out.println("---"+h.toString());
}
Stringresult=newString(post.getResponseBodyAsString().getBytes(
"gbk"));
System.out.println(result);
}
}
Ⅵ 如何用JAVA实现发送手机短信
1.通过移动或联通短信网关发送短信,这需要通信服务商给你开通短信端口,发送短信协议各个服务商都不一样,比如移动的是cmpp2,cmpp3等
2.第二种是通过硬件设备发送短信,这个需要你有专门的硬件设备,比如一个上网卡或者一个手机模块,通过调用com遵从一些协议发送短信
单纯靠写代码是无法发短信的,至少要有一个WEBSERVICE接口或者硬件接口。
Ⅶ 如何用java实现,定时发送短信息
以前在远标学过Java实现短信自动发送功能主要是用httpclient实现的,要有发短信的端口。
1、硬件设备是一个3G网卡;
2、软件方面需要sun提过的java底层通信common包;
3、此外还需要第三方库SMSLib,这个是开源项目,主要用于实现java发短信的功能;
Ⅷ java发送手机短信
你是什么需求,如果是要用户注册发验证码这类,只能找短信发送的通讯类公司了;如果你是想给自己发,比如程序跑完了提醒你看结果,程序遇到异常提醒你处理之类,可以用“喵提醒”这类服务。但是无论如何,天下没有免费的午餐,发短信肯定要费用,除非你是用喵提醒的公众号文字提醒这类就可以不需要费用。
Ⅸ 用java发送手机短信,我想知道有几种途径,各自的优缺点,求大虾指点、
可以通过服务商的短信接口实现发送短信。这个比较容易。一般花钱买短信发送数目后,服务商会给你接口文档和开发包。照着调用接口就行。
优点 开物桐发容易 发送数目无限制 价格便宜
缺点 短信有时延时严重 有的短信发送后丢失
也可缺蚂吵以用GSMmodem或GMS猫池发送,原理和用手机发送短信相同。买猫或猫池时人家会给你接口文档,剩下的就伏侍是自己开发。这种方法需要了解的东西比较多。包括java和硬件的通讯。
优点 短信到达快 短信一般不会丢失
缺点 开发比较麻烦 运营商对发送数目有限制(超过一定数目就不让发了) 价格较高
Ⅹ 如何用Java实现短信自动发送功能
方法一:
1.web.xml中配置listener
<listener>
<listener-class>
cn.com.jxlife.shs.web.action.csinquiry.surrender.MyListener
</listener-class>
</listener>
2.创建listener
import java.util.Timer;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyListener implements ServletContextListener {
private Timer timer = null;
@Override
public void contextInitialized(ServletContextEvent sce) {
timer = new Timer(true);
//设置任务计划,启动和间隔时间
timer.schele(new MyTask(), 0, 3*60*1000);
//3分钟
//timer.schele(new MyTask(), 0, 3*60*1000);
//在1秒后执行此任务,每次间隔2秒
//timer.schele(new MyTask(), 1000, 2000);
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
timer.cancel();
}
}
3.创建启动的类MyTask
import java.util.Date;
import java.util.TimerTask;
public class MyTask extends TimerTask {
@Override
public void run() {
System.out.println("call at " + (new Date()));
}
}
方法二:
spring 下实现定时工作的调度框架quartz
· 1。从http://quartz-scheler.org/下载quartz的开源包
quartz-1.7.3.tar.gz
3.07M
· 2。从quartz-1.7.3.tar.gz 找到quartz-1.7.3.jar,放到项目的classpath下
(放到webroot/WEB-INF/lib)下
· 3。定义一个需要时间调度的程序
package com.machome.quartz;
public class CustomJob1 {
public void onTimeWork() {
System.out.println("数据备份任务启动");
System.out.println("...");
System.out.println("数据备份任务完成");
}
}
· 4。剩余的工作就都在spring xml文件里完成了
<!-- 被调度的bean -->
<bean id="job1" class="com.machome.quartz.CustomJob1"></bean>
<!-- 定义任务对象 -->
<bean id="jobtask1"
class="org.springframework.scheling.quartz.">
<!-- 被调度的bean -->
<property name="targetObject">
<ref bean="job1" />
</property>
<!-- 被调度的bean中的被调度的方法 -->
<property name="targetMethod">
<value>onTimeWork</value>
</property>
</bean>
<!-- 定义触发对象 -->
<bean id="trigger1"
class="org.springframework.scheling.quartz.CronTriggerBean">
<!-- 任务对象 -->
<property name="jobDetail">
<ref bean="jobtask1" />
</property>
<!-- cron表达式 -->
<property name="cronExpression">
<value>10,15,20,25,30,35,40,45,50,55 * * * * ?</value>
</property>
</bean>
<!-- 调度对象 -->
<!-- 如果将lazy-init='false'那么容器启动就会执行调度程序 -->
<bean id="scheler" lazy-init="false"
class="org.springframework.scheling.quartz.SchelerFactoryBean">
<!-- 触发对象 -->
<property name="triggers">
<list>
<ref bean="trigger1" />
</list>
</property>
</bean>
· 5。 将spring 项目部署到TOMCAT或JBOSS服务器上
deploy项目
重启TOMCAT server
· 6。看结果:
cron表达式参考:Quartz的cron表达式