<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
  "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">

<!--

  To generate the appropriate man page for your OS, do:

  sed -e 's/@CONF@/\/etc\/mail\/milter-regex.conf/g' \
	-e 's/@OCONN@/local:\/var\/milter\/milter-regex.sock/g' \
	milter-regex.dbk > milter-regex.dbk.man

  xsltproc -stringparam "profile.os" "solaris" \
	/usr/apps/docbook/xsl/1.65.1/profiling/profile.xsl \
	milter-regex.dbk.man > milter-regex.xml
  xsltproc /usr/apps/docbook/xsl/1.65.1/manpages/docbook.xsl \
	milter-regex.xml

  Instead of "solaris" you may use "linux" or "bsd" as well.
-->
	
<refentry id="regex-milter">
	<refentryinfo>
		<date>September 24, 2003</date>
		<productname>milter-regex 1.5</productname>
		<title os="solaris">System Administration Commands</title>
		<title os="linux">Linux System Administration</title>
		<title os="bsd">BSD System Manager's Manual</title>
	</refentryinfo>
	
	<refmeta>
		<refentrytitle>milter-regex</refentrytitle>
		<!-- can't use pretty print since content is not space normalized -->
		<manvolnum><remark 
			os="solaris">1M</remark><remark 
			os="linux">8</remark><remark 
			os="bsd">8</remark></manvolnum>
	</refmeta>
	<refnamediv>
		<refname>milter-regex</refname>
		<refpurpose>sendmail milter plugin for regular expression 
			filtering</refpurpose>
	</refnamediv>
	
	<refsynopsisdiv>
		<cmdsynopsis>
			<command>milter-regex</command>
			<arg>-d</arg>
			<arg>-c <replaceable class="parameter">config</replaceable></arg>
			<arg>-n</arg>
			<arg>-p <replaceable class="parameter">pipe</replaceable></arg>
			<arg>-u <replaceable class="parameter">user</replaceable></arg>
		</cmdsynopsis>
	</refsynopsisdiv>

	<refsection>
		<title>Description</title>
		<para>
The <command>milter-regex</command> plugin can be used with the milter API of 
<citerefentry os="bsd">
	<refentrytitle>sendmail</refentrytitle>
	<manvolnum>8</manvolnum>
</citerefentry><citerefentry os="linux">
	<refentrytitle>sendmail</refentrytitle>
	<manvolnum>8</manvolnum>
</citerefentry><citerefentry os="solaris">
	<refentrytitle>sendmail</refentrytitle>
	<manvolnum>1M</manvolnum>
</citerefentry> to filter mails using regular expressions matching SMTP 
envelope parameters and mail headers and body.</para>
	</refsection>
	
	<refsection>
		<title>Options</title>
		<variablelist>
			<varlistentry>
				<term>-d</term>
				<listitem><para>
Enable verbose debug output, which will be logged via <citerefentry os="bsd">
	<refentrytitle>syslog</refentrytitle>
	<manvolnum>3</manvolnum>
</citerefentry><citerefentry os="linux">
	<refentrytitle>syslog</refentrytitle>
	<manvolnum>3</manvolnum>
</citerefentry><citerefentry os="solaris">
	<refentrytitle>syslog</refentrytitle>
	<manvolnum>3C</manvolnum>
</citerefentry> at the debug 
level for the mail facility. In case you are logging to a file, make sure
to have a lot of space at the partition in question!</para>
				</listitem>
			</varlistentry>
			<varlistentry>
				<term>-c 
					<replaceable class="parameter">config</replaceable></term>
				<listitem><para>
Use the specified configuration file instead of the default, @CONF@.</para>
				</listitem>
			</varlistentry>
			<varlistentry>
				<term>-n</term>
				<listitem><para>
Usually <command>milter-regex</command> adds a  heading  to  messages that 
are scanned. The header is of the form "X-Milter: <varname>version</varname>", 
this option instructs regex-milter to refrain from adding this heading.</para>
				</listitem>
			</varlistentry>
			<varlistentry>
				<term>-p 
					<replaceable class="parameter">pipe</replaceable></term>
				<listitem><para>
Use the specified pipe to interface <citerefentry os="bsd">
	<refentrytitle>sendmail</refentrytitle>
	<manvolnum>8</manvolnum>
</citerefentry><citerefentry os="linux">
	<refentrytitle>sendmail</refentrytitle>
	<manvolnum>8</manvolnum>
