Op 10-9-2025 om 00:58 schreef Stephan Bosch via dovecot:
Op 9-9-2025 om 02:51 schreef Stephan Bosch via dovecot:
This looks a lot like a bug. Will investigate..
I can reproduce it. Now to find the cause...
This fixes it here: diff --git a/src/lib-sieve/sieve-script.c b/src/lib-sieve/sieve-script.c index 67526c4ef..bdbee1ac9 100644 --- a/src/lib-sieve/sieve-script.c +++ b/src/lib-sieve/sieve-script.c @@ -1232,7 +1232,7 @@ int sieve_script_sequence_next(struct sieve_script_sequence *sseq, i_assert(storage->error_code != SIEVE_ERROR_NONE); i_assert(storage->error != NULL); - if (*error_code_r == SIEVE_ERROR_NOT_FOUND) + if (storage->error_code == SIEVE_ERROR_NOT_FOUND) ret = 0; else { *error_code_r = storage->error_code; Putting this through the release cycle may take while...
Op 15-8-2025 om 12:29 schreef Niklas Meyer via dovecot:
Hello everyone,
I am currently working on porting the Dovecot 2.4 configuration from the latest 2.3 version.
During this process, I encountered issues with the Sieve filters, particularly those related to SQL dict mappings.
The previous (2.3) configuration looked like this and worked:
map { pattern = priv/sieve/name/$script_name table = sieve_before username_field = username value_field = id fields { script_name = $script_name } }
map { pattern = priv/sieve/data/$id table = sieve_before username_field = username value_field = script_data fields { id = $id } }
This resulted in the following SQL queries on the MySQL server:
2025-08-15 11:01:29.237511 SELECT id FROM sieve_after WHERE script_name = 'active' AND username = '[1]frittenjonas@derlinkman.de' 2025-08-15 11:01:29.236416 SELECT id FROM sieve_before WHERE script_name = 'active' AND username = '[2]frittenjonas@derlinkman.de'
As you can see, there are SQL mappings for sieve_before and sieve_after, alongside a local file loaded prior to the SQL settings, as they are user-based.
In Dovecot 2.3, everything worked and the scripts were executed. In 2.4, however, they no longer run.
I adapted the configuration for dict SQL mapping for Sieve filters according to the documentation:
dict_map priv/sieve/name/$script_name { sql_table = sieve_before username_field = username value_field id { }
# The script name field in the table to query key_field script_name { value = $script_name } }
dict_map priv/sieve/data/$id { sql_table = sieve_before username_field = username value_field script_data { } key_field id { value = $id } }
This also results in the dict proxy querying the database with the same pattern as before:
2025-08-15 11:11:47.175184 SELECT id FROM sieve_after WHERE script_name = 'active' AND username = '[3]frittenjonas@derlinkman.de' 2025-08-15 11:11:47.172952 SELECT id FROM sieve_before WHERE script_name = 'active' AND username = '[4]frittenjonas@derlinkman.de' 2025-08-15 11:11:47.155786 SELECT id FROM sieve_after WHERE script_name = 'active' AND username = '[5]frittenjonas@derlinkman.de' 2025-08-15 11:11:47.136030 SELECT id FROM sieve_before WHERE script_name = 'active' AND username = '[6]frittenjonas@derlinkman.de'
However, unlike in 2.3, it now queries the DB twice.
In the Sieve debug logs, I see the following:
[7]https://pastebin.com/PTKkLsDQ
Notably:
Aug 15 12:22:24 43664c142e0a dovecot: lmtp([8]frittenjonas@derlinkman.de)<2407><mPFNN2AKn2hnCQAAhwrv7A>: Debug: Local delivery failed: Temporarily unable to access necessary Sieve scripts
This line concerns me.
Here are the current Sieve script declarations:
sieve_script before { type = before driver = file path = /var/vmail/sieve/global_sieve_before.sieve }
sieve_script before2 { type = before driver = dict name = active dict proxy { name = sieve_before sieve_script_bin_path = /var/vmail/sieve_before_bindir } }
sieve_script after { type = after driver = file path = /var/vmail/sieve/global_sieve_after.sieve }
sieve_script after2 { type = after driver = dict name = active dict proxy { name = sieve_after sieve_script_bin_path = /var/vmail/sieve_after_bindir } }
# Personal scripts sieve_script personal { type = personal driver = file path = ~/sieve active_path = ~/.dovecot.sieve }
The dict proxy configuration, pointing to the dict_map SQL query above, looks like this:
dict sieve_after { driver = sql !include /etc/dovecot/sql/dovecot-dict-sql-sieve_after.conf }
dict sieve_before { driver = sql !include /etc/dovecot/sql/dovecot-dict-sql-sieve_before.conf }
Thanks for your guidance.
Kind regards
Niklas Meyer
Maintainer of the mailcow project
References
Visible links 1. mailto:frittenjonas@derlinkman.de 2. mailto:frittenjonas@derlinkman.de 3. mailto:frittenjonas@derlinkman.de 4. mailto:frittenjonas@derlinkman.de 5. mailto:frittenjonas@derlinkman.de 6. mailto:frittenjonas@derlinkman.de 7. https://pastebin.com/PTKkLsDQ 8. mailto:frittenjonas@derlinkman.de
_______________________________________________ dovecot mailing list -- dovecot@dovecot.org To unsubscribe send an email to dovecot-leave@dovecot.org
dovecot mailing list -- dovecot@dovecot.org To unsubscribe send an email to dovecot-leave@dovecot.org
_______________________________________________ dovecot mailing list -- dovecot@dovecot.org To unsubscribe send an email to dovecot-leave@dovecot.org