如何用Java发送短信

什么是从Java应用程序发送和接收短信的可能方法?

注:我期待着一个可能的方式列表。 还有你对每个人的看法,哪个更好/怎么样?

看看Simplewire Java SMS软件开发工具包

使用Ozeki Java SMS SDK从Java发送和接收SMS

如果你只想要简单的通知,许多运营商通过电子邮件支持短信; 通过电子邮件查看短信

(免责声明:我在Twilio工作)

Twilio提供了一个用于通过Twilio REST API发送SMS 的Java SDK 。

我在Java中看到的最好的SMS API是JSMPP。 它function强大,易于使用,我自己用于企业级应用程序(每天发送超过20K条SMS消息)。

创build此API以减less现有SMPP API的冗长性。 它隐藏了低层协议通信的复杂性,如自动查询链接请求响应,使用起来非常简单易用。

我尝试了一些其他的API,例如Ozeki,但是其中大多数都是商业的,或者在吞吐量方面有限制(例如,一秒钟内不能发送超过3条SMS消息)。

有一个称为SMSLib的API,它真的很棒。 http://smslib.org/

编辑:

现在你有很多Saas提供者可以使用API​​来为你提供这个服务

例如:mailchimp,esendex …

您可以使用Nexmo 发送短信以及接收短信 。

使用Nexmo Java库发送SMS非常简单。 在创build一个新帐户 ,租用一个虚拟号码,并获得您的API密钥和秘密后,您可以使用该库发送短信,如下所示:

public class SendSMS { public static void main(String[] args) throws Exception { AuthMethod auth = new TokenAuthMethod(API_KEY, API_SECRET); NexmoClient client = new NexmoClient(auth); TextMessage message = new TextMessage(FROM_NUMBER, TO_NUMBER, "Hello from Nexmo!"); //There may be more than one response if the SMS sent is more than 160 characters. SmsSubmissionResult[] responses = client.getSmsClient().submitMessage(message); for (SmsSubmissionResult response : responses) { System.out.println(response); } } } 

要收到短信,你需要build立一个服务器,消耗一个webhook。 这也相当简单。 我build议查看我们的教程接收与Java的短信 。

披露:我为Nexmo工作

您可以通过GSM调制解调器和Java通信API进行此操作[试验和testing]

  1. 首先你需要设置Java Comm Api

    本文详细介绍如何设置通信Api

  2. 接下来你需要一个GSM调制解调器(最好是SIM900模块)

  3. Java JDK最新版本更好

  4. AT命令指南

    包装样品;

