mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 10:47:18 +00:00 
			
		
		
		
	(closes issue #13211) Reported by: eliel Patches: fixtexerrors.patch uploaded by eliel (license 64) git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@134803 65c4cc65-6c06-0410-ace0-fbb531ad65f3
		
			
				
	
	
		
			519 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
			
		
		
	
	
			519 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
| \section{Introduction}
 | |
| 
 | |
|    The SMS module for Asterisk was developed by Adrian Kennard, and is an
 | |
|    implementation of the ETSI specification for landline SMS, ETSI ES 201
 | |
|    912, which is available from \url{www.etsi.org}. Landline SMS is starting to
 | |
|    be available in various parts of Europe, and is available from BT in
 | |
|    the UK. However, Asterisk would allow gateways to be created in other
 | |
|    locations such as the US, and use of SMS capable phones such as the
 | |
|    Magic Messenger. SMS works using analogue or ISDN lines.
 | |
| 
 | |
| \section{Background}
 | |
| 
 | |
|    Short Message Service (SMS), or texting is very popular between mobile
 | |
|    phones. A message can be sent between two phones, and normally
 | |
|    contains 160 characters. There are ways in which various types of data
 | |
|    can be encoded in a text message such as ring tones, and small
 | |
|    graphic, etc. Text messaging is being used for voting and
 | |
|    competitions, and also SPAM...
 | |
| 
 | |
|    Sending a message involves the mobile phone contacting a message
 | |
|    centre (SMSC) and passing the message to it. The message centre then
 | |
|    contacts the destination mobile to deliver the message. The SMSC is
 | |
|    responsible for storing the message and trying to send it until the
 | |
|    destination mobile is available, or a timeout.
 | |
| 
 | |
|    Landline SMS works in basically the same way. You would normally have
 | |
|    a suitable text capable landline phone, or a separate texting box such
 | |
|    as a Magic Messenger on your phone line. This sends a message to a
 | |
|    message centre your telco provides by making a normal call and sending
 | |
|    the data using 1200 Baud FSK signaling according to the ETSI spec. To
 | |
|    receive a message the message centre calls the line with a specific
 | |
|    calling number, and the text capable phone answers the call and
 | |
|    receives the data using 1200 Baud FSK signaling. This works
 | |
|    particularly well in the UK as the calling line identity is sent
 | |
|    before the first ring, so no phones in the house would ring when a
 | |
|    message arrives.
 | |
| 
 | |
| \section{Typical use with Asterisk}
 | |
| 
 | |
|    Sending messages from an Asterisk box can be used for a variety of
 | |
|    reasons, including notification from any monitoring systems, email
 | |
|    subject lines, etc.
 | |
| 
 | |
|    Receiving messages to an Asterisk box is typically used just to email
 | |
|    the messages to someone appropriate - we email and texts that are
 | |
|    received to our direct numbers to the appropriate person. Received
 | |
|    messages could also be used to control applications, manage
 | |
|    competitions, votes, post items to IRC, anything.
 | |
| 
 | |
|    Using a terminal such as a magic messenger, an Asterisk box could ask
 | |
|    as a message centre sending messages to the terminal, which will beep
 | |
|    and pop up the message (and remember 100 or so messages in its
 | |
|    memory).
 | |
| 
 | |
| \section{Terminology}
 | |
| 
 | |
| \begin{itemize}
 | |
|    \item SMS -
 | |
|    Short Message Service
 | |
|    i.e. text messages
 | |
| 
 | |
|    \item SMSC -
 | |
|    Short Message Service Centre
 | |
|    The system responsible for storing and forwarding messages
 | |
| 
 | |
|    \item MO -
 | |
|    Mobile Originated
 | |
|    A message on its way from a mobile or landline device to the SMSC
 | |
| 
 | |
|    \item MT -
 | |
|    Mobile Terminated
 | |
|    A message on its way from the SMSC to the mobile or landline device
 | |
| 
 | |
|    \item RX -
 | |
|    Receive
 | |
|    A message coming in to the Asterisk box
 | |
| 
 | |
|    \item TX -
 | |
|    Transmit
 | |
|    A message going out of the Asterisk box
 | |
| \end{itemize}
 | |
| 
 | |
| \section{Sub address}
 | |
| 
 | |
|    When sending a message to a landline, you simply send to the landline
 | |
|    number. In the UK, all of the mobile operators (bar one) understand
 | |
|    sending messages to landlines and pass the messages to the BTText
 | |
|    system for delivery to the landline.
 | |
| 
 | |
|    The specification for landline SMS allows for the possibility of more
 | |
|    than one device on a single landline. These can be configured with Sub
 | |
|    addresses which are a single digit. To send a message to a specific
 | |
|    device the message is sent to the landline number with an extra digit
 | |
|    appended to the end. The telco can define a default sub address (9 in
 | |
|    the UK) which is used when the extra digit is not appended to the end.
 | |
|    When the call comes in, part of the calling line ID is the sub
 | |
|    address, so that only one device on the line answers the call and
 | |
|    receives the message.
 | |
| 
 | |
|    Sub addresses also work for outgoing messages. Part of the number
 | |
|    called by the device to send a message is its sub address. Sending
 | |
|    from the default sub address (9 in the UK) means the message is
 | |
|    delivered with the sender being the normal landline number. Sending
 | |
|    from any other sub address makes the sender the landline number with
 | |
|    an extra digit on the end.
 | |
| 
 | |
|    Using Asterisk, you can make use of the sub addresses for sending and
 | |
|    receiving messages. Using DDI (DID, i.e. multiple numbers on the line
 | |
|    on ISDN) you can also make use of many different numbers for SMS.
 | |
| 
 | |
| \section{extensions.conf}
 | |
| 
 | |
|    The following contexts are recommended.
 | |
| 
 | |
| \begin{astlisting}
 | |
| \begin{verbatim}
 | |
| ; Mobile Terminated, RX. This is used when an incoming call from the SMS arrive
 | |
| s, with the queue (called number and sub address) in ${EXTEN}
 | |
| ; Running an app after receipt of the text allows the app to find all messages
 | |
| in the queue and handle them, e.g. email them.
 | |
| ; The app may be something like   smsq --process=somecommand --queue=${EXTEN}
 | |
| to run a command for each received message
 | |
| ; See below for usage
 | |
| [smsmtrx]
 | |
| exten = _X.,1, SMS(${EXTEN},a)
 | |
| exten = _X.,2,System("someapptohandleincomingsms ${EXTEN}")
 | |
| exten = _X.,3,Hangup
 | |
| ; Mobile originated, RX. This is receiving a message from a device, e.g.
 | |
| ; a Magic Messenger on a sip extension
 | |
| ; Running an app after receipt of the text allows the app to find all messages
 | |
| ; in the queue and handle then, e.g. sending them to the public SMSC
 | |
| ; The app may be something like   smsq --process=somecommand --queue=${EXTEN}
 | |
| ; to run a command for each received message
 | |
| ; See below for example usage
 | |
| [smsmorx]
 | |
| exten = _X.,1, SMS(${EXTEN},sa)
 | |
| exten = _X.,2,System("someapptohandlelocalsms ${EXTEN}")
 | |
| exten = _X.,3,Hangup
 | |
| \end{verbatim}
 | |
| \end{astlisting}
 | |
| 
 | |
|    smsmtrx is normally accessed by an incoming call from the SMSC. In the
 | |
|    UK this call is from a CLI of 080058752X0 where X is the sub address.
 | |
|    As such a typical usage in the extensions.conf at the point of
 | |
|    handling an incoming call is:
 | |
| \begin{astlisting}
 | |
| \begin{verbatim}
 | |
| exten = _X./8005875290,1,Goto(smsmtrx,${EXTEN},1)
 | |
| exten = _X./_80058752[0-8]0,1,Goto(smsmtrx,${EXTEN}-${CALLERID(num):8:1},1)
 | |
| \end{verbatim}
 | |
| \end{astlisting}
 | |
| 
 | |
|    Alternatively, if you have the correct national prefix on incoming
 | |
|    CLI, e.g. using dahdi\_hfc, you might use:
 | |
| \begin{astlisting}
 | |
| \begin{verbatim}
 | |
| exten = _X./08005875290,1,Goto(smsmtrx,${EXTEN},1)
 | |
| exten = _X./_080058752[0-8]0,1,Goto(smsmtrx,${EXTEN}-${CALLERID(num):9:1},1)
 | |
| \end{verbatim}
 | |
| \end{astlisting}
 | |
| 
 | |
|    smsmorx is normally accessed by a call from a local sip device
 | |
|    connected to a Magic Messenger. It could however by that you are
 | |
|    operating Asterisk as a message centre for calls from outside. Either
 | |
|    way, you look at the called number and goto smsmorx. In the UK, the
 | |
|    SMSC number that would be dialed is 1709400X where X is the caller sub
 | |
|    address. As such typical usage in extension.config at the point of
 | |
|    handling a call from a sip phone is:
 | |
| \begin{astlisting}
 | |
| \begin{verbatim}
 | |
| exten = 17094009,1,Goto(smsmorx,${CALLERID(num)},1)
 | |
| exten = _1709400[0-8],1,Goto(smsmorx,${CALLERID(num)}-{EXTEN:7:1},1)
 | |
| \end{verbatim}
 | |
| \end{astlisting}
 | |
| 
 | |
| \section{Using smsq}
 | |
| 
 | |
|    smsq is a simple helper application designed to make it easy to send
 | |
|    messages from a command line. it is intended to run on the Asterisk
 | |
|    box and have direct access to the queue directories for SMS and for
 | |
|    Asterisk.
 | |
| 
 | |
|    In its simplest form you can send an SMS by a command such as
 | |
|    smsq 0123456789 This is a test to 0123456789
 | |
|    This would create a queue file for a mobile originated TX message in
 | |
|    queue 0 to send the text "This is a test to 0123456789" to 0123456789.
 | |
|    It would then place a file in the \path{/var/spool/asterisk/outgoing}
 | |
|    directory to initiate a call to 17094009 (the default message centre
 | |
|    in smsq) attached to application SMS with argument of the queue name
 | |
|    (0).
 | |
| 
 | |
|    Normally smsq will queue a message ready to send, and will then create
 | |
|    a file in the Asterisk outgoing directory causing Asterisk to actually
 | |
|    connect to the message centre or device and actually send the pending
 | |
|    message(s).
 | |
| 
 | |
|    Using \verb!--process!, smsq can however be used on received queues to run a
 | |
|    command for each file (matching the queue if specified) with various
 | |
|    environment variables set based on the message (see below);
 | |
|    smsq options:
 | |
| \begin{verbatim}
 | |
|    --help
 | |
|    Show help text
 | |
|    --usage
 | |
|    Show usage
 | |
|    --queue
 | |
|    -q
 | |
|    Specify a specific queue
 | |
|    In no specified, messages are queued under queue "0"
 | |
|    --da
 | |
|    -d
 | |
|    Specify destination address
 | |
|    --oa
 | |
|    -o
 | |
|    Specify originating address
 | |
|    This also implies that we are generating a mobile terminated message
 | |
|    --ud
 | |
|    -m
 | |
|    Specify the actual message
 | |
|    --ud-file
 | |
|    -f
 | |
|    Specify a file to be read for the context of the message
 | |
|    A blank filename (e.g. --ud-file= on its own) means read stdin. Very
 | |
|    useful when using via ssh where command line parsing could mess up the
 | |
|    message.
 | |
|    --mt
 | |
|    -t
 | |
|    Mobile terminated message to be generated
 | |
|    --mo
 | |
|    Mobile originated message to be generated
 | |
|    Default
 | |
|    --tx
 | |
|    Transmit message
 | |
|    Default
 | |
|    --rx
 | |
|    -r
 | |
|    Generate a message in the receive queue
 | |
|    --UTF-8
 | |
|    Treat the file as UTF-8 encoded (default)
 | |
|    --UCS-1
 | |
|    Treat the file as raw 8 bit UCS-1 data, not UTF-8 encoded
 | |
|    --UCS-2
 | |
|    Treat the file as raw 16 bit bigendian USC-2 data
 | |
|    --process
 | |
|    Specific a command to process for each file in the queue
 | |
|    Implies --rx and --mt if not otherwise specified.
 | |
|    Sets environment variables for every possible variable, and also ud,
 | |
|    ud8 (USC-1 hex), and ud16 (USC-2 hex) for each call. Removes files.
 | |
|    --motx-channel
 | |
|    Specify the channel for motx calls
 | |
|    May contain X to use sub address based on queue name or may be full
 | |
|    number
 | |
|    Default is Local/1709400X
 | |
|    --motx-callerid
 | |
|    Specify the caller ID for motx calls
 | |
|    The default is the queue name without -X suffix
 | |
|    --motx-wait
 | |
|    Wait time for motx call
 | |
|    Default 10
 | |
|    --motx-delay
 | |
|    Retry time for motx call
 | |
|    Default 1
 | |
|    --motx-retries
 | |
|    Retries for motx call
 | |
|    Default 10
 | |
|    --mttx-channel
 | |
|    Specify the channel for mttx calls
 | |
|    Default is Local/ and the queue name without -X suffix
 | |
|    --mtttx-callerid
 | |
|    Specify the callerid for mttx calls
 | |
|    May include X to use sub address based on queue name or may be full
 | |
|    number
 | |
|    Default is 080058752X0
 | |
|    --mttx-wait
 | |
|    Wait time for mttx call
 | |
|    Default 10
 | |
|    --mttx-delay
 | |
|    Retry time for mttx call
 | |
|    Default 30
 | |
|    --mttx-retries
 | |
|    Retries for mttx call
 | |
|    Default 100
 | |
|    --default-sub-address
 | |
|    The default sub address assumed (e.g. for X in CLI and dialled numbers
 | |
|    as above) when none added (-X) to queue
 | |
|    Default 9
 | |
|    --no-dial
 | |
|    -x
 | |
|    Create queue, but do not dial to send message
 | |
|    --no-wait
 | |
|    Do not wait if a call appears to be in progress
 | |
|    This could have a small window where a message is queued but not
 | |
|    sent, so regular calls to smsq should be done to pick up any missed
 | |
|    messages
 | |
|    --concurrent
 | |
|    How many concurrent calls to allow (per queue), default 1
 | |
|    --mr
 | |
|    -n
 | |
|    Message reference
 | |
|    --pid
 | |
|    -p
 | |
|    Protocol ID
 | |
|    --dcs
 | |
|    Data coding scheme
 | |
|    --udh
 | |
|    Specific hex string of user data header specified (not including the
 | |
|    initial length byte)
 | |
|    May be a blank string to indicate header is included in the user data
 | |
|    already but user data header indication to be set.
 | |
|    --srr
 | |
|    Status report requested
 | |
|    --rp
 | |
|    Return path requested
 | |
|    --vp
 | |
|    Specify validity period (seconds)
 | |
|    --scts
 | |
|    Specify timestamp (YYYY-MM-DDTHH:MM:SS)
 | |
|    --spool-dir
 | |
|    Spool dir (in which sms and outgoing are found)
 | |
|    Default /var/spool/asterisk
 | |
| \end{verbatim}
 | |
| 
 | |
|    Other arguments starting '-' or '\verb!--!' are invalid and will cause an
 | |
|    error. Any trailing arguments are processed as follows:-
 | |
| 
 | |
| \begin{itemize}
 | |
| 
 | |
|      \item If the message is mobile originating and no destination address
 | |
|        has been specified, then the first argument is assumed to be a
 | |
|        destination address
 | |
| 
 | |
|      \item If the message is mobile terminating and no destination address
 | |
|        has been specified, then the first argument is assumed to be the
 | |
|        queue name
 | |
| 
 | |
|      \item If there is no user data, or user data file specified, then any
 | |
|        following arguments are assumed to be the message, which are
 | |
|        concatenated.
 | |
| 
 | |
|      \item If no user data is specified, then no message is sent. However,
 | |
|        unless \verb!--no-dial! is specified, smsq checks for pending messages
 | |
|        and generates an outgoing anyway
 | |
| \end{itemize}
 | |
| 
 | |
| 
 | |
|    Note that when smsq attempts to make a file in
 | |
|    \path{/var/spool/asterisk/outgoing}, it checks if there is already a call
 | |
|    queued for that queue. It will try several filenames, up to the
 | |
|    \verb!--concurrent! setting. If these files exist, then this means Asterisk
 | |
|    is already queued to send all messages for that queue, and so Asterisk
 | |
|    should pick up the message just queued. However, this alone could
 | |
|    create a race condition, so if the files exist then smsq will wait up
 | |
|    to 3 seconds to confirm it still exists or if the queued messages have
 | |
|    been sent already. The \verb!--no-wait! turns off this behaviour. Basically,
 | |
|    this means that if you have a lot of messages to send all at once,
 | |
|    Asterisk will not make unlimited concurrent calls to the same message
 | |
|    centre or device for the same queue. This is because it is generally
 | |
|    more efficient to make one call and send all of the messages one after
 | |
|    the other.
 | |
| 
 | |
|    smsq can be used with no arguments, or with a queue name only, and it
 | |
|    will check for any pending messages and cause an outgoing if there are
 | |
|    any. It only sets up one outgoing call at a time based on the first
 | |
|    queued message it finds. A outgoing call will normally send all queued
 | |
|    messages for that queue. One way to use smsq would be to run with no
 | |
|    queue name (so any queue) every minute or every few seconds to send
 | |
|    pending message. This is not normally necessary unless \verb!--no-dial! is
 | |
|    selected. Note that smsq does only check motx or mttx depending on the
 | |
|    options selected, so it would need to be called twice as a general
 | |
|    check.
 | |
| 
 | |
|    UTF-8 is used to parse command line arguments for user data, and is
 | |
|    the default when reading a file. If an invalid UTF-8 sequence is
 | |
|    found, it is treated as UCS-1 data (i.e, as is).
 | |
|    The \verb!--process! option causes smsq to scan the specified queue (default
 | |
|    is mtrx) for messages (matching the queue specified, or any if queue
 | |
|    not specified) and run a command and delete the file. The command is
 | |
|    run with a number of environment variables set as follows. Note that
 | |
|    these are unset if not needed and not just taken from the calling
 | |
|    environment. This allows simple processing of incoming messages
 | |
| \begin{verbatim}
 | |
|    $queue
 | |
|    Set if a queue specified
 | |
|    $?srr
 | |
|    srr is set (to blank) if srr defined and has value 1.
 | |
|    $?rp
 | |
|    rp is set (to blank) if rp defined and has value 1.
 | |
|    $ud
 | |
|    User data, UTF-8 encoding, including any control characters, but with
 | |
|    nulls stripped out
 | |
|    Useful for the content of emails, for example, as it includes any
 | |
|    newlines, etc.
 | |
|    $ude
 | |
|    User data, escaped UTF-8, including all characters, but control
 | |
|    characters \n, \r, \t, \f, \xxx and \ is escaped as \\
 | |
|    Useful guaranteed one line printable text, so useful in Subject lines
 | |
|    of emails, etc
 | |
|    $ud8
 | |
|    Hex UCS-1 coding of user data (2 hex digits per character)
 | |
|    Present only if all user data is in range U+0000 to U+00FF
 | |
|    $ud16
 | |
|    Hex UCS-2 coding of user data (4 hex digits per character)
 | |
|    other
 | |
|    Other fields set using their field name, e.g. mr, pid, dcs, etc. udh
 | |
|    is a hex byte string
 | |
| \end{verbatim}
 | |
| 
 | |
| \section{File formats}
 | |
| 
 | |
|    By default all queues are held in a director \path{/var/spool/asterisk/sms}.
 | |
|    Within this directory are sub directories mtrx, mttx, morx, motx which
 | |
|    hold the received messages and the messages ready to send. Also,
 | |
|    \path{/var/log/asterisk/sms} is a log file of all messages handled.
 | |
| 
 | |
|    The file name in each queue directory starts with the queue parameter
 | |
|    to SMS which is normally the CLI used for an outgoing message or the
 | |
|    called number on an incoming message, and may have -X (X being sub
 | |
|    address) appended. If no queue ID is known, then 0 is used by smsq by
 | |
|    default. After this is a dot, and then any text. Files are scanned for
 | |
|    matching queue ID and a dot at the start. This means temporary files
 | |
|    being created can be given a different name not starting with a queue
 | |
|    (we recommend a . on the start of the file name for temp files).
 | |
|    Files in these queues are in the form of a simple text file where each
 | |
|    line starts with a keyword and an = and then data. udh and ud have
 | |
|    options for hex encoding, see below.
 | |
| 
 | |
|    UTF-8. The user data (ud) field is treated as being UTF-8 encoded
 | |
|    unless the DCS is specified indicating 8 bit format. If 8 bit format
 | |
|    is specified then the user data is sent as is.
 | |
|    The keywords are as follows:
 | |
| \begin{verbatim}
 | |
|    oa Originating address
 | |
|    The phone number from which the message came
 | |
|    Present on mobile terminated messages and is the CLI for morx messages
 | |
|    da
 | |
|    Destination Address
 | |
|    The phone number to which the message is sent
 | |
|    Present on mobile originated messages
 | |
|    scts
 | |
|    The service centre time stamp
 | |
|    Format YYYY-MM-DDTHH:MM:SS
 | |
|    Present on mobile terminated messages
 | |
|    pid
 | |
|    One byte decimal protocol ID
 | |
|    See GSM specs for more details
 | |
|    Normally 0 or absent
 | |
|    dcs
 | |
|    One byte decimal data coding scheme
 | |
|    If omitted, a sensible default is used (see below)
 | |
|    See GSM specs for more details
 | |
|    mr
 | |
|    One byte decimal message reference
 | |
|    Present on mobile originated messages, added by default if absent
 | |
|    srr
 | |
|    0 or 1 for status report request
 | |
|    Does not work in UK yet, not implemented in app_sms yet
 | |
|    rp
 | |
|    0 or 1 return path
 | |
|    See GSM specs for details
 | |
|    vp
 | |
|    Validity period in seconds
 | |
|    Does not work in UK yet
 | |
|    udh
 | |
|    Hex string of user data header prepended to the SMS contents,
 | |
|    excluding initial length byte.
 | |
|    Consistent with ud, this is specified as udh# rather than udh=
 | |
|    If blank, this means that the udhi flag will be set but any user data
 | |
|    header must be in the ud field
 | |
|    ud
 | |
|    User data, may be text, or hex, see below
 | |
| \end{verbatim}
 | |
| 
 | |
|    udh is specified as as udh\# followed by hex (2 hex digits per byte).
 | |
|    If present, then the user data header indicator bit is set, and the
 | |
|    length plus the user data header is added to the start of the user
 | |
|    data, with padding if necessary (to septet boundary in 7 bit format).
 | |
|    User data can hold an USC character codes U+0000 to U+FFFF. Any other
 | |
|    characters are coded as U+FEFF
 | |
| 
 | |
|    ud can be specified as ud= followed by UTF-8 encoded text if it
 | |
|    contains no control characters, i.e. only (U+0020 to U+FFFF). Any
 | |
|    invalid UTF-8 sequences are treated as is (U+0080-U+00FF).
 | |
| 
 | |
|    ud can also be specified as ud\# followed by hex (2 hex digits per
 | |
|    byte) containing characters U+0000 to U+00FF only.
 | |