</citerefentry><citerefentry os="solaris">
	<refentrytitle>sendmail</refentrytitle>
	<manvolnum>1M</manvolnum>
</citerefentry>.  Default is @OCONN@.</para>
				</listitem>
			</varlistentry>
			<varlistentry>
				<term>-u 
					<replaceable class="parameter">user</replaceable></term>
				<listitem><para>
Run as the specified user instead of the default, smmsp.  When 
<command>milter-regex</command> 
is started as root, it calls <citerefentry>
	<refentrytitle>setuid</refentrytitle>
	<manvolnum>2</manvolnum>
</citerefentry> to drop privileges.  The non-privileged 
user should have read access to the configuration file and read-write access 
to the pipe.</para>
				</listitem>
			</varlistentry>
		</variablelist>
	</refsection>
	
	<refsection>
		<title>Sendmail Configuration</title>
		<para><citerefentry os="bsd">
	<refentrytitle>sendmail</refentrytitle>
	<manvolnum>8</manvolnum>
</citerefentry><citerefentry os="linux">
	<refentrytitle>sendmail</refentrytitle>
	<manvolnum>8</manvolnum>
</citerefentry><citerefentry os="solaris">
	<refentrytitle>sendmail</refentrytitle>
	<manvolnum>1M</manvolnum>
</citerefentry> needs to have milter support. To check, whether your sendmail 
has milter support, you may run:</para>
		<programlisting>
  <phrase os="solaris">/usr/lib/</phrase
  ><phrase os="linux">/usr/sbin/</phrase
  ><phrase os="bsd">/usr/sbin/</phrase>sendmail -d0.1 -bp | grep MILTER
		</programlisting>
		
		<para>
If <constant>MILTER</constant> appears in the output, sendmail supports 
<acronym>M</acronym>ail F<acronym>ilter</acronym>.</para>
		<para>
The milter aka plugin needs to be registered in the <citerefentry os="bsd">
	<refentrytitle>sendmail</refentrytitle>
	<manvolnum>8</manvolnum>
</citerefentry><citerefentry os="linux">
	<refentrytitle>sendmail</refentrytitle>
	<manvolnum>8</manvolnum>
</citerefentry><citerefentry os="solaris">
	<refentrytitle>sendmail</refentrytitle>
	<manvolnum>1M</manvolnum>
