ListManager Tcl Commands
General Tcl Commands
The following Tcl commands can be used in either message or recipient-level Tcl scripts:
sql
The sql
Tcl command allows an administrator to execute an SQL statement and obtain the results.
For security reasons, the administrator must login first using the login
command. The sql
command can be used to execute an SQL statement that returns a single result set or no results. That result
set can have multiple columns and rows. SQL statements that return multiple result sets are not currently
supported. The syntax for the SQL command is:
%%sql (tag) (function) (function arguments)%%
The first argument to the sql
command is a tag that is used to identify the query when executing
a statement and retrieving results. It allows multiple queries to be distinguished within a message.
It is important to note that queries that are done within a message-level Tcl script are in a different scope than those in a recipient-level script. Therefore, the tags that are used to identify them are also in different scopes. A tag used in a message-level script is distinct from the same tag used in a recipient-level script. A tag can be any string.
A message-level script is executed only once for the message and a recipient-level script is executed for each recipient. The results of SQL queries executed in each of these scopes are stored separately and cannot be accessed from a different scope. In other words, recipient-level scripts cannot access the results of queries performed in a message-level script. The reverse is also true. Since the results of message-level queries might be required at the recipient level, they can be stored in variables and accessed for recipients without any command call overhead.
The second argument to the sql
command is the name of the function that is executed.
These functions and their arguments are:
sql (tag) execute (sql statement)
: This function executes the specified SQL statement.sql (tag) numrows
: This function returns the number of rows that were retrieved.sql (tag) numcolumns
: This function returns the number of columns that were retrieved.sql (tag) columnname (column index)
: This function returns the name of the column at the specified index. The index must be between 1 and N where N is the number of columns retrieved.sql (tag) data (column index) (row index)
: This function returns the data that corresponds to the specified column and row indices. The row index must be between 1 and M where M is the number of rows retrieved. If the row index argument is omitted, it defaults to 1. If both the column index and row index are omitted, they both default to 1.
Here is an example to return all of the names and email addresses on the current list in the form:
Name = Full Name, Email = email@address
%%!
init ;
errormode debug ;
login youradmin@email.addr yourpassword ;
%%
%%!
sql listmembers execute "SELECT FullName_, EmailAddr_ FROM members_ WHERE List_='[list.name]'" ;
set numrows [sql listmembers numrows] ;
set results "" ;
for { set row 1 } { $row <= $numrows } { incr row } {
set Name [sql listmembers data 1 $row] ;
set EmailAddr [sql listmembers data 2 $row] ;
append results "Name = $Name, Email = $EmailAddr\n" ;
} ;
return $results ;
sendmessagelm
This command is a simple method of sending a message using ListManager's standard message send system. This function takes four arguments:
sendmessagelm (from) (to) (subject) (body)
: Due to the length of the subject and body, it may be more convenient to define these as variables to pass
to this command. For example:
%% after ;
set From "me@myaddress.dom" ;
set To "me@myaddress.dom" ;
set Subject "message send has completed!" ;
set Body <
The message send for:
[merge inmail_.HdrSubject_]
is complete.> ;
sendmessagelm $From $To $Subject $Body
%%
process_merge_tags
: The process_merge_tags
TclMerge command is useful anytime you want to merge content from another source
and have the merge tags evaluated. This command is very useful for HTML mailings. This command is used in mailings, but can apply to other documents, such as hello and goodbye documents
as well. The process_merge_tags
TclMerge command evaluates any %%-delimited
merge tags in the argument
passed to it and return the results. Doing so is useful in cases where you want to perform a mail merge
on text that is retrieved from the database or via http.
Note that these tags are evaluated as straight Tcl and therefore any Aurea List Manager Tcl language extensions does not work in these tags.
For example, the "init" and "before" modifiers are not
evaluated properly and line unwrapping is not done. Additionally, any special merge tags that are not
handled as normal Tcl procedures such as %%MemberID_%%
results in errors. You must use the %%merge
MemberID_%%
convention for all merged data fields.
Example:
%%process_merge_tags [httpget http://myserver/newsletter.html]%%
Message Level Commands
The following commands are valid only in message-level
or send-completion
scripts:
login
In order to use certain Tcl commands, the administrator must first log in. This is to prevent someone from sending a message containing malicious SQL or other hazardous code pretending to be an administrator by using the administrator's email address, a practice known as "spoofing".
The "login" command is called with the administrator's email address and password. The syntax for this command is:
%% init ; login (email address) (password) %%
Since this command requires a database query to determine if this address and password are those of an
administrator, it should only be used in message-level scripts -- Tcl scripts that begin with "%%init
;"
or "%%before ;"
. Otherwise, the query is done for each recipient, and
it slows down the send.
redirect
For testing purposes, it is advantageous to be able to preview what each recipient sees when their
message is mail-merged. The redirect
command allows the administrator to redirect all
messages to a specified email address.
The syntax for this command is: %% init ; redirect (email address) %%
errormode
Since Tcl can be a tricky language to program, debugging message sends are required or desirable. This is to endure that the Tcl in the message executes properly. The sender should turn on error handling so that if there is an error, the message send stops and the sender is notified. The following error modes are supported: notify, abort, replace, debug, and normal.
The most helpful use of this command is the notify
mode:
%% init ; errormode notify user@domain.ext %%
When this mode is set, any Tcl errors causes the message send to stop and an email that details the error description and the tag in which it occurred is sent to the specified email address.
The abort
error mode simply causes the message send to stop but no notification is sent. The
error text can be found in the transaction log for the message. The syntax for this mode is:
%% init ; errormode abort %%
The replace
error mode causes the tag in which the error occurred to be replaced with
the specified text. The syntax for this mode is:
%% init ; errormode replace "replacement text" %%
The debug
error mode replaces the tag with the error string. This string indicates
what the error was and the text of the script.
The normal
error mode replaces the tag with an empty string. This is equivalent to calling
"errormode replace" with an empty string. This is the default behavior.
mailtest
This command takes no arguments and returns an empty string, tells ListManager to put this message
into mailtest
mode. This means that the send proceeds as normal and go through the standard
SMTP transaction but resets before the message data is sent to the server. Any messages sent in this
mode does not reach the recipients. This should only be used for testing mail-merge and send speeds. Since
messages sent this mode are otherwise indistinguishable from a standard send, handling of transient or
permanent failures for bad or intermittent email addresses still applies.
Recipient Level Commands
- recipindex
This command takes no arguments and returns a number that indicates the relative index of the current recipient during the current send. It is based on the range 1 to N where N is the total number of recipients to which the message is being sent. The ordering is based on the retrieval order from the database but isn't guaranteed to be in this order.
- numrecips
This command takes no arguments and returns the number of total recipients that are being sent to. This number represents N in the range of results returned by the "recipindex" command.
- skip
abort
Sometimes the sender of a message may not want to send to certain recipients that are usually a
part of a normal send. For example, if the sender was testing a message with the redirect
command but they were sending to a list with 100,000 messages, they would receive 100,000 copies of the
message. Or, the sender might want to do mail-merge for the entire send and verify that there were no
errors before doing the actual send.
Using the skip command, which takes no arguments and returns an empty string, the sender could send to every 1000th recipient and skip the rest using the following Tcl mail-merge tag:
%% if { [recipindex] % 1000 != 0 } { skip } %%
This means that if the index of this recipient as retrieved by the recipindex command is not evenly divisible by 1000 then it is skipped.
The sender could skip every recipient by simply adding the tag "%%skip%%" to the end of the message.
When the "skip" command is executed, further processing of the current message is stopped so if you are testing the message to make sure that all the scripts are executed properly, call this command at the end of the message. Otherwise, call it at the beginning.
This command terminates the sending of the current message. If the error mode was currently set to notify
,
then the notification is sent. Otherwise, the error mode is set to abort
and an error
is generated causing the message send to stop. abort
can be called with a text string argument
which is passed on as the error text. For example:
%%abort "Terminating this message send."%%
memberstable
, emailaddrcolumn
, and memberidcolumn
The name of the members table and the column names of the email address and member ID are all configurable
by the server administrator. These commands return these names. When writing custom Tcl commands for library
code, use these commands in place of members_
, EmailAddr_
, and MemberID_
memberidchar
Each member in the Aurea List Manager database has a unique ID and for each ID, there is a special code character
which is a single letter. The ID and code character are used in many places for the validation of confirmations
and unsubscribes. The code character makes it harder to accidentally unsubscribe someone else by typing
in the wrong ID. The memberidchar
command returns the member ID and the code character as a string
that can be used in your scripts. For example:
To unsubscribe, click here:
http://www.yourdomain.dom/u?id=%%memberidchar%%&c=F
emailunsub
The member unsubscribe address is fundamental to the operation of a mailing list and our failsafe
unsubscribe
feature makes it convenient and simple for a member to unsubscribe. The emailunsub
command
returns an unsubscribe address specific to the current member. This command is equivalent to the legacy
subst
tag version: $subst('email.unsub')
which is also supported via the Tcl command subst
email.unsub
.
Legacy Subst Commands
ListManager has always had some mail-merge capability using special subst
tags of the form $subst('argument')
.
All of these commands are supported in the new mail-merge functionality. Prior to 6.0h, the form of the
tag was subst (argument), which conflicted with the Tcl subst command. For 6.0h and higher, the form
of the new tags is:
- lmsubst (argument)
where (argument) is the same argument that was passed to the original $subst version.
When upgrading to ListManager 6.0h and higher, those who have created scripts using the
Aurea List Manager subst
command must update them to use lmsubst
.