Had to activate the following modules in SquirrelMail:
- server_settings_backend
- server_side_filters
- server_side_filters_maildrop
In the sqmail/config/config.php file we must have the following settings:
$default_folder_prefix = 'INBOX'; $trash_folder = '.Trash'; $sent_folder = '.Sent'; $draft_folder = '.Drafts';
Especially important is the $default_folder_prefix, which is removed from the maildir path in individual rules in
plugins/server_side_filters_maildrop/functions.php
Since we need all the mail sent to a deliverquota script we had to edit the following file:
plugins/server_side_filters_maildrop/functions.php: ... // This variable was added $external_program = "|deliverquota -c -w \${WARNSIZE} "; // build this filter's action // if ($rule['ACTION'] == 'DELETE') { $action = 'to /dev/null'; $parsed_filter_rules[$index]['COPY_TO_FOLDER'] = 'OFF'; $parsed_filter_rules[$index]['SEND_TO_ADDRESS'] = 'OFF'; } else if ($rule['COPY_TO_FOLDER'] == 'ON' && $rule['SEND_TO_ADDRESS'] == 'ON') $action = 'cc "' . $external_program . str_replace(" ", "\ ", $rule['TARGET_FOLDER']) . "\"\n $deliver_action \"!" . $rule['EMAIL_ADDRESS'] . '"'; else if ($rule['COPY_TO_FOLDER'] == 'ON') $action = "$deliver_action \"" . $external_program . str_replace(" ", "\ ", $rule['TARGET_FOLDER']) . "\""; else if ($rule['SEND_TO_ADDRESS'] == 'ON') $action = "$deliver_action \"!" . $rule['EMAIL_ADDRESS'] . '"'; else $action = ''; ...
The bold parts were added to the code. str_replace deals with folder names with spaces.
And here is a configuration for the SQL backend:
plugins/server_side_filters_maildrop/config.php: ... $filter_rules_storage_info = array( 'BACKEND' => 'sql', 'DSN' => array('VALUE' => 'mysql://postfix:*****@localhost/postfix'), 'QUERY' => array('VALUE' => "SELECT `rule` FROM `maildrop` WHERE `user` = '%1'"), 'SAVE_QUERY' => array('VALUE' => "REPLACE INTO `maildrop` SET `rule` = '%3', `user` = '%1'"), ); ... $custom_mail_location = array('VALUE' => '${MAILDIR}'); ...
Note, that we are using REPLACE instead of UPDATE, since there is always a single entry in the database for a specific user. Discussion about SQL command options are discussed here:
plugins/server_settings_backend/docs/README
Also we set $custom_mail_location, which is a complete path to user’s maildir. Here is a database structure we are using:
CREATE TABLE `maildrop` ( `user` varchar(128) collate utf8_generic_ci NOT NULL, `rule` text collate utf8_generic_ci NOT NULL, `updated` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, `generated` timestamp NOT NULL default '0000-00-00 00:00:00', UNIQUE KEY `user` (`user`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_generic_ci;
We can have a script which generates filter files for individual users from this database. These filters can then be included by the main script
/etc/maildroprc: ... USER_FILTER="/etc/maildrop/${USER_ID}.filter" `test -f ${USER_FILTER}` if( $RETURNCODE == 0) { include "${USER_FILTER}" } ...
Problems to deal with are encoding of rules (using national characters for example in Subject:) since maildrop and SquirellMail uses different encoding. Also forwarding of messages in maildrop to other external e-mail addresses.