ok a few things about sieve
although it is a pain it is usually (on a per user basis) better to access the sieve scripting through thunderbird's plugin sieve or something similiar as it will sort out checksums, syntax etc.
see :
https://github.com/thsmi/sieve/
https://www.pair.com/support/kb/sieve-syntax-and-common-recipes/
https://wiki.dovecot.org/Pigeonhole/ManageSieve/Troubleshooting
also RFC
https://datatracker.ietf.org/doc/html/rfc5804#page-3
Next and all though way more complicated since you need to calculate checksums etc i use a telnet python script that generates forward's etc
again may (probably not) what you are looking for but it at least gives another example(s)
python2 code below:
last but not least there is an RFC avaliable for sieve scripting but again its at a programming level and may not be overally useful ? (note link above)
don't feel bad it took me a while to figure this out as well.
for any of this to work you need the sieve listener port running on the mail server
make sure you can telnet to mailserver:2000 (older) or port 4190 (current) depending how you are configured for sieve before going any further.
dovecot.conf
protocols = imap pop3 lmtp sieve
protocol lmtp { mail_plugins = $mail_plugins sieve postmaster_address = monitor@scom.ca }
sieve = file:~/sieve;active=~/sieve/.dovecot.sieve #sieve = ~/.dovecot.sieve sieve_duplicate_default_period = 1h sieve_duplicate_max_period = 1h sieve_extensions = +duplicate +notify +imapflags +vacation-seconds sieve_global_dir = /usr/local/etc/dovecot/sieve sieve_before = /usr/local/etc/dovecot/sieve/duplicates.sieve
service managesieve-login { process_limit = 1000 vsz_limit = 1g inet_listener sieve { port = 4190 } }
protocol sieve { managesieve_implementation_string = Dovecot Pigeonhole managesieve_max_line_length = 65536 }
above is my sieve conf alter accordingly if needed ....
below are examples of my sieve processing scripts for vacation notices and forward's, this data comes from my django project model but should be pretty clear what the code is doing.
note : you need to base64 the auth username & password to login to the users sieve account.
note : \r\n needs to be used as a line terminator and calculated accordingly. See count & count2 below. Basically \r\n = 1
you can expand on this ....
if self.vacation_active == True and dontupdate != True:
#debug = [debug,server,port,count,label,pid]
debug = 'syslog,10.228.0.6,514,0,sieve,0'
log_debug (debug, 'Sieve (Vacation) : Do Not Update Status for : %s'
%dontupdate ) import base64,telnetlib log_debug (debug, 'Enabling Sieve for : %s' %self.username ) auth = '\0%s\0%s' %(self.username,self.password) log_debug (debug, 'Auth : %s' %auth) auth = base64.b64encode(auth) log_debug (debug, 'Auth Encoded : %s' %auth) from telnetlib import Telnet tn = Telnet('10.220.0.18', 4190) connect = tn.read_until('OK',5) log_debug (debug, 'Connect : \n%s\n' %connect) authout = 'AUTHENTICATE "PLAIN" "%s"\n'%auth log_debug (debug, 'Authout : %s' %authout) tn.write(authout) status = tn.expect(['OK','NO'],5) log_debug (debug, 'Auth : %s' %str(status) ) tn.write('LISTSCRIPTS\r\n') status = tn.expect(['OK','NO'],5) log_debug (debug, 'Current Scripts : %s' %str(status) ) #Send a Script script = 'keep;\r\nredirect "vacationprocessing@scom.ca";\r\n' count = len(script) count2 = script.count('\r\n') log_debug (debug, 'Count : %s' %count) log_debug (debug, 'Count 2 : %s' %count2) init = 'PUTSCRIPT "forward" {%s+}\r\n' %(count - count2) log_debug (debug, 'Init : %s' %init) tn.write ( init ) log_debug (debug, 'Script Len : %s' %len(script) ) log_debug (debug, 'Script : %s' %script) tn.write( script ) status = tn.expect(['OK','NO'],5) log_debug (debug, 'Write Status : %s' %str(status) ) log_debug (debug, 'Setting Active' ) tn.write('SETACTIVE "forward"\r\n') status = tn.expect(['OK','NO'],5) log_debug (debug, 'Write Status : %s' %str(status) ) #logout tn.write('LOGOUT') status = tn.expect(['OK','NO'],5) log_debug (debug, 'Logout Status : %s' %str(status) ) if (self.vacation_active == False and self.sieve_forwards == '') and dontupdate != True : #Deactivate Seive #debug = [debug,server,port,count,label,pid] debug = 'syslog,10.228.0.6,514,0,sieve,0' log_debug (debug, 'Sieve (Disable) : Do Not Update Status for : %s' %dontupdate ) import base64,telnetlib log_debug (debug, 'Disabling Sieve for : %s' %self.username) auth = '\0%s\0%s' %(self.username,self.password) log_debug (debug, 'Auth : %s' %auth) auth = base64.b64encode(auth) log_debug (debug, 'Auth Encoded : %s' %auth) from telnetlib import Telnet tn = Telnet('10.220.0.18', 4190) connect = tn.read_until('OK',5) log_debug (debug, 'Connect : \n%s\n' %connect) authout = 'AUTHENTICATE "PLAIN" "%s"\n'%auth log_debug (debug, 'Authout : %s' %authout) tn.write(authout) status = tn.expect(['OK','NO'],5) log_debug (debug, 'Auth : %s' %str(status) ) tn.write('LISTSCRIPTS\r\n') status = tn.expect(['OK','NO'],5) log_debug (debug, 'Current Scripts : %s' %str(status) ) log_debug (debug, 'Setting Disabled' ) tn.write('SETACTIVE ""\r\n') status = tn.expect(['OK','NO'],5) log_debug (debug, 'Write Status : %s' %str(status) ) #logout tn.write('LOGOUT') status = tn.expect(['OK','NO'],5) log_debug (debug, 'Logout Status : %s' %str(status) )
#Check to see if forward is active
if (self.sieve_forwards != '' and self.vacation_active == False ) and
dontupdate != True: #debug = [debug,server,port,count,label,pid] debug = 'syslog,10.228.0.6,514,0,sieve,0' log_debug (debug, 'Do Not Update Status for : %s' %dontupdate ) import base64,telnetlib log_debug (debug, 'Enabling Sieve Forwards for : %s' %self.username ) auth = '\0%s\0%s' %(self.username,self.password) log_debug (debug, 'Auth : %s' %auth) auth = base64.b64encode(auth) log_debug (debug, 'Auth Encoded : %s' %auth) from telnetlib import Telnet tn = Telnet('10.220.0.18', 4190) connect = tn.read_until('OK',5) log_debug (debug, 'Connect : \n%s\n' %connect) authout = 'AUTHENTICATE "PLAIN" "%s"\n'%auth log_debug (debug, 'Authout : %s' %authout) tn.write(authout) status = tn.expect(['OK','NO'],5) log_debug (debug, 'Auth : %s' %str(status) ) tn.write('LISTSCRIPTS\r\n') status = tn.expect(['OK','NO'],5) log_debug (debug, 'Current Scripts : %s' %str(status) ) #Send Script script = 'keep;\r\n' forwards = self.sieve_forwards.split(',') for nnn in range (0,len(forwards)) : script = script + 'redirect "%s";\r\n' %str(forwards[nnn]) count = len(script) count2 = script.count('\r\n') log_debug (debug, 'Count : %s' %count) log_debug (debug, 'Count 2 : %s' %count2) init = 'PUTSCRIPT "forward" {%s+}\r\n' %(count - count2 + len(forwards) - 1 ) log_debug (debug, 'Init : %s' %init) tn.write ( init ) log_debug (debug, 'Script Len : %s' %len(script) ) log_debug (debug, 'Script : %s' %script) tn.write( script ) status = tn.expect(['OK','NO'],5) log_debug (debug, 'Write Status : %s' %str(status) ) log_debug (debug, 'Setting Active' ) tn.write('SETACTIVE "forward"\r\n') status = tn.expect(['OK','NO'],5) log_debug (debug, 'Write Status : %s' %str(status) ) #logout tn.write('LOGOUT') status = tn.expect(['OK','NO'],5) log_debug (debug, 'Logout Status : %s' %str(status) )
Happy Thursday !!! Thanks - paul
Paul Kudla
Scom.ca Internet Services <http://www.scom.ca> 004-1009 Byron Street South Whitby, Ontario - Canada L1N 4S3
Toronto 416.642.7266 Main 1.866.411.7266 Fax 1.888.892.7266 Email paul@scom.ca
On 10/26/2022 9:28 PM, Stephan Bosch wrote:
On 24-10-2022 12:00, Sebastian Bachmann wrote:
according to the documentation, this has to be added to the IMAP METADATA dict per mailbox (https://doc.dovecot.org/configuration_manual/imap_metadata/):
https://doc.dovecot.org/configuration_manual/sieve/plugins/imapsieve/ says:
The basic IMAPSIEVE capability allows attaching a Sieve script to a mailbox for any mailbox by setting a special IMAP METADATA entry. This way, users can configure Sieve scripts that are run for IMAP events in their mailboxes. But I can not find any example how this should work, neither which client supports setting those things. My guess is that these keys are used: https://www.iana.org/assignments/imap-metadata/imap-metadata.xhtml#imap-meta...
I would also be interested to know if and how that works, especially if you can add a rule when moving mails (from anywhere) to a certain mailbox for a single user.
The basic capability works according to the specification: https://www.rfc-editor.org/rfc/rfc6785 This allows the users to configure these scripts.
If you want to arrange this solely at the administrator's discretion, you can use the _before/_after settings documented in https://doc.dovecot.org/configuration_manual/sieve/plugins/imapsieve
Best, Sebastian
On 17.10.2022 12:46, Marc wrote:
I only see configurations that are active for all users, how to configure this in the user sieve rules. I only need this for specific users.