</citerefentry> configuration, 
by adding the following lines to your sendmail m4 configuration file</para>
	<informalexample><programlisting>
  INPUT_MAIL_FILTER(`milter-regex', `S=@OCONN@, T=S:30s;R:2m')</programlisting>
	</informalexample>
		<para>
and rebuilding /etc/mail/sendmail.cf (e.g. cd /etc/mail;  
./mknewcf -c server.mc) and restarting <citerefentry os="bsd">
	<refentrytitle>sendmail</refentrytitle>
	<manvolnum>8</manvolnum>
</citerefentry><citerefentry os="linux">
	<refentrytitle>sendmail</refentrytitle>
	<manvolnum>8</manvolnum>
</citerefentry><citerefentry os="solaris">
	<refentrytitle>sendmail</refentrytitle>
	<manvolnum>1M</manvolnum>
</citerefentry>.</para>
	</refsection>
	
	<refsection>
		<title>Plugin Configuration</title>
		<para>
The configuration file consists of rules that, when matched, cause <citerefentry os="bsd">
	<refentrytitle>sendmail</refentrytitle>
	<manvolnum>8</manvolnum>
</citerefentry><citerefentry os="linux">
	<refentrytitle>sendmail</refentrytitle>
	<manvolnum>8</manvolnum>
</citerefentry><citerefentry os="solaris">
	<refentrytitle>sendmail</refentrytitle>
	<manvolnum>1M</manvolnum>
</citerefentry> 
to reject mails.  Emtpy lines and lines starting with # are ignored, as well as 
leading whitespace (blanks, tabs).  Trailing backslashes can be used to wrap 
long rules into multiple lines.  Each rule  starts with one of the following 
commands:</para>

		<variablelist>
			<varlistentry>
				<term><command> reject</command> 
				<errortext>"message"</errortext></term>
				<listitem><para>
Subsequent rules cause the mail to be rejected with a permanent error 
consisting of the specified text part.  The SMTP reply consists of the 
three-digit code <errorcode>550</errorcode> (RFC 2821 
<errortext>"command rejected for policy reasons"</errortext>), 
the extended reply code <errorcode>5.7.1</errorcode> (RFC 1893 
<errortext>"Permanent Failure"</errortext>, <errortext>"Security 
or Policy Status"</errortext>, <errortext>"Delivery not 
authorized, message refused"</errortext>) and the 
text part (which defaults to <errortext>"Command rejected"</errortext>, 
if not specified).  
This is a permanent failure, which causes the sender to remove the message 
from its queue without trying to retransmit, commonly generating a bounce 
message to the sender.</para>
				</listitem>
			</varlistentry>
			<varlistentry>
				<term><command> tempfail</command> 
				<errortext>"message"</errortext></term>
				<listitem><para>
Subsequent matching rules cause the mail to be rejected with a temporary 
error consisting of the specified text part.  The SMTP reply consists of 
the three-digit code <errorcode>451</errorcode> (RFC 2821 
<errortext>"Requested action aborted: local error 
in processing"</errortext>), the extended reply code <errorcode>4.7.1</errorcode> 
(RFC 1893 <errortext>"Persistent 
Transient Failure"</errortext>, <errortext>"Security or Policy 
Status"</errortext>, <errortext>"Delivery not authorized, 
message refused"</errortext>) and the text part (which defaults to 
<errortext>"Please try again later"</errortext>, if not specified).  
This is a temporary failure, which causes the 
sender to keep the message in its queue and try to retransmit it, commonly 
for several days.</para>
				</listitem>
			</varlistentry>
			<varlistentry>
				<term><command> discard </command></term>
				<listitem><para>
Subsequent matching rules cause the mail to be accepted but then discarded 
silently.  Note that <command>connect</command> and <command>helo</command> 
rules should not use <command>discard</command>.</para>
				</listitem>
			</varlistentry>
			<varlistentry>
				<term><command> accept </command></term>
				<listitem>
<para>
Subsequent matching rules cause the mail to be accepted without further rule 
evaluation.  Can be used for whitelist criteria.</para>
				</listitem>
			</varlistentry>			
		</variablelist>
		
		<para>
A command is followed by one or more expressions, each causing the previous 
command to be executed when matched.  The following expressions can be 
used:</para>

		<variablelist>
			<varlistentry>
				<term><command>connect</command> <varname>hostname</varname>
				<varname>address</varname></term>
				<listitem><para>
Reject the connection if both the sender's hostname and address match the 
specified regular expressions.  The numerical address is either dotted-quad 
(IPv4) or coloned-hex (IPv6).  The hostname is the result of a DNS reverse 
resolution of the numerical address (which <citerefentry os="bsd">
	<refentrytitle>sendmail</refentrytitle>
	<manvolnum>8</manvolnum>
</citerefentry><citerefentry os="linux">
	<refentrytitle>sendmail</refentrytitle>
	<manvolnum>8</manvolnum>
</citerefentry><citerefentry os="solaris">
	<refentrytitle>sendmail</refentrytitle>
	<manvolnum>1M</manvolnum>
</citerefentry> performs independantly 
of the milter plugin). When resolution fails, the hostname contains the 
numerical address in square brackets.</para>
				</listitem>
			</varlistentry>
			<varlistentry>
				<term><command>helo</command> <varname>name</varname></term>
				<listitem><para>
Reject the connection if the sender supplied <command>HELO</command> name 
matches the specified regular expression.  Commonly, the sender supplies his 
fully-qualified hostname as <command>HELO</command> name.
</para>
				</listitem>
			</varlistentry>
			<varlistentry>
				<term><command>envfrom</command> <varname>address</varname>
				</term>
				<listitem><para>
Reject the mail if the sender supplied envelope <command>MAIL FROM</command> 
address matches the specified regular expression.  Addresses commonly have the 
form <email>user@host.doma.in</email>.</para>
				</listitem>
			</varlistentry>
			<varlistentry>
				<term><command>envrcpt</command> <varname>address</varname>
				</term>
				<listitem><para>
Reject the mail if the sender supplied envelope <command>RCPT TO</command> 
address matches the specified regular expression.</para>
				</listitem>
			</varlistentry>
			<varlistentry>
				<term><command>header</command> <varname>name</varname> 
					<varname>value</varname></term>
				<listitem><para>
Reject the mail if a header matches the specified name and value. 
For instance, the header <phrase>"Subject: Test"</phrase> 
matches name Subject and value Test.
</para>
				</listitem>
			</varlistentry>
			<varlistentry>
				<term><command>body</command> <varname>line</varname></term>
				<listitem><para>
Reject the mail if a body line matches the specified regular expression.</para>
				</listitem>
			</varlistentry>
		</variablelist>
	</refsection>
	
	<refsection>
		<title>Regular Expressions</title>
		<para>
The regular expressions used in the configuration rules are enclosed in 
arbitrary delimiters, no further escaping is needed.</para>
		<para>
The first character of an argument is taken as the delimiter, and all 
subsequent characters up to the next occurance of the same delimiter are 
taken literally as the regular expression.  Since the delimiter itself cannot 
be part of the regular expression (no escaping is supported), a delimiter must 
be chosen that doesn't occur in the regular expression itself.  Each argument 
can use a different delimiter, all characters except spaces and tabs are 
valid.</para>
		<para>
Two immediately adjacent delimiters form an empty regular expression, which 
always matches and requires no <citerefentry os="solaris">
	<refentrytitle>regexec</refentrytitle>
	<manvolnum>3C</manvolnum>
</citerefentry><citerefentry os="bsd">
	<refentrytitle>regexec</refentrytitle>
	<manvolnum>3</manvolnum>
</citerefentry><citerefentry os="linux">
	<refentrytitle>regexec</refentrytitle>
	<manvolnum>3</manvolnum>
</citerefentry> call.  This can be used in rules 
requiring multiple arguments, to match only some arguments.</para>
		<para>
See <citerefentry os="bsd">
	<refentrytitle>re_format</refentrytitle>
	<manvolnum>7</manvolnum>
</citerefentry><citerefentry os="solaris">
	<refentrytitle>regex</refentrytitle>
	<manvolnum>5</manvolnum>
</citerefentry><citerefentry os="linux">
	<refentrytitle>regex</refentrytitle>
	<manvolnum>7</manvolnum>
</citerefentry> for a detailed description of basic and extended regular 
expressions.</para>
<para>
Optionally, the following flags can be used after the closing delimiter:
</para>
		<variablelist>
			<varlistentry>
				<term><command>e</command></term>
				<listitem><para>
Extended regular expression.  This sets <constant>REG_EXTENDED</constant> for 
<citerefentry os="solaris">
	<refentrytitle>regcomp</refentrytitle>
	<manvolnum>3C</manvolnum>
</citerefentry><citerefentry os="bsd">
	<refentrytitle>regcomp</refentrytitle>
	<manvolnum>3</manvolnum>
</citerefentry><citerefentry os="linux">
	<refentrytitle>regcomp</refentrytitle>
	<manvolnum>3</manvolnum>
</citerefentry>.</para>
				</listitem>
			</varlistentry>
			<varlistentry>
				<term><command>i</command></term>
				<listitem><para>
Ignore upper/lower case.  This sets <constant>REG_ICASE</constant>.</para>
				</listitem>
			</varlistentry>
			<varlistentry>
				<term><command>n</command></term>
				<listitem><para>
Not matching.  Reverses the matching result, i.e. the mail is rejected if the 
regular expression does not match.</para>
				</listitem>
			</varlistentry>
			
		</variablelist>
	
	</refsection>

	<refsection>
		<title>Boolean Expressions</title>
		<para>
A rule can consist of either a simple term or more complex expressions.  A 
term has the form</para>
		<programlisting>
  header /From/ /domain/i
</programlisting>
		<para>
and expressions can be built combining terms with operators 
<constant>and</constant>, <constant>or</constant>, <constant>not</constant> 
and <constant>( )</constant>, as in</para>
		<programlisting>
  header /From/ /domain/i and body /money/ \
      ( not header /From/ /domain/ ) and ( body /sex/ or body /fast/ )
		</programlisting>
		<para>
Operator precedence should not be relied on, instead parentheses should be used 
to resolve any ambiguities (they usually produce syntax errors from the parser).
</para>
	</refsection>

	<refsection>
		<title>Macros</title>
		<para>
Macros allow to store terms or expressions as a <varname>name</varname>, and 
<varname>$name</varname> can be used as term within other rules, expressions or 
macro definitions.  Example:</para>
	<programlisting>
  friends         = header /^Received$/ /^from [^ ]*(ork.net|home.com)/e 
  attachments     = header ,^Content-Type$, ,multipart/mixed, and \ 
                    body ,^Content-Type: application/,
  executables     = $attachments and body ,name=".*.(pif|exe|scr)"$,e
  
  reject "executable attachment from non-friends"
  $executables and not $friends
	</programlisting>
	<para>
Macro names must begin with a letter and may contain alphanumeric characters and 
punctuation characters.  Reserved keywords (like <command>reject</command> or 
<command>header</command>) cannot be used as macro names.  Macros must be defined 
before use, the definition must precede the use in the configuration file, 
read from top to bottom.</para>
	</refsection>
	
	<refsection>
		<title>Evaluation</title>
		<para>
Rules are evaluated in the order specified in the configuration file, from top 
to bottom.  When a rule matches, the correpsonding action is taken, that is the 
last action specified before the matching rule.</para>
		<para>
The plugin evaluates the rules every time a line of mail (or envelope) is 
received.  As soon as a rule matches, the action is taken immediately, possibly 
before the entire mail is received, even if further lines might possibly make 
other rules match, too.  This means the first rule matching chronologically has 
precendence.</para>
		<para>
If evaluation for a line of mail makes two (or more) rules match, the rule that 
comes first in the configuration file has precendence.</para>
		<para>
Boolean expressions are short-circuit evaluated, that means "a or b" becomes 
true as soon as one of the terms is true and "a and b" becomes false as soon as 
one of the terms is false, even if the other term is not known, possibly because 
the relevant mail line has not been received yet.</para>
	</refsection>
	
	<refsection>
		<title>Examples</title>
		<programlisting>
   # /etc/mail/milter-regex.conf example

   tempfail "Sender IP address not resolving"
   connect /\[.*\]/ //

   reject "Malformed HELO (not a domain, no dot)"
   helo /\./n

   reject "Malformed RCPT TO (not an email address, not &lt;.*@.*&gt;)"
   envrcpt /&lt;(.*@.*|Postmaster)&gt;/ein

   reject "HTML mail not accepted"
   # use comma as delimiter here, as / occurs within RE
   header /^Content-type$/i ,^text/html,i
   body ,^Content-type: text/html,i

   # Swen worm
   discard
   header /^(TO|FROM|SUBJECT)$/e //
   header /^Content-type$/i /boundary="Boundary_(ID_/i
   header /^Content-type$/i /boundary="[a-z]*"/
   body ,^Content-type: audio/x-wav; name="[a-z]*\.[a-z]*",i

   # Some nasty spammer
   reject "Business Corp spam, get lost"
   body /^Business Corp. for W.&amp; L. AG/i and \
       ( body /043.*317.*0285/ or body /0041.43.317.02.85/ )
		</programlisting>
	</refsection>
	
	<refsection>
		<title>Logging</title>
		<para>
milter-regex sends log messages to <citerefentry os="solaris">
	<refentrytitle>syslogd</refentrytitle>
	<manvolnum>1M</manvolnum>
</citerefentry><citerefentry os="linux">
	<refentrytitle>syslogd</refentrytitle>
	<manvolnum>8</manvolnum>
</citerefentry><citerefentry os="bsd">
	<refentrytitle>syslogd</refentrytitle>
	<manvolnum>8</manvolnum>
</citerefentry> using facility mail and, with 
increasing verbosity, level err, notice, info and debug.  The following 
<citerefentry os="solaris">
	<refentrytitle>syslog.conf</refentrytitle>
	<manvolnum>4</manvolnum>
</citerefentry><citerefentry os="linux">
	<refentrytitle>syslog.conf</refentrytitle>
	<manvolnum>5</manvolnum>
</citerefentry><citerefentry os="bsd">
	<refentrytitle>syslog.conf</refentrytitle>
	<manvolnum>5</manvolnum>
</citerefentry> section can be used to log messages to a dedicated file:</para>
	<programlisting>
  mail.err;mail.notice    /var/log/milter-regex.log
  mail.debug              /var/aLotOfSpaceAvailable/mail-debug.log
	</programlisting>
	</refsection>
	
	<refsection>
		<title>Grammar</title>
		<para>Syntax for <command>milter-regex</command> in BNF:</para>
		<programlisting>
   file            = ( rule | macro ) file
   rule            = action expr-list
   action          = "reject" msg | "tempfail" msg | "discard" | "accept"
   msg             = ( '"' | "'" ) string ( '"' | "'" )
   expr-list       = expr [ expr-list ]
   expr            = term | term "and" expr | term "or" expr | "not" term
   term            = '(' expr ')' | "connect" arg arg | "helo" arg |
                     "envfrom" arg | "envrcpt" arg | "header" arg arg |
                     "body" arg | '$' name
   arg             = del regex del flags
   del             = '/' | ',' | '-' | ...
   flags           = [ 'e' ] [ 'i' ] [ 'n' ]
   macro           = name '=' expr
		</programlisting>
	</refsection>
	
	<refsection>
		<title>Files</title>
		<variablelist>
			<varlistentry>
				<term><filename>@CONF@</filename></term>
				<listitem><para>default configuration file</para></listitem>
			</varlistentry>
		</variablelist>
		
	</refsection>
	
	<refsection>
		<title>See Also</title>
		<para>
			<citerefentry os="solaris">
					<refentrytitle>regcomp</refentrytitle>
					<manvolnum>3C</manvolnum>
				</citerefentry><citerefentry os="bsd">
					<refentrytitle>regcomp</refentrytitle>
					<manvolnum>3</manvolnum>
				</citerefentry><citerefentry os="linux">
					<refentrytitle>regcomp</refentrytitle>
					<manvolnum>3</manvolnum>
			</citerefentry>, <citerefentry os="solaris">
					<refentrytitle>syslog.conf</refentrytitle>
					<manvolnum>4</manvolnum>
				</citerefentry><citerefentry os="linux">
					<refentrytitle>syslog.conf</refentrytitle>
					<manvolnum>5</manvolnum>
				</citerefentry><citerefentry os="bsd">
					<refentrytitle>syslog.conf</refentrytitle>
					<manvolnum>5</manvolnum>
			</citerefentry>, <citerefentry os="bsd">
					<refentrytitle>re_format</refentrytitle>
					<manvolnum>7</manvolnum>
				</citerefentry><citerefentry os="solaris">
					<refentrytitle>regex</refentrytitle>
					<manvolnum>5</manvolnum>
				</citerefentry><citerefentry os="linux">
					<refentrytitle>regex</refentrytitle>
					<manvolnum>7</manvolnum>
			</citerefentry>, <citerefentry os="bsd">
					<refentrytitle>sendmail</refentrytitle>
					<manvolnum>8</manvolnum>
				</citerefentry><citerefentry os="linux">
					<refentrytitle>sendmail</refentrytitle>
					<manvolnum>8</manvolnum>
				</citerefentry><citerefentry os="solaris">
					<refentrytitle>sendmail</refentrytitle>
					<manvolnum>1M</manvolnum>
			</citerefentry>, <citerefentry os="solaris">
					<refentrytitle>syslogd</refentrytitle>
					<manvolnum>1M</manvolnum>
				</citerefentry><citerefentry os="linux">
					<refentrytitle>syslogd</refentrytitle>
					<manvolnum>8</manvolnum>
				</citerefentry><citerefentry os="bsd">
					<refentrytitle>syslogd</refentrytitle>
					<manvolnum>8</manvolnum>
			</citerefentry> 
		</para>
		<para><citetitle>The Internet Society (2001), <ulink 
			url="http://www.faqs.org/rfcs/rfc2821.html"><citetitle>RFC 2821 - 
				Simple Mail Transfer Protocol</citetitle></ulink>, 
				AT&amp;T Laboratories, April 2001</citetitle>
		</para>
		<para><citetitle>G. Vaudreuil, <ulink 
			url="http://www.faqs.org/rfcs/rfc1893.html"><citetitle>RFC 1893 - 
				Enhanced Mail System Status Codes</citetitle></ulink>, 
				Octel Network Services, January 1996</citetitle>
		</para>
	</refsection>
	
	<refsection>
		<title>History</title>
		<para>
The first version of milter-regex was written in 2003.  Boolean expression 
evaluation was added in 2004.</para>
	</refsection>

	<refsection>
		<title>Authors</title>
		<itemizedlist>
			<listitem><para>Daniel Hartmeier <email>daniel@benzedrine.cx</email>
			</para></listitem>
		</itemizedlist>		
	</refsection>
	
</refentry>
