This is a Prosody module to map JIDs to DIDs on VoIP.ms and support sending/receiving SMS/MMS.
Once configured, users receiving SMS messages to their DID numbers will receive an XMPP message from their server with the message content and may send SMS by repling directly to these messages or by crafting similar destination JIDs.
For this to work, the following are required through VoIP.ms:
option | type | default | description |
---|---|---|---|
voipms_api_username | string | nil | E-mail address used at voip.ms |
voipms_api_password | string | nil | API password (not login password) |
voipms_query_key | string | nil | Key to secure service (part of webhook) |
voipms_jid_map | table | nil | JID -> DIDs mapping |
The voipms_api_username
and
voip_api_password
are specific to the VoIP.ms account and
may be set or configured through the VoIP.ms web site, through the API Configuration.
The voipms_query_key
is a token or secret that you
create in your local prosody module configuration and include later in
the Webhook on the VoIP.ms web site.
The voipms_jid_map
is a local mapping of DIDs owned by
the account described by voipms_api_username
and the local
XMPP accounts to which messages from those numbers will be sent or
received. This is used in the incoming XMPP message’s JID for messages
received and is used as the sending number when replying to SMS messages
received by that JID.
Sample module configuration:
VirtualHost "sms.example.com"
modules_enabled = {
"voipms";
}
voipms_api_username = john@example.com
voipms_api_password = abcd1234
voipms_query_key = some_query_key
voipms_jid_map = {
["your_jid@your_domain.com"] = { "+10234567890" },
["your_jid2@your_domain.com"] = { "+10123456789", "+10573647583" }
}
The module is served on Prosody’s default HTTP ports at the path
/voipms
. More details on configuring HTTP modules in
Prosody can be found in the HTTP documentation.
This module receives the VoIP.ms Webhook URL (POST) at the /voipms endpoint. It uses the sendSMS/sendMMS GET methods against the VoIP.ms APIs. This is an example webhook to use in VoIP.ms:
https://sms.example.com/voipms?key=some_query_key
Long API passwords can result in
voipms: Failed to send sendSMS: invalid_credentials
despite
being correct. This was witnessed in using an obnoxiously long password
(>128 characters). It may be necessary to use less than 32
characters, but no extensive testing was done.
If your Prosody configuration is only exposing the defualt ports, it may be necessary to include the port number in the Webhook URL:
https://sms.example.com:5281/voipms?key=some_query_key
If messages are being recieved but you are unable to reply or send
SMS messages, double check that the IP address or host name of the
Prosody server is in the list of IP addresses allowed to call the API.
See Enable IP Adresess
in the API Configuration. Separate
multiple addresses with commas. Ranges of IPs are also supported.
If there are problems sending messages from Prosody to SMS numbers, you can test the pieces standalone using bash and curl, for example:
endpoint="https://voip.ms/api/v1/rest.php"
method='sendSMS'
body='test message'
curl -G "${endpoint}" \
--data-urlencode "api_username=${api_username}" \
--data-urlencode "api_password=${api_password}" \
--data-urlencode "method=${method}" \
--data-urlencode "did=${from_number}" \
--data-urlencode "dst=${dst_number}" \
--data-urlencode "message=${body}"
Note: Make sure to set values for api_username
,
api_password
, from_number
, and
dst_number
.
This is a quick way to diagnose authentication or account issues in communicating with VoIP.ms but make sure the system making the call is in the allowed IP list and to provide the other details needed.
If there are problems in receiving SMS messages via Prosody, check
the Webhook URI value to make sure the same value is provided there for
the key as is provided in the module coniguration
voipms_query_key
. Also check that the port used in the
Webhook API is the correct port. A default installation will need port
5281 specified explicitly. Common setups that make use of port 80 or 443
will not need to specify a port.
If after enabling the module the Upload HTTP or HTTP File Share
plugins stop allowing uploads, set an explicit virutal host entry for
the module in question directly in the component section of the
prosody.cfg.lua
, for example:
Component "upload.example.com" "http_file_share"
http_paths = {
file_share = "/"
}
With the plugin installer in Prosody 0.12 you can use:
sudo prosodyctl install --server=https://modules.prosody.im/rocks/ mod_voipms
For earlier versions see the documentation for installing 3rd party modules