2002-07-08 04:30:11 +02:00
|
|
|
#
|
|
|
|
# read this with 'perldoc README.plugins' ...
|
|
|
|
#
|
|
|
|
|
|
|
|
=head1 qpsmtpd plugin system; developer documentation
|
|
|
|
|
|
|
|
See the examples in plugins/ and ask questions on the qpsmtpd
|
|
|
|
mailinglist; subscribe by sending mail to qpsmtpd-subscribe@perl.org.
|
|
|
|
|
|
|
|
=head1 General return codes
|
|
|
|
|
|
|
|
Each plugin must return an allowed constant for the hook and (usually)
|
|
|
|
optionally a "message".
|
|
|
|
|
|
|
|
Generally all plugins for a hook are processed until one returns
|
|
|
|
something other than "DECLINED".
|
|
|
|
|
|
|
|
Plugins are run in the order they are listed in the "plugins"
|
|
|
|
configuration.
|
|
|
|
|
|
|
|
=over 4
|
|
|
|
|
|
|
|
=item OK
|
|
|
|
|
|
|
|
Action allowed
|
|
|
|
|
|
|
|
=item DENY
|
|
|
|
|
|
|
|
Action denied
|
|
|
|
|
|
|
|
=item DENYSOFT
|
|
|
|
|
|
|
|
Action denied; return a temporary rejection code (say 450 instead of 550).
|
|
|
|
|
2003-12-03 09:12:28 +01:00
|
|
|
=item DENYHARD
|
|
|
|
|
|
|
|
Action denied; return a permanent rejection code and disconnect the client.
|
|
|
|
Use this for "rude" clients.
|
|
|
|
|
2002-07-08 04:30:11 +02:00
|
|
|
=item DECLINED
|
|
|
|
|
2002-07-15 14:16:10 +02:00
|
|
|
Plugin declined work; proceed as usual. This return code is _always_
|
|
|
|
_allowed_ unless noted otherwise.
|
2002-07-08 04:30:11 +02:00
|
|
|
|
|
|
|
=item DONE
|
|
|
|
|
|
|
|
Finishing processing of the request. Usually used when the plugin
|
|
|
|
sent the response to the client.
|
|
|
|
|
|
|
|
=back
|
|
|
|
|
|
|
|
See more detailed description for each hook below.
|
|
|
|
|
|
|
|
=head1 Hooks
|
|
|
|
|
|
|
|
=head2 mail
|
|
|
|
|
|
|
|
Called right after the envelope sender address is passed. The plugin
|
|
|
|
gets passed a Mail::Address object. Default is to allow the
|
|
|
|
recipient.
|
|
|
|
|
|
|
|
Allowed return codes
|
|
|
|
|
|
|
|
OK - sender allowed
|
|
|
|
DENY - Return a hard failure code
|
|
|
|
DENYSOFT - Return a soft failure code
|
2003-12-03 09:12:28 +01:00
|
|
|
DENYHARD - Return a hard failure code and disconnect
|
2002-07-08 04:30:11 +02:00
|
|
|
DONE - skip further processing
|
|
|
|
|
|
|
|
|
|
|
|
=head2 rcpt
|
|
|
|
|
|
|
|
Hook for the "rcpt" command. Defaults to deny the mail with a soft
|
|
|
|
error code.
|
|
|
|
|
|
|
|
Allowed return codes
|
|
|
|
|
|
|
|
OK - recipient allowed
|
|
|
|
DENY - Return a hard failure code
|
|
|
|
DENYSOFT - Return a soft failure code
|
2003-12-03 09:12:28 +01:00
|
|
|
DENYHARD - Return a hard failure code and disconnect
|
2002-07-08 04:30:11 +02:00
|
|
|
DONE - skip further processing
|
|
|
|
|
2004-11-09 16:29:10 +01:00
|
|
|
=head2 data
|
|
|
|
|
|
|
|
Hook for the "data" command. Defaults to '354, "go ahead"'.
|
|
|
|
|
|
|
|
DENY - Return a hard failure code
|
|
|
|
DENYSOFT - Return a soft failure code
|
|
|
|
DENYHARD - Return a hard failure code and disconnect
|
|
|
|
DONE - Plugin took care of receiving data and calling the queue (not
|
|
|
|
recommended)
|
|
|
|
|
2002-09-08 12:07:34 +02:00
|
|
|
=head2 data_post
|
|
|
|
|
|
|
|
Hook after receiving all data; just before the message is queued.
|
|
|
|
|
|
|
|
DENY - Return a hard failure code
|
|
|
|
DENYSOFT - Return a soft failure code
|
2003-12-03 09:12:28 +01:00
|
|
|
DENYHARD - Return a hard failure code and disconnect
|
2002-09-08 12:07:34 +02:00
|
|
|
DONE - skip further processing (message will not be queued)
|
|
|
|
|
|
|
|
All other codes and the message will be queued normally
|
|
|
|
|
2002-10-10 03:49:34 +02:00
|
|
|
=head2 queue
|
|
|
|
|
|
|
|
Called on completion of the DATA command.
|
|
|
|
|
|
|
|
DONE - skip further processing (plugin gave response code)
|
|
|
|
OK - Return success message
|
|
|
|
DENY - Return hard failure code
|
|
|
|
DENYSOFT - Return soft failure code
|
2003-12-03 09:12:28 +01:00
|
|
|
DENYHARD - Return a hard failure code and disconnect
|
2002-10-10 03:49:34 +02:00
|
|
|
|
|
|
|
Any other code will return a soft failure code.
|
|
|
|
|
2002-09-08 12:07:34 +02:00
|
|
|
|
2002-07-15 14:16:10 +02:00
|
|
|
=head2 connect
|
|
|
|
|
|
|
|
Allowed return codes:
|
|
|
|
|
|
|
|
OK - Stop processing plugins, give the default response
|
|
|
|
DECLINED - Process the next plugin
|
|
|
|
DONE - Stop processing plugins and don't give the default response
|
2002-07-08 04:30:11 +02:00
|
|
|
|
2002-10-10 03:49:34 +02:00
|
|
|
|
2002-07-08 04:30:11 +02:00
|
|
|
=head2 quit
|
|
|
|
|
|
|
|
Called on the "quit" command.
|
|
|
|
|
|
|
|
Allowed return codes:
|
|
|
|
|
|
|
|
DONE
|
|
|
|
|
2002-07-15 14:16:10 +02:00
|
|
|
Works like the "connect" hook.
|
2002-07-08 04:30:11 +02:00
|
|
|
|
2003-03-18 10:45:55 +01:00
|
|
|
=head2 helo
|
|
|
|
|
|
|
|
Called on "helo" from the client.
|
|
|
|
|
|
|
|
DENY - Return a 550 code
|
|
|
|
DENYSOFT - Return a 450 code
|
2003-12-03 09:12:28 +01:00
|
|
|
DENYHARD - Return a hard failure code and disconnect
|
2003-03-18 10:45:55 +01:00
|
|
|
DONE - Qpsmtpd won't do anything; the plugin sent the message
|
|
|
|
DECLINED - Qpsmtpd will send the standard HELO message
|
|
|
|
|
2002-07-15 13:49:49 +02:00
|
|
|
|
2003-04-15 19:39:03 +02:00
|
|
|
=head2 unrecognized_command
|
|
|
|
|
|
|
|
Called when we get a command that isn't recognized.
|
|
|
|
|
|
|
|
DENY - Return 521 and disconnect the client
|
|
|
|
DONE - Qpsmtpd won't do anything; the plugin responded
|
|
|
|
Anything else - Return '500 Unrecognized command'
|
|
|
|
|
2002-07-15 13:49:49 +02:00
|
|
|
=head2 disconnect
|
|
|
|
|
|
|
|
Called just before we shutdown a connection.
|
|
|
|
|
|
|
|
The return code is ignored. If a plugin returns anything but DECLINED
|
|
|
|
the following plugins will not be run (like with all other hooks).
|
|
|
|
|
2003-01-20 12:02:20 +01:00
|
|
|
=head2 deny
|
|
|
|
|
|
|
|
Called when another hook returns DENY or DENYSOFT. First parameter is
|
|
|
|
the previous hook return code; the second parameter the message the
|
|
|
|
hook returned.
|
|
|
|
|
|
|
|
Returning DONE or OK will stop the next deny hook from being run.
|
|
|
|
DECLINED will make qpsmtpd run the remaining configured deny hooks.
|
|
|
|
|
2004-09-05 06:30:21 +02:00
|
|
|
=head2 vrfy
|
|
|
|
|
|
|
|
Hook for the "VRFY" command. Defaults to returning a message telling
|
|
|
|
the user to just try sending the message.
|
|
|
|
|
|
|
|
Allowed return codes:
|
|
|
|
|
|
|
|
OK - Recipient Exists
|
|
|
|
DENY - Return a hard failure code
|
|
|
|
DONE - Return nothing and move on
|
|
|
|
Anything Else - Return a 252
|
|
|
|
|
2004-09-04 05:16:10 +02:00
|
|
|
=head1 Return Values and Notes
|
|
|
|
|
|
|
|
Insert stuff here about how:
|
|
|
|
|
|
|
|
- if we're in a transaction, the results of a callback are stored
|
|
|
|
in
|
|
|
|
$self->transaction->notes( $code->{name})->{"hook_$hook"}->{return}
|
|
|
|
|
|
|
|
- if we're in a connection, store things in the connection notes instead.
|
|
|
|
|
|
|
|
|
2004-09-04 05:38:14 +02:00
|
|
|
=head1 Include Files
|
|
|
|
|
|
|
|
(put more about how the $Include stuff works here)
|
|
|
|
|
|
|
|
With the $Include stuff you order using the filename of the plugin.d
|
|
|
|
file. So if you have a plugin called xyz but want it to come early on,
|
|
|
|
you call it's config file 00_xyz, but that file still refers to the
|
|
|
|
plugin called xyz.
|