SMSLib 是成熟的 Java 簡訊庫,支援透過 GSM Modem(短信貓)、SMPP、HTTP 等閘道發送/接收簡訊。本文以串口模式為例,說明環境配置、核心程式碼與常見坑點。
smslib-v3.3.0.jar(或較新版)、comm.jar (JavaComm)、log4j-1.2.x.jar。javax.comm.properties 放入 `win32com.dll 放入 `comm.jar 放入 `import org.smslib.*;
import org.smslib.modem.SerialModemGateway;
public class SmsSender {
public void sendSms(String phoneNumbers, String content) {
Service service = Service.getInstance();
// 設定串口閘道
SerialModemGateway gateway = new SerialModemGateway(
"modem.com3", "COM3", 9600, "Wavecom", ""); // 製造商/型號可留空
gateway.setInbound(true); // 接收
gateway.setOutbound(true); // 發送
gateway.setSimPin("0000"); // SIM PIN,無則空字串
gateway.setOutboundNotification(new OutboundNotification() {
@Override public void process(String gatewayId, OutboundMessage msg) {
System.out.println("已發送:" + msg.getRecipient() + " - " + msg.getText());
}
});
service.addGateway(gateway);
try {
service.startService();
System.out.println("服務啟動成功");
String[] phones = phoneNumbers.split(",");
for (String phone : phones) {
OutboundMessage msg = new OutboundMessage(phone.trim(), content);
msg.setEncoding(Message.MessageEncodings.ENCUCS2); // 中文需 UCS2
service.sendMessage(msg);
System.out.println("發送給 " + phone + " 成功");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
service.stopService();
}
}
public static void main(String[] args) {
new SmsSender().sendSms("0912345678,0923456789", "測試簡訊內容");
}
}
| 現象 | 可能原因 | 解決 |
|---|---|---|
| UnsatisfiedLinkError: no rxtxSerial | 缺少 win32com.dll / librxtxSerial.so | 確認 DLL/so 放在正確路徑 (jre/bin 或 -Djava.library.path) |
| CommPortIdentifier: no ports found | javax.comm.properties 內容錯誤 | 檔案內容應為:Driver=com.sun.comm.Win32Driver |
| 發送失敗 CMS ERROR: 304 | SIM 卡未就緒/欠費/訊號差 | 用終端機 (PuTTY) 發 AT 指令測試:AT+CPIN? / AT+CSQ |
| 中文亂碼 | 編碼未設為 UCS2 | msg.setEncoding(MessageEncodings.ENCUCS2) |