Should be trivial to add for someone with an itch. There was a dbmail_filter patch floating around in 2.0 no-one bothered to update for 2.2/2.3. It was included as a dpatch in the dbmail-2.0 debian packages.
I'm attaching the old-style patch here for reference. Attach a filter to the 'anyone' user to make it global. Aaron Stone wrote: > There's no support for global filters (yet), sorry. > > Aaron > > > On Thu, 29 Jan 2009 11:10:08 -0800, Daniel Bakken > <dan...@economicmodeling.com> wrote: >> Can dbmail do global server-side filtering? I want all messages with >> "X-Spam-Flag: YES" to go into a Spam folder. >> >> I'm currently using procmail to sort the messages, but it doesn't >> scale well. Per-user settings are not an option. Can it be done >> globally in dbmail with sieve scripts or the dbmail_filters table? >> >> Daniel Bakken >> _______________________________________________ >> Dbmail-dev mailing list >> Dbmail-dev@dbmail.org >> http://twister.fastxs.net/mailman/listinfo/dbmail-dev > _______________________________________________ > Dbmail-dev mailing list > Dbmail-dev@dbmail.org > http://twister.fastxs.net/mailman/listinfo/dbmail-dev > -- ________________________________________________________________ Paul Stevens paul at nfg.nl NET FACILITIES GROUP GPG/PGP: 1024D/11F8CD31 The Netherlands________________________________http://www.nfg.nl
#! /bin/sh /usr/share/dpatch/dpatch-run ## 04_mailfilter.dpatch by <p...@nfg.nl> ## ## All lines beginning with `## DP:' are a description of the patch. ## DP: No description. @DPATCH@ diff -urNad dbmail-2.0~/db.c dbmail-2.0/db.c --- dbmail-2.0~/db.c 2005-10-26 11:36:47.000000000 +0200 +++ dbmail-2.0/db.c 2005-11-01 09:07:45.000000000 +0100 @@ -524,6 +524,74 @@ return 1; } +char *db_get_mailbox_from_filters(u64_t useridnr, struct list *headerfields, const char *mailbox) +{ + unsigned i = 0; + unsigned num_filters = 0; + + struct mime_record *record; + struct element *el; + char *filter_field; + char *filter_value; + char *mbox; + + trace(TRACE_MESSAGE, "%s, %s: default mailbox [%s]", __FILE__, __func__, mailbox); + + if (mailbox != NULL) + return mailbox; + + snprintf(query, DEF_QUERYSIZE, + "SELECT filter_field, filter_value, mailbox FROM dbmail_filters WHERE user_id = '%llu' ORDER BY filter_id", + useridnr); + + if (db_query(query) == -1) { + trace(TRACE_MESSAGE, "%s,%s: error gettings filters for " + "user_id [%llu]. Missing table?", __FILE__, __func__, + useridnr); + return NULL; + } + + num_filters = db_num_rows(); + for (i = 0; i < num_filters; i++) { + + el = list_getstart(headerfields); + filter_field = (char *)db_get_result(i, 0); + filter_value = (char *)db_get_result(i, 1); + mbox = (char *)db_get_result(i, 2); + + trace(TRACE_MESSAGE, + "%s, %s: processing filter [%s : \"%s\" => %s]", + __FILE__, __func__, filter_field, filter_value, mbox); + + while (el) { + record = (struct mime_record *) el->data; + + trace(TRACE_MESSAGE, + "%s, %s: processing header [%s : \"%s\"]", + __FILE__, __func__, record->field, record->value); + + if (!strcmp(record->field, filter_field) && strstr(record->value, filter_value)) { + + trace(TRACE_MESSAGE, + "%s, %s: header [%s : \"%s\"] accept filter [%s : \"%s\" => %s]", + __FILE__, __func__, record->field, record->value, filter_field, filter_value, mbox); + + return mbox; + } + + el = el->nextnode; + } + + trace(TRACE_MESSAGE, + "%s, %s: no header accept filter [%s : \"%s\" => %s]", + __FILE__, __func__, filter_field, filter_value, mbox); + } + + db_free_result(); + + return NULL; +} + char *db_get_deliver_from_alias(const char *alias) { char *escaped_alias; diff -urNad dbmail-2.0~/db.h dbmail-2.0/db.h --- dbmail-2.0~/db.h 2005-10-26 11:36:47.000000000 +0200 +++ dbmail-2.0/db.h 2005-11-01 09:07:45.000000000 +0100 @@ -349,6 +349,14 @@ * - deliver_to address otherwise * \attention caller needs to free the return value */ +/*...@null@*/ char *db_get_mailbox_from_filters(u64_t useridnr, struct list *headerfields, const char *mailbox); +/** + * \brief get a mailbox for a user's user_idnr, default mailbox and filter table + * \param user_idnr idnr of user + * \param headerfields header fields + * \param mailbox default mailbox name + * \return mailbox name + */ /*...@null@*/ char *db_get_deliver_from_alias(const char *alias); /** * \brief get a list of aliases associated with a user's user_idnr @@ -360,7 +368,7 @@ * - 0 on success * \attention aliases list needs to be empty. Method calls list_init() * which sets list->start to NULL. - */ + */ int db_get_user_aliases(u64_t user_idnr, struct list *aliases); /** * \brief add an alias for a user diff -urNad dbmail-2.0~/pipe.c dbmail-2.0/pipe.c --- dbmail-2.0~/pipe.c 2005-10-26 11:36:47.000000000 +0200 +++ dbmail-2.0/pipe.c 2005-11-01 09:07:45.000000000 +0100 @@ -574,8 +574,9 @@ trace(TRACE_DEBUG, "%s, %s: calling sort_and_deliver for useridnr [%llu]", __FILE__, __func__, useridnr); - - dsn_result = sort_and_deliver(tmpmsgidnr, msgsize, useridnr, delivery->mailbox); + + dsn_result = sort_and_deliver(tmpmsgidnr, msgsize, useridnr, + db_get_mailbox_from_filters(useridnr, headerfields, delivery->mailbox)); switch (dsn_result) { case DSN_CLASS_OK: diff -urNad dbmail-2.0~/sql/mysql/create_tables.mysql dbmail-2.0/sql/mysql/create_tables.mysql --- dbmail-2.0~/sql/mysql/create_tables.mysql 2005-10-26 11:36:47.000000000 +0200 +++ dbmail-2.0/sql/mysql/create_tables.mysql 2005-11-01 09:07:45.000000000 +0100 @@ -61,6 +61,20 @@ UNIQUE INDEX owner_idnr_name_index (owner_idnr, name) ); +DROP TABLE IF EXISTS dbmail_filters; +CREATE TABLE dbmail_filters ( + user_id bigint(21) not null default '0', + filter_id bigint(21) not null default '0', + filter_field varchar(128) NOT NULL default '', + filter_value varchar(255) NOT NULL default '', + mailbox varchar(100) NOT NULL default '', + index user_id_index (user_id), + index filter_id_index (filter_id), + PRIMARY KEY (user_id, filter_id), + FOREIGN KEY user_id_fk (user_id) + REFERENCES dbmail_users (user_idnr) ON DELETE CASCADE ON UPDATE CASCADE +); + DROP TABLE IF EXISTS dbmail_subscription; CREATE TABLE dbmail_subscription ( user_id bigint(21) NOT NULL, diff -urNad dbmail-2.0~/sql/mysql/create_tables_innoDB.mysql dbmail-2.0/sql/mysql/create_tables_innoDB.mysql --- dbmail-2.0~/sql/mysql/create_tables_innoDB.mysql 2005-10-26 11:36:47.000000000 +0200 +++ dbmail-2.0/sql/mysql/create_tables_innoDB.mysql 2005-11-01 09:07:45.000000000 +0100 @@ -73,6 +73,20 @@ REFERENCES dbmail_users (user_idnr) ON DELETE CASCADE ON UPDATE CASCADE ) TYPE=InnoDB; +DROP TABLE IF EXISTS dbmail_filters; +CREATE TABLE dbmail_filters ( + user_id bigint(21) not null default '0', + filter_id bigint(21) not null default '0', + filter_field varchar(128) NOT NULL default '', + filter_value varchar(255) NOT NULL default '', + mailbox varchar(100) NOT NULL default '', + index user_id_index (user_id), + index filter_id_index (filter_id), + PRIMARY KEY (user_id, filter_id), + FOREIGN KEY user_id_fk (user_id) + REFERENCES dbmail_users (user_idnr) ON DELETE CASCADE ON UPDATE CASCADE +) TYPE=InnoDB; + DROP TABLE IF EXISTS dbmail_subscription; CREATE TABLE dbmail_subscription ( user_id bigint(21) not null default '0', diff -urNad dbmail-2.0~/sql/postgresql/create_tables.pgsql dbmail-2.0/sql/postgresql/create_tables.pgsql --- dbmail-2.0~/sql/postgresql/create_tables.pgsql 2005-10-26 11:36:47.000000000 +0200 +++ dbmail-2.0/sql/postgresql/create_tables.pgsql 2005-11-01 09:07:45.000000000 +0100 @@ -67,6 +67,17 @@ CREATE UNIQUE INDEX dbmail_mailboxes_owner_name_idx ON dbmail_mailboxes(owner_idnr, name); +CREATE TABLE dbmail_filters ( + user_id INT8 REFERENCES dbmail_users(user_idnr) ON DELETE CASCADE ON UPDATE CASCADE, + filter_id INT8, + filter_field varchar(128) NOT NULL, + filter_value varchar(255) NOT NULL, + mailbox varchar(100) NOT NULL, + PRIMARY KEY (user_id, filter_id) +); +CREATE INDEX dbmail_user_id_idx ON dbmail_filters(user_id); +CREATE INDEX dbmail_filter_id_idx ON dbmail_filters(filter_id); + CREATE TABLE dbmail_subscription ( user_id INT8 REFERENCES dbmail_users(user_idnr) ON DELETE CASCADE ON UPDATE CASCADE, mailbox_id INT8 REFERENCES dbmail_mailboxes(mailbox_idnr)
_______________________________________________ Dbmail-dev mailing list Dbmail-dev@dbmail.org http://twister.fastxs.net/mailman/listinfo/dbmail-dev