$Log$
+ Revision 591.36 2002/06/07 22:10:51 ajc
+ * Added a new message function hook type EVT_SMTPSCAN which permits modules to
+ register hooks that can scan incoming SMTP messages and elect to reject them
+ (due to virus or spam content, for example).
+
Revision 591.35 2002/06/07 03:22:13 ajc
* Added a module "serv_mrtg" which allows activity reporting to MRTG
(http://www.mrtg.org) -- this will replace our stats program.
Fri Jul 10 1998 Art Cancro <ajc@uncensored.citadel.org>
* Initial CVS import
+
long msgnum;
char nowstamp[SIZ];
struct recptypes *valid;
+ int scan_errors;
if (strlen(SMTP->from) == 0) {
cprintf("503 Need MAIL command first.\r\n");
/* Submit the message into the Citadel system. */
valid = validate_recipients(SMTP->recipients);
- msgnum = CtdlSubmitMsg(msg, valid, "");
- CtdlFreeMessage(msg);
- phree(valid);
- if (msgnum > 0L) {
- cprintf("250 Message accepted.\r\n");
+ /* If there are modules that want to scan this message before final
+ * submission (such as virus checkers or spam filters), call them now
+ * and give them an opportunity to reject the message.
+ */
+ scan_errors = PerformMessageHooks(msg, EVT_SMTPSCAN);
+
+ if (scan_errors > 0) { /* We don't want this message! */
+
+ if (msg->cm_fields['0'] == NULL) {
+ msg->cm_fields['0'] = strdoop(
+ "Message rejected by filter");
+ }
+
+ cprintf("552 %s\r\n", msg->cm_fields['0']);
}
- else {
- cprintf("550 Internal delivery error\r\n");
+
+ else { /* Ok, we'll accept this message. */
+ msgnum = CtdlSubmitMsg(msg, valid, "");
+ if (msgnum > 0L) {
+ cprintf("250 Message accepted.\r\n");
+ }
+ else {
+ cprintf("550 Internal delivery error\r\n");
+ }
}
+ CtdlFreeMessage(msg);
+ phree(valid);
smtp_data_clear(); /* clear out the buffers now */
}
U Subject Optional. Developers may choose whether they wish to
generate or display subject fields. Citadel/UX does
not generate them, but it does print them when found.
+0 Error This field is typically never found in a message on
+ disk or in transit. Message scanning modules are
+ expected to fill in this field when rejecting a message
+ with an explanation as to what happened (virus found,
+ message looks like spam, etc.)
EXAMPLE