---------------------------------------------------------------------- Pegasus Mail Message Templates ---------------------------------------------------------------------- Pegasus Mail System, Copyright (c) 1990-99, David Harris, All Rights Reserved. ---------------------------------------------------------------------- Contents: 1: Overview of Message Templates 2: Types of Templates 3: Using Templates within Pegasus Mail 4: The Message Template Script Language 4.1: String literals 4.1.1: Filenames 4.2: Optional parameters 4.3: Command substitutions 4.4: Script language commands 1: Overview of Message Templates -------------------------------- Imagine that you're the web master for your Internet site; you receive a huge amount of mail for much of which the answer is essentially the same... You laboriously reply to the message, remove the pieces you don't want, type in your canned response, then send the message. Wouldn't it be good if there was some way of automating all of this? Well, there is -- Message Templates. A Message Template is simply a script that tells Pegasus Mail how to compose a mail message. The template script commands allow you to set any address or feature field, include the original message for replies (or a portion of the message), change or modify addresses, add attachments and generally give you complete control over the shape of your automatically- generated message. What's even better, you can define variables in templates: when you use the template, Pegasus Mail will prompt you for values for the variables it contains; the script language can then take the values you enter, manipulate them, and insert them seamlessly into the generated message. Using a message template, you can generate a complex mail message and send it with only a couple of keystrokes. What uses might you have for a template? Here are some ideas: * Helpdesk submissions (as per the sample HELPDESK.PM5 template) * Mail server management forms (to simplify the process of subscribing to and unsubscribing from lists) * Forms: any kind of complex data-entry based mail form could be generated using a template * Order submission * Automated replies 2: Types of templates --------------------- Pegasus Mail supports two types of templates - those used to create new messages from scratch, and those used to create replies to messages. Template files are simply plain text files containing template script language commands, one per line. Templates used to create new messages have the extension .PM5; the name portion can be anything you wish. Templates used to create replies to messages have the extension .PM6; once again, the name portion can be anything you wish. For both types of template, the script language's TITLE command must be the first line in the file, so that Pegasus Mail can show the name in its selector window. Pegasus Mail will not burrow through a template file looking for a TITLE command if it is not on the first line. Template files can be located in your home mailbox directory, or may be placed in the same directory as the Pegasus Mail executable program, in which case they become system-wide and are made available to all users running that copy of the program. There is no effective limit on the number of templates you can define. For now, in order to create a template file you must use a text editor of some kind - for instance, the Windows NOTEPAD applet. If you use NOTEPAD, make sure that the Wordwrap option is turned off - each line in a template file must contain a single command and you cannot run lines together. Future versions of Pegasus Mail may include a user-interface for creating template files. 3: Using templates within Pegasus Mail -------------------------------------- You can create a new message using a template by selecting Template... from the New Message submenu of the File menu. This will open a dialog listing all the templates available on your system. Select the template you want to use by highlighting it and clicking Open, or by double- clicking it. A window will open prompting you for any variables the template uses; at this point, you can choose whether to open a new message editor window filled out with the message created by the template, or simply to send the message without further ado. You can use a template to create a reply to a message in one of two ways: 1: Right-click the message and choose "Reply using template..." from the popup menu 2: Highlight the message, then hold down as you press the "Reply" button, or else hold down and press the R key. 4: The Message Template Script Language --------------------------------------- The script language used by Pegasus Mail templates is very simple. Each command in the file must appear on a single line of its own -- commands may not wrap lines, nor may more than one command appear on a single line. Lines starting with \, * ; or # are treated as comments and are ignored. 4.1: String literals Most template script commands in the language accept strings as parameters. String literals of this kind must be entered in quote characters if they contain spaces or special characters. For example, if you want to use the "insert" command to write the string Mary had a little lamb into an outgoing message, you would need to enter the command like this: insert "Mary had a little lamb" since otherwise, only the word "Mary" would be inserted. If your string contains a quote character, or a backslash character, then you will need to perform a small amount of conversion. So, if you want to insert the string Mary had a "little" lamb you would have to enter the "insert" command like this: insert "Mary had a \"little\" lamb" These rules for string construction apply in all places throughout the script language. 4.1.1: Filenames Filenames are treated as strings by the script language, and as such are subject to the same rules. In particular note that long filenames containing spaces will need to be quoted, and that '\' characters will need to be doubled in file paths... So, if you wanted to use the include command to include the file c:\docs\Mary's "little" lamb You would need to form the command as include "c:\\docs\\Mary's \"little\" lamb" 4.2: Optional parameters Some script commands are shown as having "optional" parameters. This notion needs some clarification... A parameter may be omitted only if all the parameters following it are also omitted - it is not possible to omit only one parameter from the middle of a list. So, using the "include" command as an example, if you wanted to include a file in quoted format, you would have to include the "0" value for the count parameter as well. 4.3: Command substitutions Practically any string parameter to a script command can contain command substitutions: these are special character sequences that are replaced by variables or other information when they are encountered. Pegasus Mail recognizes the following command substitutions in any place where they may be used: ~vvariable_name~ The current value of a template script variable ~z A single newline (CR/LF) ~f The "from" field of the original message ~s The "subject" field of the original message ~r The preferred reply address for the message ~kfieldname~ Any field from the original message ~n The current user's basic username ~i The current user's Internet e-mail address ~8 The current user's username truncated to 8 chars ~p The current user's personal name preference ~d A random integer expressed as 4 hex digits ~y The current date and time in RFC822 format ~%name% The value of environment variable %name% ~lname~l The user's address looked up from a synonym file ~a The Pegasus Mail executable directory ~h The current user's home mailbox ~w The current user's new mailbox ~~ A single tilde (~). Examples: Assuming that the current user's name is "david" and the variable "sub" has been assigned the value "your order", the string "This is a message from ~8, regarding ~vsub~" would yield the following string after substitution: "This is a message from david, regarding your order." Command substitution is the single most powerful feature of the scripting language used for templates, and a good understanding of what it can do is essential for writing useful scripts. 4.4: Script language commands The following commands are valid in template scripts. title Set the title for a template script helpfile Set the help file for a template script picture Add a picture to the variable prompt dialog text Add a line of informational text to the prompt dialog option Set options controlling the way the template is processed string Create a string variable for the script set Set a message field or variable value insert Write a formatted line into the message body include Include a file or the original message body attach Attach a file to the message extract Extract elements from an e-mail address lookup Look up an item from a list using a key value chain Execute another template when the current template finishes # title Set the title for the script file. string can be any string up to 50 characters in length, and can contain all command substitutions except for variables, which are not defined at the time this command is processed. # helpfile [section] Set the help file which should be accessed when the user clicks the Help button in the variable prompt dialog. filename should be a full reference to any valid Windows Help file (*.HLP) on your system, and may contain all command substitions except for variables, which will have not been defined at the time this command is processed. section is an optional integer value that indicates the context help section within the help file that should be presented when the help button is pressed. If it is absent, section 0, the table of contents, is presented. # option = This command controls aspects of the way the template behaves as it is being processed. One option_name value is currently defined: "EDITOR" = "Yes" or "No". - Determines the state of the "Send message without opening a message editor" control in the template's variable dialog. Example: OPTION EDITOR = NO - Checks the "send without editor" control by default. # string ["Default"] ["Prompt"] [len] [flags] Define a variable for use within the script. A maximum of 20 variables may be defined for any script. name is the name for the variable; it must not contain spaces, and is not case-sensitive (so var1 and VAR1 are considered the same). All the parameters following the name parameter are optional, and you can end the string early if you wish (you cannot omit a parameter if you need to supply a parameter following it on the line). "default" is a string which should be used as a default value for the variable: if it contains spaces or special characters, it must be enclosed in quotes (see "String literals", above, for more information). If this parameter is omitted, the default value is an empty string. "prompt" is the string Pegasus Mail should place next to the editing field in the variable prompt dialog. If omitted or zero-length, Pegasus Mail will not prompt the user for a value for this variable. "len" is an integer defining the maximum allowable length of this variable. If omitted, the default is "no limit". "flags" defines the format and type of the variable: the following flag values are available: multiline creates a multi-line variable address creates an e-mail address variable filename creates a filename variable password creates a password variable list creates a list - see below for more details uppercase specifies that the variable must be all in uppercase Only "uppercase" may be used with other values. Creating LIST variables When you use the LIST flag in a STRING statement, you create a variable that has a list of possible values from which the user can select. LIST variables require that you provide a DEFAULT value for the variable, which contains the list of possible values the variable can have. The first character in the default value should be the character used to separate the list items from each other, and the remainder of the default value should be the items, separated by that character. Example: you want to allow the user to select from the values "Red", "Green" and "Blue": your string statement would look like this: string v1 ";Red;Green;Blue" "Select a colour" 0 list # set = <"value"> or set variable = <"value"> The first form of this command sets a field within the mail message being generated to the specified value. field may be one of the following: to cc bcc reply-to subject identity (all take an obvious string parameter) urgent confirm-reading confirm-delivery copyself volatile mime (all take either a "Y" or "N" parameter) header (a fully-formed e-mail header including the keyword) encrypted ("encryptor_name", "password", "flags" - see below for more details). When encrypting a template message, use the "encrypted" parameter to the set command. "encryptor" is the name of the module that should be used for encryption - to use the Pegasus Mail built in encryptor, use the name "builtin". "password" is the password for the message - this can be up to 96 characters in length. "flags" controls the type of encryption performed; to encrypt a message, set it to 1; to add a digital signature to the message, set it to 4; to perform both operations, set it to 5. The "volatile" parameter tells Pegasus Mail to write the message directly to final form when sending using the built-in SMTP transport. You will need to set this to "Y" if you are attaching files that will be deleted once the template has been processed. The second form of the "set" command sets the value of any defined variable. Both forms of this command support all command substitutions for the value parameter. To copy the value of one variable to another, use an expression containing the ~v command substitution, like this: set variable v1 = "~vv2~" # insert <"string"> Write data into the body of the message being generated. string can contain any command substitution: if it does not contain a ~z substitution to force a line break, then the next insert command will write data onto the same line in the body. A single insert command may not insert more than 1024 characters into the message body. # include [count] [flags] or include message [count] [flags] Include either a text file, or the body from the message to which a reply is being generated. The text from the file or message is included as-is into the message body - command substitutions are not performed on the included data. The filename parameter may contain any valid command substitutions. If "count" is present and non-zero, only that many lines of the included file or the body of the included message will be read. The "flags" item can be any combination of the following values: quoted "Comment-out" the included text using "> " noheaders If the file is a message, omit its RFC822 headers keyheaders If the file is a message, include only "significant" headers nobody If the file is a message, omit the message body message Only valid for files: the file is an RFC822 message # attach [type] [encoding] ["Desc"] Attach a file to the generated message. Only "filename" is a mandatory parameter - the others can be omitted and are sensibly defaulted. Any valid command substitution can be used in the filename. If the filename contains spaces, it must be quoted. "type" is any string describing the type of the file - for instance, "RTF_FILE". It must not contain spaces and is not constrained to the list of possible values inside Pegasus Mail itself. "encoding" is an integer value that specifies how the file should be encoded for transfer; the following values are defined - 0 (Pegasus Mail decides), 1 (No encoding - very dangerous), 2 (ASCII text), 3 (UUencoding), 4 (BinHex 4.0) and 5 (Basic MIME encoding). Unless you are sure of what you are doing, use 0 for this field. "desc" is a textual description of the file; it may contain any text, including spaces, and is truncated at 63 characters. # picture Add a picture at the top of the variable prompt dialog. The picture specified by filename must be a Windows BMP file in 16 or 256 colours: owing to quirks in the way Windows handles 256 colour bitmaps, we strongly recommend that you use 16-colour bitmaps if your display runs in 256 colour mode or lower. For the Win16 version of Pegasus Mail, the bitmap must not be larger than 60,000 bytes. You may use any command substitution in the filename parameter. The bitmap is centred horizontally in the display and the dialog will adjust size to fit the vertical dimensions of the image. Exactly one image may be added to the dialog. flags will be used in future to offer extra formatting options. For now, it is unused, must be present, and should be set to zero. Note: if the filename contains spaces or special characters, it must be enclosed in quotes. # text <"string"> Add a line of descriptive text to the dialog presented to prompt for script variables. The line of text is added above any variable editing fields, and below any picture defined using a picture command. You may specify up to 10 lines of descriptive text, and each line may contain any valid command substitution. The "flags" parameter will be used in future, but should currently be set to zero. To introduce a blank line between groups of lines, use a text statement with an empty quoted string - like this: text "". # extract address or extract text or extract user or extract domain Extract a component from an e-mail address. "var1" refers to the variable containing the address to be manipulated. "var2" is the variable where the result of the manipulation should be placed - it can be the same as "var1". extract address yields the minimum form of the e-mail address extract text yields the personal name field from the address extract user yields the simple user name portion of the address extract domain yields the domain portion of the address # lookup "string" Attempt to locate the string "string" in the list variable "var1"; if a match is found, note the position in the list where the item was matched, then copy the item at the same ordinal position in the list variable "var2" into the variable "var3". See above under the description of the "set" command for more information on list variables. It is an error for either "var1" or "var2" to be anything other than a list variable. If "string" cannot be found in "var1", variable "var3" is not changed. Example: list variable "v1" contains "Monday", "Tuesday" and "Wednesday" list variable "v2" contains "Open", "Closed" and "Open". The command lookup "Tuesday" v1 v2 v3 will result in variable v3 containing the value "Closed". A common form of this command will use the current value of "var1" as the string parameter, using the command substitution "~vvar1~". # chain "filename" Execute another template when the current template completes. "filename" should be the path to a valid template file, and may contain command substitutions. Only one "chain" command may be used per template. If the current template is cancelled by the user, the chain command will not be executed.