      import java.io.*; import java.util.*; import gnu.io.*; import java.io.*; import org.apache.log4j.chainsaw.Main; import sun.audio.*; public class GSMConnect implements SerialPortEventListener, CommPortOwnershipListener { private static String comPort = "COM6"; // This COM Port must be connect with GSM Modem or your mobile phone private String messageString = ""; private CommPortIdentifier portId = null; private Enumeration portList; private InputStream inputStream = null; private OutputStream outputStream = null; private SerialPort serialPort; String readBufferTrial = ""; /** Creates a new instance of GSMConnect */ public GSMConnect(String comm) { this.comPort = comm; } public boolean init() { portList = CommPortIdentifier.getPortIdentifiers(); while (portList.hasMoreElements()) { portId = (CommPortIdentifier) portList.nextElement(); if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { if (portId.getName().equals(comPort)) { System.out.println("Got PortName"); return true; } } } return false; } public void checkStatus() { send("AT+CREG?\r\n"); } public void send(String cmd) { try { outputStream.write(cmd.getBytes()); } catch (IOException e) { e.printStackTrace(); } } public void sendMessage(String phoneNumber, String message) { char quotes ='"'; send("AT+CMGS="+quotes + phoneNumber +quotes+ "\r\n"); try { Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } // send("AT+CMGS=\""+ phoneNumber +"\"\r\n"); send(message + '\032'); System.out.println("Message Sent"); } public void hangup() { send("ATH\r\n"); } public void connect() throws NullPointerException { if (portId != null) { try { portId.addPortOwnershipListener(this); serialPort = (SerialPort) portId.open("MobileGateWay", 2000); serialPort.setSerialPortParams(115200,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE); } catch (PortInUseException | UnsupportedCommOperationException e) { e.printStackTrace(); } try { inputStream = serialPort.getInputStream(); outputStream = serialPort.getOutputStream(); } catch (IOException e) { e.printStackTrace(); } try { /** These are the events we want to know about*/ serialPort.addEventListener(this); serialPort.notifyOnDataAvailable(true); serialPort.notifyOnRingIndicator(true); } catch (TooManyListenersException e) { e.printStackTrace(); } //Register to home network of sim card send("ATZ\r\n"); } else { throw new NullPointerException("COM Port not found!!"); } } public void serialEvent(SerialPortEvent serialPortEvent) { switch (serialPortEvent.getEventType()) { case SerialPortEvent.BI: case SerialPortEvent.OE: case SerialPortEvent.FE: case SerialPortEvent.PE: case SerialPortEvent.CD: case SerialPortEvent.CTS: case SerialPortEvent.DSR: case SerialPortEvent.RI: case SerialPortEvent.OUTPUT_BUFFER_EMPTY: case SerialPortEvent.DATA_AVAILABLE: byte[] readBuffer = new byte[2048]; try { while (inputStream.available() > 0) { int numBytes = inputStream.read(readBuffer); System.out.print(numBytes); if((readBuffer.toString()).contains("RING")){ System.out.println("Enter Inside if RING Loop"); } } System.out.print(new String(readBuffer)); } catch (IOException e) { } break; } } public void outCommand(){ System.out.print(readBufferTrial); } public void ownershipChange(int type) { switch (type) { case CommPortOwnershipListener.PORT_UNOWNED: System.out.println(portId.getName() + ": PORT_UNOWNED"); break; case CommPortOwnershipListener.PORT_OWNED: System.out.println(portId.getName() + ": PORT_OWNED"); break; case CommPortOwnershipListener.PORT_OWNERSHIP_REQUESTED: System.out.println(portId.getName() + ": PORT_INUSED"); break; } } public void closePort(){ serialPort.close(); } public static void main(String args[]) { GSMConnect gsm = new GSMConnect(comPort); if (gsm.init()) { try { System.out.println("Initialization Success"); gsm.connect(); Thread.sleep(5000); gsm.checkStatus(); Thread.sleep(5000); gsm.sendMessage("+91XXXXXXXX", "Trial Success"); Thread.sleep(1000); gsm.hangup(); Thread.sleep(1000); gsm.closePort(); gsm.outCommand(); System.exit(1); } catch (Exception e) { e.printStackTrace(); } } else { System.out.println("Can't init this card"); } } } 

TextMarks允许您访问其共享简码,通过API从您的应用程序发送和接收文本消息。 消息来自/ 41411(而不是像一个随机电话#和不同的电子邮件网关,你有160个字符的全部工作)。

您还可以告诉人们将您的关键字文字41411调用您的应用程序中的各种function。 有一个JAVA API客户端以及其他几种stream行的语言和非常全面的文档和技术支持。

对于仍在testing和开发应用程序的开发人员,14天免费试用版可以轻松扩展。

看看这里: TextMarks API信息

您可以使用LOGICA SMPP Java API来发送和接收Java应用程序中的SMS。 LOGICA SMPP在电信应用方面已经得到了充分certificate。 Logica API还为您提供TCP / IP连接上的信号传输。

您可以直接与世界各地的电信运营商进行整合。

有两种方法:第一:使用你需要付费的短信API网关,也许你会发现一些试用,甚至免费的,但是很less。 第二:使用连接到笔记本电脑的调制解调器GSM使用AT命令。 就这样

这取决于你如何去工作以及你的提供者是谁。

如果你使用sms-gateway公司,你可能会通过SMPP协议(3.4仍然是最常见的),然后看看OpenSMPP和jSMPP。 这些function强大的库与SMPP一起工作。

如果要使用自己的硬件(使用gsm调制解调器),发送消息的最简单的方法是通过AT命令,它们的不同取决于型号,所以,您应该了解您的调制解调器支持哪些AT命令。 接下来,如果您的调制解调器有一个IP并且可以连接,您可以通过java套接字发送命令

 Socket smppSocket = new Socket("YOUR_MODEM_IP", YOUR_MODEM_PORT); DataOutputStream os = new DataOutputStream(smppSocket.getOutputStream()); DataInputStream is = new DataInputStream(smppSocket.getInputStream()); os.write(some_byte_array[]); is.readLine(); 

否则,您将通过COM端口工作,但方法相同(发送AT命令),您可以在此处find有关如何使用串行端口的更多信息。

OMK.smpp。 API。 它是基于SMPP和模拟器也是免费的

LOGICA SMPP API。

另一个select是Kannel免费的WAP和SMS网关。

我build议像Twilio这样的基于云的解决scheme。 基于云计算的解决scheme比内部解决scheme更具成本效益,因为不需要进行持续的维护。 通过电子邮件短信是不是一个优雅的解决scheme,因为你必须从用户获得载体信息,你永远不能确定,你可以文字的所有手机号码。 我在我的web应用程序中使用twilio java api,从serverside发送短信。 在几分钟之内,你可以与你的应用程序集成。

https://www.twilio.com/docs/java/install

以下是从文档发送SMS消息的示例:

 import com.twilio.sdk.TwilioRestClient; import com.twilio.sdk.TwilioRestException; import com.twilio.sdk.resource.factory.MessageFactory; import com.twilio.sdk.resource.instance.Message; import org.apache.http.NameValuePair; import org.apache.http.message.BasicNameValuePair; import java.util.ArrayList; import java.util.List; public class Example { // Find your Account Sid and Token at twilio.com/user/account public static final String ACCOUNT_SID = "{{ account_sid }}"; public static final String AUTH_TOKEN = "{{ auth_token }}"; public static void main(String[] args) throws TwilioRestException { TwilioRestClient client = new TwilioRestClient(ACCOUNT_SID, AUTH_TOKEN); // Build a filter for the MessageList List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("Body", "Test Twilio message")); params.add(new BasicNameValuePair("To", "+14159352345")); params.add(new BasicNameValuePair("From", "+14158141829")); MessageFactory messageFactory = client.getAccount().getMessageFactory(); Message message = messageFactory.create(params); System.out.println(message.getSid()); } } 

smslib是非常有用的这个目的,你可以连接一个调制解调器与您的电脑,并使用这个lib发送短信。 它用起来,我用它

我们也很喜欢Wavecell中的 Java,但是这个问题可以在没有特定语言的细节的情况下被回答,因为我们有一个REST API ,它将覆盖大部分需求:

 curl -X "POST" https://api.wavecell.com/sms/v1/amazing_hq/single \ -u amazing:1234512345 \ -H "Content-Type: application/json" \ -d $'{ "source": "AmazingDev", "destination": "+6512345678", "text": "Hello, World!" }' 

如果您在使用Java发送HTTP请求时遇到问题,请查看以下问题:

  • 在Java中使用JSON的HTTP POST
  • 我怎样才能发送JSON对象在HTTP后在Java中

对于特定的情况,你也可以考虑使用SMPP API,并且已经提到的JSMPP库将会对此有所帮助。

您可以使用AT&T命令使用GSM调制解调器发送短信。