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