| 
 | |
|    ud can also be specified as ud\#\# followed by hex (4 hex digits per
 | |
|    byte) containing UCS-2 characters.
 | |
| 
 | |
|    When written by app\_sms (e.g. incoming messages), the file is written
 | |
|    with ud= if it can be (no control characters). If it cannot, the a
 | |
|    comment line ;ud= is used to show the user data for human readability
 | |
|    and ud\# or ud\#\# is used.
 | |
| 
 | |
| \section{Delivery reports}
 | |
| 
 | |
|    The SMS specification allows for delivery reports. These are requested
 | |
|    using the srr bit. However, as these do not work in the UK yet they
 | |
|    are not fully implemented in this application. If anyone has a telco
 | |
|    that does implement these, please let me know. BT in the UK have a non
 | |
|    standard way to do this by starting the message with *0\#, and so this
 | |
|    application may have a UK specific bodge in the near future to handle
 | |
|    these.
 | |
| 
 | |
|    The main changes that are proposed for delivery report handling are :
 | |
| 
 | |
| \begin{itemize}
 | |
|      \item New queues for sent messages, one file for each destination
 | |
|        address and message reference.
 | |
| 
 | |
|      \item New field in message format, user reference, allowing applications
 | |
|        to tie up their original message with a report.
 | |
| 
 | |
|      \item Handling of the delivery confirmation/rejection and connecting to
 | |
|        the outgoing message - the received message file would then have
 | |
|        fields for the original outgoing message and user reference
 | |
|        allowing applications to handle confirmations better.
 | |
| \end{itemize}
 |