If you look into received 403 response, you'll notice a Reason header. The Q.850 string at the beginning indicates that this would be a cause code defined by ITU-T Recomendation.
Specifically, provided cause code 55 is related to ISDN and literary means "Incoming calls barred within Closed User Group" (you can check it in RFC 3398) and, usually, means that, within a group of members, call reception is restricted.
On the other hand, cause 55 also denotes a problem within the request, specially in relation to a user (sender or receiver). Following diagram shows a normal MESSAGE exchange between SIP users:
A Server B
| REGISTER | |
|--------------->| |
| 200 OK | |
|<---------------| |
| | REGISTER |
| |<--------------|
| | 200 OK |
| |-------------->|
| MESSAGE | |
|--------------->| MESSAGE |
| |-------------->|
| | 200 OK |
| |<--------------|
| 200 OK | |
|<---------------| |
Actually, been strict, REGISTER from user A is not needed but most systems (like IMS) uses it as an authentication mechanism. Then, in REGISTER request, special headers are:
Contact: <sip:USER_NAME@LOCAL_IP:LOCAL_PORT>
Expires: REGISTRATION_DURATION
Keep in mind that, 200 OK answers to a REGISTER, can contain an Expires:
header or an expires
parameter inside Contact:
header that indicates accepted expiration time. For example:
SIP/2.0 200 OK
...
Contact: <sip:USER_NAME@LOCAL_IP:LOCAL_PORT>; expires=60
...
In this situation, you should re-REGISTER before this expiration time (60 seconds in the example).
Keeping in mind that you're trying to send an SMS to a mobile phone, reception point is directly managed by your network provider's MGCF, so this leaves sender's registration or MESSAGE request.
About your original MESSAGE proposal, request URI (message's first line), should be:
MESSAGE sip:TO@DOMAIN SIP/2.0
Because it refers to MESSAGE reception entity.
Hope this helps.