xref: /freebsd/contrib/sendmail/libmilter/README (revision 5b0945b57059d1cde0831d3afea7ec56c7d79508)
106f25ae9SGregory Neil ShapiroThis directory contains the source files for libmilter.
206f25ae9SGregory Neil Shapiro
306f25ae9SGregory Neil ShapiroThe sendmail Mail Filter API (Milter) is designed to allow third-party
406f25ae9SGregory Neil Shapiroprograms access to mail messages as they are being processed in order to
506f25ae9SGregory Neil Shapirofilter meta-information and content.
606f25ae9SGregory Neil Shapiro
706f25ae9SGregory Neil ShapiroThis README file describes the steps needed to compile and run a filter,
806f25ae9SGregory Neil Shapirothrough reference to a sample filter which is attached at the end of this
906f25ae9SGregory Neil Shapirofile.  It is necessary to first build libmilter.a, which can be done by
1006f25ae9SGregory Neil Shapiroissuing the './Build' command in SRCDIR/libmilter .
1106f25ae9SGregory Neil Shapiro
12e92d3f3fSGregory Neil ShapiroStarting with 8.13 sendmail is compiled by default with support for
13e92d3f3fSGregory Neil Shapirothe milter API.
1406f25ae9SGregory Neil Shapiro
154e4196cbSGregory Neil ShapiroNote: if you want to write a milter in Java, then see
164e4196cbSGregory Neil Shapirohttp://sendmail-jilter.sourceforge.net/
174e4196cbSGregory Neil Shapiro
1840266059SGregory Neil Shapiro+----------------+
1940266059SGregory Neil Shapiro| SECURITY HINTS |
2040266059SGregory Neil Shapiro+----------------+
2140266059SGregory Neil Shapiro
2240266059SGregory Neil ShapiroNote: we strongly recommend not to run any milter as root.  Libmilter
2340266059SGregory Neil Shapirodoes not need root access to communicate with sendmail.  It is a
2440266059SGregory Neil Shapirogood security practice to run a program only with root privileges
2540266059SGregory Neil Shapiroif really necessary.  A milter should probably check first whether
26e92d3f3fSGregory Neil Shapiroit runs as root and refuse to start in that case.  libmilter will
27e92d3f3fSGregory Neil Shapironot unlink a socket when running as root.
2840266059SGregory Neil Shapiro
29e92d3f3fSGregory Neil Shapiro+----------------------+
30e92d3f3fSGregory Neil Shapiro| CONFIGURATION MACROS |
31e92d3f3fSGregory Neil Shapiro+----------------------+
3240266059SGregory Neil Shapiro
33e92d3f3fSGregory Neil ShapiroLibmilter uses a set of C preprocessor macros to specify platform specific
34e92d3f3fSGregory Neil Shapirofeatures of the C compiler and standard C libraries.
35e92d3f3fSGregory Neil Shapiro
36e92d3f3fSGregory Neil ShapiroSM_CONF_POLL
37e92d3f3fSGregory Neil Shapiro	Set to 1 if poll(2) should be used instead of select(2).
3806f25ae9SGregory Neil Shapiro
3906f25ae9SGregory Neil Shapiro+-------------------+
4006f25ae9SGregory Neil Shapiro| BUILDING A FILTER |
4106f25ae9SGregory Neil Shapiro+-------------------+
4206f25ae9SGregory Neil Shapiro
4306f25ae9SGregory Neil ShapiroThe following command presumes that the sample code from the end of this
4406f25ae9SGregory Neil ShapiroREADME is saved to a file named 'sample.c' and built in the local platform-
4506f25ae9SGregory Neil Shapirospecific build subdirectory (SRCDIR/obj.*/libmilter).
4606f25ae9SGregory Neil Shapiro
4713bd1963SGregory Neil Shapiro	cc -I../../include -o sample sample.c libmilter.a ../libsm/libsm.a -pthread
4806f25ae9SGregory Neil Shapiro
4906f25ae9SGregory Neil ShapiroIt is recommended that you build your filters in a location outside of
5006f25ae9SGregory Neil Shapirothe sendmail source tree.  Modify the compiler include references (-I)
5106f25ae9SGregory Neil Shapiroand the library locations accordingly.  Also, some operating systems may
5206f25ae9SGregory Neil Shapirorequire additional libraries.  For example, SunOS 5.X requires '-lresolv
5340266059SGregory Neil Shapiro-lsocket -lnsl'.  Depending on your operating system you may need a library
5440266059SGregory Neil Shapiroinstead of the option -pthread, e.g., -lpthread.
5506f25ae9SGregory Neil Shapiro
5606f25ae9SGregory Neil ShapiroFilters must be thread-safe!  Many operating systems now provide support for
5706f25ae9SGregory Neil ShapiroPOSIX threads in the standard C libraries.  The compiler flag to link with
5806f25ae9SGregory Neil Shapirothreading support differs according to the compiler and linker used.  Check
5906f25ae9SGregory Neil Shapirothe Makefile in your appropriate obj.*/libmilter build subdirectory if you
6006f25ae9SGregory Neil Shapiroare unsure of the local flag used.
6106f25ae9SGregory Neil Shapiro
62602a2b1bSGregory Neil ShapiroNote that since filters use threads, it may be necessary to alter per
63602a2b1bSGregory Neil Shapiroprocess limits in your filter.  For example, you might look at using
64602a2b1bSGregory Neil Shapirosetrlimit() to increase the number of open file descriptors if your filter
65602a2b1bSGregory Neil Shapirois going to be busy.
66602a2b1bSGregory Neil Shapiro
6706f25ae9SGregory Neil Shapiro
6806f25ae9SGregory Neil Shapiro+----------------------------------------+
6906f25ae9SGregory Neil Shapiro| SPECIFYING FILTERS IN SENDMAIL CONFIGS |
7006f25ae9SGregory Neil Shapiro+----------------------------------------+
7106f25ae9SGregory Neil Shapiro
7206f25ae9SGregory Neil ShapiroFilters are specified with a key letter ``X'' (for ``eXternal'').
7306f25ae9SGregory Neil Shapiro
7406f25ae9SGregory Neil ShapiroFor example:
7506f25ae9SGregory Neil Shapiro
7606f25ae9SGregory Neil Shapiro	Xfilter1, S=local:/var/run/f1.sock, F=R
7713058a91SGregory Neil Shapiro	Xfilter2, S=inet6:999@localhost, F=T, T=C:10m;S:1s;R:1s;E:5m
7806f25ae9SGregory Neil Shapiro	Xfilter3, S=inet:3333@localhost
7906f25ae9SGregory Neil Shapiro
8006f25ae9SGregory Neil Shapirospecifies three filters.  Filters can be specified in your .mc file using
8106f25ae9SGregory Neil Shapirothe following:
8206f25ae9SGregory Neil Shapiro
8306f25ae9SGregory Neil Shapiro	INPUT_MAIL_FILTER(`filter1', `S=local:/var/run/f1.sock, F=R')
8413058a91SGregory Neil Shapiro	INPUT_MAIL_FILTER(`filter2', `S=inet6:999@localhost, F=T, T=C:10m;S:1s;R:1s;E:5m')
8506f25ae9SGregory Neil Shapiro	INPUT_MAIL_FILTER(`filter3', `S=inet:3333@localhost')
8606f25ae9SGregory Neil Shapiro
8706f25ae9SGregory Neil ShapiroThe first attaches to a Unix-domain socket in the /var/run directory; the
8806f25ae9SGregory Neil Shapirosecond uses an IPv6 socket on port 999 of localhost, and the third uses an
8906f25ae9SGregory Neil ShapiroIPv4 socket on port 3333 of localhost.  The current flags (F=) are:
9006f25ae9SGregory Neil Shapiro
9106f25ae9SGregory Neil Shapiro	R		Reject connection if filter unavailable
9206f25ae9SGregory Neil Shapiro	T		Temporary fail connection if filter unavailable
93d0cef73dSGregory Neil Shapiro	4		Shut down connection if filter unavailable
94d0cef73dSGregory Neil Shapiro			(with a 421 temporary error).
9506f25ae9SGregory Neil Shapiro
96d0cef73dSGregory Neil ShapiroIf none of these is specified, the message is passed through sendmail
9740266059SGregory Neil Shapiroin case of filter errors as if the failing filters were not present.
9842e5d165SGregory Neil Shapiro
9906f25ae9SGregory Neil ShapiroFinally, you can override the default timeouts used by sendmail when
10013058a91SGregory Neil Shapirotalking to the filters using the T= equate.  There are four fields inside
10106f25ae9SGregory Neil Shapiroof the T= equate:
10206f25ae9SGregory Neil Shapiro
10306f25ae9SGregory Neil ShapiroLetter		Meaning
10413058a91SGregory Neil Shapiro  C		Timeout for connecting to a filter (if 0, use system timeout)
10506f25ae9SGregory Neil Shapiro  S		Timeout for sending information from the MTA to a filter
10606f25ae9SGregory Neil Shapiro  R		Timeout for reading reply from the filter
10706f25ae9SGregory Neil Shapiro  E		Overall timeout between sending end-of-message to filter
10806f25ae9SGregory Neil Shapiro		and waiting for the final acknowledgment
10906f25ae9SGregory Neil Shapiro
11006f25ae9SGregory Neil ShapiroNote the separator between each is a ';' as a ',' already separates equates
11113058a91SGregory Neil Shapiroand therefore can't separate timeouts.  The default values (if not set in
11213058a91SGregory Neil Shapirothe config) are:
11306f25ae9SGregory Neil Shapiro
11440266059SGregory Neil ShapiroT=C:5m;S:10s;R:10s;E:5m
11506f25ae9SGregory Neil Shapiro
11606f25ae9SGregory Neil Shapirowhere 's' is seconds and 'm' is minutes.
11706f25ae9SGregory Neil Shapiro
11842e5d165SGregory Neil ShapiroWhich filters are invoked and their sequencing is handled by the
1198774250cSGregory Neil ShapiroInputMailFilters option. Note: if InputMailFilters is not defined no filters
1208774250cSGregory Neil Shapirowill be used.
12142e5d165SGregory Neil Shapiro
12242e5d165SGregory Neil Shapiro	O InputMailFilters=filter1, filter2, filter3
12342e5d165SGregory Neil Shapiro
12442e5d165SGregory Neil ShapiroThis is is set automatically according to the order of the
12542e5d165SGregory Neil ShapiroINPUT_MAIL_FILTER commands in your .mc file.  Alternatively, you can
12642e5d165SGregory Neil Shapiroreset its value by setting confINPUT_MAIL_FILTERS in your .mc file.
12742e5d165SGregory Neil ShapiroThis options causes the three filters to be called in the same order
12842e5d165SGregory Neil Shapirothey were specified.  It allows for possible future filtering on output
12942e5d165SGregory Neil Shapiro(although this is not intended for this release).
13006f25ae9SGregory Neil Shapiro
13106f25ae9SGregory Neil ShapiroAlso note that a filter can be defined without adding it to the input
13206f25ae9SGregory Neil Shapirofilter list by using MAIL_FILTER() instead of INPUT_MAIL_FILTER() in your
13306f25ae9SGregory Neil Shapiro.mc file.
13406f25ae9SGregory Neil Shapiro
13506f25ae9SGregory Neil ShapiroTo test sendmail with the sample filter, the following might be added (in
13606f25ae9SGregory Neil Shapirothe appropriate locations) to your .mc file:
13706f25ae9SGregory Neil Shapiro
13806f25ae9SGregory Neil Shapiro	INPUT_MAIL_FILTER(`sample', `S=local:/var/run/f1.sock')
13906f25ae9SGregory Neil Shapiro
14006f25ae9SGregory Neil Shapiro
14106f25ae9SGregory Neil Shapiro+------------------+
14206f25ae9SGregory Neil Shapiro| TESTING A FILTER |
14306f25ae9SGregory Neil Shapiro+------------------+
14406f25ae9SGregory Neil Shapiro
14506f25ae9SGregory Neil ShapiroOnce you have compiled a filter, modified your .mc file and restarted
14606f25ae9SGregory Neil Shapirothe sendmail process, you will want to test that the filter performs as
14706f25ae9SGregory Neil Shapirointended.
14806f25ae9SGregory Neil Shapiro
14906f25ae9SGregory Neil ShapiroThe sample filter takes one argument -p, which indicates the local port
15006f25ae9SGregory Neil Shapiroon which to create a listening socket for the filter.  Maintaining
15106f25ae9SGregory Neil Shapiroconsistency with the suggested options for sendmail.cf, this would be the
15206f25ae9SGregory Neil ShapiroUNIX domain socket located in /var/run/f1.sock.
15306f25ae9SGregory Neil Shapiro
15406f25ae9SGregory Neil Shapiro	% ./sample -p local:/var/run/f1.sock
15506f25ae9SGregory Neil Shapiro
15606f25ae9SGregory Neil ShapiroIf the sample filter returns immediately to a command line, there was either
15706f25ae9SGregory Neil Shapiroan error with your command or a problem creating the specified socket.
15806f25ae9SGregory Neil ShapiroFurther logging can be captured through the syslogd daemon.  Using the
15906f25ae9SGregory Neil Shapiro'netstat -a' command can ensure that your filter process is listening on
16006f25ae9SGregory Neil Shapirothe appropriate local socket.
16106f25ae9SGregory Neil Shapiro
16206f25ae9SGregory Neil ShapiroEmail messages must be injected via SMTP to be filtered.  There are two
16306f25ae9SGregory Neil Shapirosimple means of doing this; either using the 'sendmail -bs' command, or
16406f25ae9SGregory Neil Shapiroby telnetting to port 25 of the machine configured for milter.  Once
16506f25ae9SGregory Neil Shapiroconnected via one of these options, the session can be continued through
16606f25ae9SGregory Neil Shapirothe use of standard SMTP commands.
16706f25ae9SGregory Neil Shapiro
16806f25ae9SGregory Neil Shapiro% sendmail -bs
169d0cef73dSGregory Neil Shapiro220 test.sendmail.com ESMTP Sendmail 8.14.0/8.14.0; Thu, 22 Jun 2006 13:05:23 -0500 (EST)
17006f25ae9SGregory Neil ShapiroHELO localhost
17106f25ae9SGregory Neil Shapiro250 test.sendmail.com Hello testy@localhost, pleased to meet you
17206f25ae9SGregory Neil ShapiroMAIL From:<testy>
17306f25ae9SGregory Neil Shapiro250 2.1.0 <testy>... Sender ok
17406f25ae9SGregory Neil ShapiroRCPT To:<root>
17506f25ae9SGregory Neil Shapiro250 2.1.5 <root>... Recipient ok
17606f25ae9SGregory Neil ShapiroDATA
17706f25ae9SGregory Neil Shapiro354 Enter mail, end with "." on a line by itself
17806f25ae9SGregory Neil ShapiroFrom: testy@test.sendmail.com
17906f25ae9SGregory Neil ShapiroTo: root@test.sendmail.com
18006f25ae9SGregory Neil ShapiroSubject: testing sample filter
18106f25ae9SGregory Neil Shapiro
18206f25ae9SGregory Neil ShapiroSample body
18306f25ae9SGregory Neil Shapiro.
18406f25ae9SGregory Neil Shapiro250 2.0.0 dB73Zxi25236 Message accepted for delivery
18506f25ae9SGregory Neil ShapiroQUIT
18606f25ae9SGregory Neil Shapiro221 2.0.0 test.sendmail.com closing connection
18706f25ae9SGregory Neil Shapiro
18806f25ae9SGregory Neil ShapiroIn the above example, the lines beginning with numbers are output by the
18906f25ae9SGregory Neil Shapiromail server, and those without are your input.  If everything is working
19006f25ae9SGregory Neil Shapiroproperly, you will find a file in /tmp by the name of msg.XXXXXXXX (where
19106f25ae9SGregory Neil Shapirothe Xs represent any combination of letters and numbers).  This file should
19206f25ae9SGregory Neil Shapirocontain the message body and headers from the test email entered above.
19306f25ae9SGregory Neil Shapiro
19406f25ae9SGregory Neil ShapiroIf the sample filter did not log your test email, there are a number of
19506f25ae9SGregory Neil Shapiromethods to narrow down the source of the problem.  Check your system
19606f25ae9SGregory Neil Shapirologs written by syslogd and see if there are any pertinent lines.  You
19706f25ae9SGregory Neil Shapiromay need to reconfigure syslogd to capture all relevant data.  Additionally,
19806f25ae9SGregory Neil Shapirothe logging level of sendmail can be raised with the LogLevel option.
19906f25ae9SGregory Neil ShapiroSee the sendmail(8) manual page for more information.
20006f25ae9SGregory Neil Shapiro
20106f25ae9SGregory Neil Shapiro
20240266059SGregory Neil Shapiro+--------------+
20340266059SGregory Neil Shapiro| REQUIREMENTS |
20440266059SGregory Neil Shapiro+--------------+
20540266059SGregory Neil Shapiro
20640266059SGregory Neil Shapirolibmilter requires pthread support in the operating system.  Moreover, it
20740266059SGregory Neil Shapirorequires that the library functions it uses are thread safe; which is true
20840266059SGregory Neil Shapirofor the operating systems libmilter has been developed and tested on.  On
20940266059SGregory Neil Shapirosome operating systems this requires special compile time options (e.g.,
210*5b0945b5SGregory Neil Shapironot just -pthread).
21140266059SGregory Neil Shapiro
212*5b0945b5SGregory Neil ShapiroSo far, libmilter is not supported on:
21340266059SGregory Neil ShapiroIRIX 6.x
21440266059SGregory Neil ShapiroUltrix
21540266059SGregory Neil Shapiro
21640266059SGregory Neil ShapiroFeedback about problems (and possible fixes) is welcome.
21740266059SGregory Neil Shapiro
218*5b0945b5SGregory Neil Shapiro
21906f25ae9SGregory Neil Shapiro+--------------------------+
22006f25ae9SGregory Neil Shapiro| SOURCE FOR SAMPLE FILTER |
22106f25ae9SGregory Neil Shapiro+--------------------------+
22206f25ae9SGregory Neil Shapiro
223d0cef73dSGregory Neil ShapiroNote that the filter example.c may not be thread safe on some operating
224193538b7SGregory Neil Shapirosystems.  You should check your system man pages for the functions used
225*5b0945b5SGregory Neil Shapiroto verify they are thread safe.
226