xref: /freebsd/contrib/sendmail/libmilter/docs/api.html (revision 1e413cf93298b5b97441a21d9a50fdcd0ee9945e)
1<HTML>
2<HEAD><TITLE>Milter API</TITLE></HEAD>
3<BODY>
4<!--
5$Id: api.html,v 1.35 2006/11/30 23:09:23 ca Exp $
6-->
7<H1>Milter API</H1>
8
9<H2>Contents</H2>
10<UL>
11    <LI><A HREF="#LibraryControlFunctions">Library Control Functions</A>
12    <LI><A HREF="#DataAccessFunctions">Data Access Functions</A>
13    <LI><A HREF="#MessageModificationFunctions">Message Modification Functions</A>
14    <LI><A HREF="#Callbacks">Callbacks</A>
15    <LI><A HREF="#Miscellaneous">Miscellaneous</A>
16</UL>
17
18<H2><A NAME="LibraryControlFunctions">Library Control Functions</A></H2>
19
20Before handing control to libmilter (by calling
21<A HREF="smfi_main.html">smfi_main</A>), a filter may call the following
22functions to set libmilter parameters.
23In particular, the filter must call
24<A HREF="smfi_register.html">smfi_register</A> to register its callbacks.
25Each function will return either MI_SUCCESS or MI_FAILURE to
26indicate the status of the operation.
27
28<P>
29None of these functions communicate with the MTA.  All alter the
30library's state, some of which is communicated to the MTA inside
31<A HREF="smfi_main.html">smfi_main</A>.
32
33<P>
34<TABLE BORDER="1" CELLSPACING=0 CELLPADDING=2><TR BGCOLOR="#dddddd"><TH>Function</TH><TH>Description</TH></TR>
35
36<TR><TD><A HREF="smfi_opensocket.html">smfi_opensocket</A></TD><TD>Try to create the interface socket.</TD></TR>
37
38<TR><TD><A HREF="smfi_register.html">smfi_register</A></TD><TD>Register a filter.</TD></TR>
39
40<TR><TD><A HREF="smfi_setconn.html">smfi_setconn</A></TD><TD>Specify socket to use.</TD></TR>
41
42<TR><TD><A HREF="smfi_settimeout.html">smfi_settimeout</A></TD><TD>Set timeout.</TD></TR>
43
44<TR><TD><A HREF="smfi_setbacklog.html">smfi_setbacklog</A></TD><TD>Define the incoming <CODE>listen(2)</CODE> queue size.</TD></TR>
45
46<TR><TD><A HREF="smfi_setdbg.html">smfi_setdbg</A></TD><TD>Set the milter library debugging (tracing) level.</TD></TR>
47
48<TR><TD><A HREF="smfi_stop.html">smfi_stop</A></TD><TD>Cause an orderly shutdown.</TD></TR>
49
50<TR><TD><A HREF="smfi_main.html">smfi_main</A></TD><TD>Hand control to libmilter.</TD></TR>
51
52</TABLE>
53
54<H2><A NAME="DataAccessFunctions">Data Access Functions</A></H2>
55
56The following functions may be called from within the filter-defined callbacks
57to access information about the current connection or message.
58<P>
59<TABLE BORDER="1" CELLSPACING=0 CELLPADDING=2><TR bgcolor="#dddddd"><TH>Function</TH><TH>Description</TH></TR>
60<TR><TD><A HREF="smfi_getsymval.html">smfi_getsymval</A></TD><TD>Return the value
61of a symbol.</TD></TR>
62
63<TR><TD><A HREF="smfi_getpriv.html">smfi_getpriv</A></TD><TD>Get the private data
64pointer.</TD></TR>
65
66<TR><TD><A HREF="smfi_setpriv.html">smfi_setpriv</A></TD><TD>Set the private data
67pointer.</TD></TR>
68
69<TR><TD><A HREF="smfi_setreply.html">smfi_setreply</A></TD><TD>Set the specific
70reply code to be used.</TD></TR>
71
72<TR><TD><A HREF="smfi_setmlreply.html">smfi_setmlreply</A></TD><TD>Set the
73specific multi-line reply to be used.</TD></TR>
74
75</TABLE>
76
77<H2><A NAME="MessageModificationFunctions">Message Modification Functions</A></H2>
78
79The following functions change a message's contents and attributes.
80<EM>They may only be called in <A HREF="xxfi_eom.html">xxfi_eom</A></EM>.
81All of these functions may invoke additional communication with the MTA.
82They will return either MI_SUCCESS or MI_FAILURE to indicate the status of
83the operation.
84
85<P>
86A filter must have set the appropriate flag (listed below) in the
87description passed to <A HREF="smfi_register.html">smfi_register</A>
88to call any message modification function.  Failure to do so will
89cause the MTA to treat a call to the function as a failure of the
90filter, terminating its connection.
91
92<P>
93Note that the status returned indicates only whether or not the
94filter's message was successfully sent to the MTA, not whether or not
95the MTA performed the requested operation.  For example,
96<A HREF="smfi_addheader.html">smfi_addheader</A>, when called with an
97illegal header name, will return MI_SUCCESS even though the MTA may
98later refuse to add the illegal header.
99<P>
100<TABLE BORDER="1" CELLSPACING=0 CELLPADDING=2><TR BGCOLOR="#dddddd"><TH>Function</TH><TH>Description</TH><TH>SMFIF_* flag</TR>
101<TR><TD><A HREF="smfi_addheader.html">smfi_addheader</A></TD><TD>Add a header to
102the message.</TD><TD>SMFIF_ADDHDRS</TD></TR>
103
104<TR><TD><A HREF="smfi_chgheader.html">smfi_chgheader</A></TD><TD>Change or delete a header.</TD><TD>SMFIF_CHGHDRS</TD></TR>
105
106<TR><TD><A HREF="smfi_insheader.html">smfi_insheader</A></TD><TD>Insert a
107header into the message.</TD><TD>SMFIF_ADDHDRS</TD></TR>
108
109<TR><TD><A HREF="smfi_chgfrom.html">smfi_chgfrom</A></TD><TD>Change the
110envelope sender address.</TD><TD>SMFIF_CHGFROM</TD></TR>
111
112<TR><TD><A HREF="smfi_addrcpt.html">smfi_addrcpt</A></TD><TD>Add a recipient to
113the envelope.</TD><TD>SMFIF_ADDRCPT</TD></TR>
114
115<TR><TD><A HREF="smfi_addrcpt_par.html">smfi_addrcpt_par</A></TD><TD>Add
116a recipient including ESMTP parameter to the envelope.
117</TD><TD>SMFIF_ADDRCPT_PAR</TD></TR>
118
119<TR><TD><A HREF="smfi_delrcpt.html">smfi_delrcpt</A></TD><TD>Delete a recipient
120from the envelope.</TD><TD>SMFIF_DELRCPT</TD></TR>
121
122<TR><TD><A HREF="smfi_replacebody.html">smfi_replacebody</A></TD><TD>Replace the
123body of the message.</TD><TD>SMFIF_CHGBODY</TD></TR>
124
125</TABLE>
126
127<H2>Other Message Handling Functions</H2>
128
129The following functions provide special case handling instructions for
130milter or the MTA, without altering the content or status of the message.
131<EM>They too may only be called in <A HREF="xxfi_eom.html">xxfi_eom</A></EM>.
132All of these functions may invoke additional communication with the MTA.
133They will return either MI_SUCCESS or MI_FAILURE to indicate the status of
134the operation.
135
136<P>
137Note that the status returned indicates only whether or not the
138filter's message was successfully sent to the MTA, not whether or not
139the MTA performed the requested operation.
140
141<P>
142<TABLE BORDER="1" CELLSPACING=0 CELLPADDING=2><TR BGCOLOR="#dddddd"><TH>Function</TH><TH>Description</TH></TR>
143<TR><TD><A HREF="smfi_progress.html">smfi_progress</A></TD><TD>Report operation in progress.</TD></TR>
144
145<TR><TD><A HREF="smfi_quarantine.html">smfi_quarantine</A></TD><TD>Quarantine a message.</TD></TR>
146
147</TABLE>
148
149<H2><A NAME="Callbacks">Callbacks</A></H2>
150
151The filter should implement one or more of the following callbacks,
152which are registered via <A HREF="smfi_register.html">smfi_register</A>:
153
154<P>
155<TABLE BORDER="1" CELLSPACING=0 CELLPADDING=2><TR BGCOLOR="#dddddd"><TH>Function</TH><TH>Description</TH></TR>
156
157<TR><TD><A HREF="xxfi_connect.html">xxfi_connect</A></TD><TD>connection info</TD></TR>
158
159<TR><TD><A HREF="xxfi_helo.html">xxfi_helo</A></TD><TD>SMTP HELO/EHLO command</TD></TR>
160
161<TR><TD><A HREF="xxfi_envfrom.html">xxfi_envfrom</A></TD><TD>envelope sender</TD></TR>
162
163<TR><TD><A HREF="xxfi_envrcpt.html">xxfi_envrcpt</A></TD><TD>envelope recipient</TD></TR>
164
165<TR><TD><A HREF="xxfi_data.html">xxfi_data</A></TD><TD>DATA command</TD></TR>
166
167<TR><TD><A HREF="xxfi_unknown.html">xxfi_unknown</A></TD><TD>Unknown SMTP command</TD></TR>
168
169<TR><TD><A HREF="xxfi_header.html">xxfi_header</A></TD><TD>header</TD></TR>
170
171<TR><TD><A HREF="xxfi_eoh.html">xxfi_eoh</A></TD><TD>end of header</TD></TR>
172
173<TR><TD><A HREF="xxfi_body.html">xxfi_body</A></TD><TD>body block</TD></TR>
174
175<TR><TD><A HREF="xxfi_eom.html">xxfi_eom</A></TD><TD>end of message</TD></TR>
176
177<TR><TD><A HREF="xxfi_abort.html">xxfi_abort</A></TD><TD>message aborted</TD></TR>
178
179<TR><TD><A HREF="xxfi_close.html">xxfi_close</A></TD><TD>connection cleanup</TD></TR>
180
181<TR><TD><A HREF="xxfi_negotiate.html">xxfi_negotiate</A></TD><TD>option negotiattion</TD></TR>
182
183</TABLE>
184
185<P>
186The above callbacks should all return one of the following return values,
187having the indicated meanings.  Any return other than one of the below
188values constitutes an error, and will cause sendmail to terminate its
189connection to the offending filter.
190
191<P><A NAME="conn-spec">Milter</A> distinguishes between recipient-,
192message-, and connection-oriented routines.  Recipient-oriented
193callbacks may affect the processing of a single message recipient;
194message-oriented callbacks, a single message; connection-oriented
195callbacks, an entire connection (during which multiple messages may be
196delivered to multiple sets of recipients).
197<A HREF="xxfi_envrcpt.html">xxfi_envrcpt</A> is recipient-oriented.
198<A HREF="xxfi_connect.html">xxfi_connect</A>,
199<A HREF="xxfi_helo.html">xxfi_helo</A> and
200<A HREF="xxfi_close.html">xxfi_close</A> are connection-oriented.  All
201other callbacks are message-oriented.
202
203<P>
204<TABLE BORDER="1" CELLSPACING=0 CELLPADDING=2>
205  <TR BGCOLOR="#dddddd"><TH>Return value</TH><TH>Description</TH></TR>
206  <TR VALIGN="TOP">
207     <TD>SMFIS_CONTINUE</TD>
208     <TD>Continue processing the current connection, message, or recipient.
209     </TD>
210  </TR>
211  <TR VALIGN="TOP">
212     <TD>SMFIS_REJECT</TD>
213     <TD>For a connection-oriented routine, reject this connection; call <A HREF="xxfi_close.html">xxfi_close</A>.<BR>
214        For a message-oriented routine (except
215	<A HREF="xxfi_eom.html">xxfi_eom</A> or
216        <A HREF="xxfi_abort.html">xxfi_abort</A>), reject this message.<BR>
217	For a recipient-oriented routine, reject the current recipient (but continue processing the current message).
218     </TD>
219  </TR>
220  <TR valign="top">
221     <TD>SMFIS_DISCARD</TD>
222     <TD>For a message- or recipient-oriented routine, accept this message, but silently discard it.<BR>
223     SMFIS_DISCARD should not be returned by a connection-oriented routine.
224     </TD>
225  </TR>
226  <TR valign="top">
227     <TD>SMFIS_ACCEPT</TD>
228     <TD>For a connection-oriented routine, accept this connection without further filter processing; call <A HREF="xxfi_close.html">xxfi_close</A>.<BR>
229         For a message- or recipient-oriented routine, accept this message without further filtering.<BR>
230     </TD>
231  </TR>
232  <TR valign="top">
233     <TD>SMFIS_TEMPFAIL</TD>
234     <TD>Return a temporary failure, i.e., the corresponding SMTP command will return an appropriate 4xx status code.
235	 For a message-oriented routine (except <A HREF="xxfi_envfrom.html">xxfi_envfrom</A>), fail for this message. <BR>
236	 For a connection-oriented routine, fail for this connection; call <A HREF="xxfi_close.html">xxfi_close</A>. <BR>
237	 For a recipient-oriented routine, only fail for the current recipient; continue message processing.
238     </TD>
239  </TR>
240
241  <TR valign="top">
242     <TD><A NAME="SMFIS_SKIP">SMFIS_SKIP</A></TD>
243     <TD>Skip further callbacks of the same type in this transaction.
244	Currently this return value is only allowed in
245	<A HREF="xxfi_body.html">xxfi_body()</A>.
246	It can be used if a milter has received sufficiently many
247	body chunks to make a decision, but still wants to invoke
248 	message modification functions that are only allowed to be called from
249	<A HREF="xxfi_eom.html">xxfi_eom()</A>.
250	Note: the milter <EM>must</EM>
251	<A HREF="xxfi_negotiate.html">negotiate</A>
252	this behavior with the MTA, i.e., it must check whether
253	the protocol action
254	<A HREF="xxfi_negotiate.html#SMFIP_SKIP"><CODE>SMFIP_SKIP</CODE></A>
255	is available and if so, the milter must request it.
256     </TD>
257  </TR>
258
259  <TR valign="top">
260     <TD><A NAME="SMFIS_NOREPLY">SMFIS_NOREPLY</A></TD>
261     <TD>Do not send a reply back to the MTA.
262	The milter <EM>must</EM>
263	<A HREF="xxfi_negotiate.html">negotiate</A>
264	this behavior with the MTA, i.e., it must check whether
265	the appropriate protocol action
266	<A HREF="xxfi_negotiate.html#SMFIP_NR_"><CODE>SMFIP_NR_*</CODE></A>
267	is available and if so, the milter must request it.
268	If you set the
269	<A HREF="xxfi_negotiate.html#SMFIP_NR_"><CODE>SMFIP_NR_*</CODE></A>
270	protocol action for a callback, that callback <EM>must</EM>
271	always reply with
272	SMFIS_NOREPLY.
273	Using any other reply code is a violation of the API.
274	If in some cases your callback may return another value
275	(e.g., due to some resource shortages), then you
276	<EM>must not</EM> set
277	<A HREF="xxfi_negotiate.html#SMFIP_NR_"><CODE>SMFIP_NR_*</CODE></A>
278	and you must use
279	SMFIS_CONTINUE as the default return code.
280	(Alternatively you can try to delay reporting the problem to
281	a later callback for which
282	<A HREF="xxfi_negotiate.html#SMFIP_NR_"><CODE>SMFIP_NR_*</CODE></A>
283	is not set.)
284     </TD>
285  </TR>
286
287</TABLE>
288
289<H2><A NAME="Miscellaneous">Miscellaneous</A></H2>
290
291<P>
292<TABLE BORDER="1" CELLSPACING=0 CELLPADDING=2><TR BGCOLOR="#dddddd"><TH>Function</TH><TH>Description</TH></TR>
293
294<TR><TD><A HREF="smfi_version.html">smfi_version</A></TD><TD>libmilter (runtime) version info</TD></TR>
295
296<TR><TD><A HREF="smfi_setsymlist.html">smfi_setsymlist</A></TD><TD>
297Set the list of macros that the milter wants to receive from the MTA
298for a protocol stage.
299</TD></TR>
300
301</TABLE>
302
303<P>
304<TABLE BORDER="1" CELLSPACING=0 CELLPADDING=2><TR BGCOLOR="#dddddd"><TH>Constant</TH><TH>Description</TH></TR>
305
306<TR><TD><A HREF="smfi_version.html">SMFI_VERSION</A></TD><TD>libmilter (compile time) version info</TD></TR>
307
308</TABLE>
309
310
311<HR SIZE="1">
312<FONT SIZE="-1">
313Copyright (c) 2000, 2003, 2006 Sendmail, Inc. and its suppliers.
314All rights reserved.
315<BR>
316By using this file, you agree to the terms and conditions set
317forth in the LICENSE.
318</FONT>
319</BODY>
320</HTML>
321