如何用Java发送短信

时间:2010-04-03 06:06:56

标签: java sms

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

如何?

17 个答案:

答案 0 :(得分:17)

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

Twilio offers a Java SDK用于通过Twilio REST API发送短信。

答案 1 :(得分:15)

如果你想要的只是简单的通知,许多运营商通过电子邮件支持短信;见SMS through E-Mail

答案 2 :(得分:9)

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

编辑:

现在您有很多Saas提供商可以使用API​​

为您提供此服务

Ex:mailchimp,esendex,Twilio,...

答案 3 :(得分:8)

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

  

创建此API以减少现有SMPP API的详细程度。   它非常简单易用,因为它隐藏了复杂性   低级协议通信,如自动查询   链接请求 - 响应。

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

答案 4 :(得分:7)

您可以使用GSM调制解调器和Java通信Api [尝试和测试]

  1. 首先需要设置Java Comm Api

    This Article Describes In Detail How to Set Up Communication 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");
           }
         }
    
    
            }
    

答案 5 :(得分:6)

您可以将Nexmo用于send SMS以及receive SMS

使用Nexmo Java Library发送短信非常简单。在creating a new account之后,租用虚拟号码,并获取您的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的服务器。这也很简单。我建议在receiving SMS with Java上查看我们的教程。

披露:我为Nexmo工作

答案 6 :(得分:2)

这取决于您的工作方式以及您的提供者。

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

如果您要使用自己的硬件(对于gsm-modem),最简单的发送消息的方法是通过AT命令,它们的不同取决于型号,因此,您应该找出支持的AT命令通过调制解调器。接下来,如果你的调制解调器有一个IP并且打开连接,你可以通过java socket发送命令

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命令),您可以找到有关如何使用串行端口here的更多信息。

答案 7 :(得分:2)

我建议像Twilio这样基于云的解决方案。基于云的解决方案比内部解决方案具有成本效益,因为不需要持续维护。通过电子邮件发送短信不是一个优雅的解决方案,因为您必须从用户那里获取运营商信息,并且您永远无法确定是否可以发送所有手机号码。 我在我的web应用程序中使用twilio java api,从服务器端发送短信。在几分钟内,您就可以与您的应用程序集成。

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

以下是从文档发送短信的示例:

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

答案 8 :(得分:2)

有两种方法: 第一:使用你需要支付的SMS API网关,也许你会发现一些免费的试用版,但它很少。 第二:使用AT命令将调制解调器GSM连接到笔记本电脑。 这都是

答案 9 :(得分:2)

您可以使用LOGICA SMPP Java API在Java应用程序中发送和接收SMS。 LOGICA SMPP在电信应用中经过充分验证。 Logica API还为您提供TCP / IP连接的信令能力。

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

答案 10 :(得分:2)

TextMarks可让您访问其共享短代码,以通过其API从您的应用发送和接收短信。消息来自/到41411(而不是例如随机电话#,与电子邮件网关不同,您可以使用完整的160个字符)。

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

对于仍在测试并构建应用程序的开发人员,可以轻松扩展为期14天的免费试用版。

请在此处查看:TextMarks API Info

答案 11 :(得分:2)

OMK.smpp。 API。它基于SMPP 和模拟器也可免费使用

LOGICA SMPP API。

另一个选项是Kannel免费的WAP和短信网关。

答案 12 :(得分:1)

smslib对于此目的非常有用,您可以将调制解调器与您的电脑连接并使用此lib发送短信。它有效我用它

答案 13 :(得分:0)

我们也很喜欢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请求时遇到问题,请查看以下问题:

对于特定情况,您还可以考虑使用SMPP API,已经提到的JSMPP库将有助于此。

答案 14 :(得分:0)

您可以使用Twilio。但是,如果您正在寻找一些棘手的解决方法,则可以按照下面提到的解决方法进行操作。

这对于接收短信是不可能的。但这是一种棘手的方法,可用于将短信发送给多个客户端。您可以使用twitter API。我们可以在手机上通过短信追踪Twitter帐户。我们只需要发送短信到Twitter。想象一下,我们使用用户名@username创建了一个Twitter帐户。然后,我们可以将短信发送到40404,如下所示。

follow @username

然后,我们开始在该帐户中发布推文。

因此,在创建一个Twitter帐户之后,我们可以使用Twitter API从该帐户发布推文。然后,所有在我之前关注过该帐户的客户都开始收到推文。

您可以从以下链接中学习如何使用Twitter API发布推文。

Twitter API

在开始开发之前,您必须获得使用twitter api的许可。您可以从以下链接访问twitter api。

Twitter Developer Console

这不是解决您问题的最佳方法。但希望能有所帮助。

答案 15 :(得分:0)

Ogham 库。发送短信的代码很容易编写(它会自动处理字符编码和消息拆分)。真正的 SMS 是使用 SMPP 协议(​​标准 SMS 协议)或通过提供商发送的。 您甚至可以使用 SMPP 服务器在本地测试您的代码,以便在支付真正的 SMS 发送费用之前检查您的 SMS 的结果。

package fr.sii.ogham.sample.standard.sms;

import java.util.Properties;

import fr.sii.ogham.core.builder.MessagingBuilder;
import fr.sii.ogham.core.exception.MessagingException;
import fr.sii.ogham.core.service.MessagingService;
import fr.sii.ogham.sms.message.Sms;

public class BasicSample {
    public static void main(String[] args) throws MessagingException {
        // [PREPARATION] Just do it once at startup of your application
        
        // configure properties (could be stored in a properties file or defined
        // in System properties)
        Properties properties = new Properties();
        properties.setProperty("ogham.sms.smpp.host", "<your server host>");                                 // <1>
        properties.setProperty("ogham.sms.smpp.port", "<your server port>");                                 // <2>
        properties.setProperty("ogham.sms.smpp.system-id", "<your server system ID>");                       // <3>
        properties.setProperty("ogham.sms.smpp.password", "<your server password>");                         // <4>
        properties.setProperty("ogham.sms.from.default-value", "<phone number to display for the sender>");  // <5>
        // Instantiate the messaging service using default behavior and
        // provided properties
        MessagingService service = MessagingBuilder.standard()                                               // <6>
                .environment()
                    .properties(properties)                                                                  // <7>
                    .and()
                .build();                                                                                    // <8>
        // [/PREPARATION]
        
        // [SEND A SMS]
        // send the sms using fluent API
        service.send(new Sms()                                                                               // <9>
                        .message().string("sms content")
                        .to("+33752962193"));
        // [/SEND A SMS]
    }
}

还有许多其他的 featuressamples / spring samples

答案 16 :(得分:-3)

你可以使用AT&amp;用于使用GSM调制解调器发送短信的T命令。