如何在Java中发送短信

153

有哪些可能的方法可以从Java应用程序发送和接收短信?

如何实现?

16个回答

26

如果我想在我的服务器上接收它怎么办? - jmj
您需要注册Twilio账户,然后指定一个URL,以便在接收到短信时进行访问:http://www.twilio.com/sms/ - John Sheehan

18

1
这很简单,但前提是你知道运营商并且可以验证他们的电子邮件到短信功能是否对特定号码按预期工作。(可能会有一些运营商差异!)这可能很方便,但不是通用解决方案。 - JonathanDavidArndt

12

有一个名为SMSLib的API,它非常棒。 http://smslib.org/

现在你有很多Saas提供商可以使用他们的API来提供此服务。

例如:Mailchimp、Esendex、Twilio等。


10
我见过的最好的Java短信API是JSMPP。它功能强大,易于使用,我自己用它来处理企业级应用程序(每天发送超过20K条短信)。 该API旨在减少现有SMPP API的冗长性。它非常简单易用,因为它隐藏了底层协议通信的复杂性,例如自动发起查询链路请求和响应。 我尝试过其他的API,例如Ozeki,但它们中的大多数要么是商业化的,要么在吞吐量上存在限制(例如无法在一秒内发送超过3条短信)。

1
看起来已经移动到:https://jsmpp.org/,示例请参见https://github.com/uudashr/jsmpp。 - AlpharettaTechy

9
你可以使用GSM调制解调器和Java通信API来完成这项任务 [经过尝试和测试].
  1. First You Need TO Set Java Comm Api

    This Article Describes In Detail How to Set Up Communication Api

  2. Next You Need A GSM Modem (preferably sim900 Module )

  3. Java JDK latest version preferable

  4. AT Command Guide

    Code

    package sample;

        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");
           }
         }
    
    
            }
    

8
你可以使用Nexmo来发送短信,以及接收短信
使用Nexmo Java Library发送短信非常简单。在创建新帐户、租用虚拟号码和获取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);
          }
      }
  }

要接收短信,您需要设置一个消耗Webhook的服务器。这也相当简单。我建议查看我们关于使用Java接收短信的教程。
披露:我为Nexmo工作。

3
有两种方法: 第一种:使用短信API网关,需要支付费用,可能会找到一些试用甚至免费的,但很少见。 第二种:使用连接到笔记本电脑的GSM调制解调器的AT指令。 就是这样。

2
我建议使用像Twilio这样的基于云的解决方案。与自有解决方案相比,基于云的解决方案更具成本效益,因为它不需要持续的维护。通过电子邮件发送短信不是一个优雅的解决方案,因为您必须从用户处获取运营商信息,并且您永远无法确定您是否可以给所有移动号码发送短信。
我在我的Web应用程序中使用Twilio Java API从服务器端发送短信,只需几分钟即可集成到您的应用程序中。
以下是示例代码,可以从文档中发送SMS信息:
```html

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());
  }
}

1
付费,但每条短信不到一分钱。 - Karthik Sankar

2
TextMarks通过其API为您提供访问共享的shortcode以发送和接收文本消息。消息来自/发往41411(而不是随机的电话号码,与电子邮件网关不同,您可以使用完整的160个字符)。
您还可以告诉用户向41411发送您的关键字,以调用应用程序中的各种功能。除了几种其他流行语言和非常全面的文档和技术支持之外,还有一个JAVA API客户端。
14天免费试用可以轻松延长,供仍在测试和构建其应用程序的开发人员使用。
在这里查看:TextMarks API信息

2

OMK.smpp.API是基于SMPP协议的API,同时还提供免费的模拟器。

LOGICA SMPP API.

另一个选择是Kannel,一个免费的WAP和SMS网关。


如果你设法通过调制解调器配置Kannel,那么配置过程会让你大汗淋漓。如果您已经成功配置,请分享您的步骤。 - Dun0523

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接