I don't know how I managed to compile only using direct access of ${imap.user} before since now I get an unknown namespace error on my test script.
But doing it this way compiles:
require ["environment", "variables", "vnd.dovecot.debug"];
if environment :matches "imap.user" "*" { set "u" "${1}"; } debug_log "Found username: \${u}"; if environment :matches "name" "*" { set "n" "${1}"; } debug_log "Found product name: \${n}";
The output is:
DEBUG: Found username: DEBUG: Found product name: Pigeonhole Sieve
- For the "imap.user" environment item, you need to add:
require "imapsieve";
Hmm, I had tried that and get this:
error: require command: unknown Sieve capability `imapsieve'
I've already got imapsieve working (per above output, which was triggered by a COPY action) so it clearly is installed and configured.
This also means that this script will only run from IMAP.
Seems as though it won't compile outside of IMAP either :)
Not if you're not using the sieve_imapsieve plugin for the Sieve interpreter (sieve_plugins = sieve_imapsieve).
Forgive me, but what other way is there to set it up? Is there any way to successfully compile a script with a require of "imapsieve" from the command line?
- For the "${imap.user}" variable, you need to add:
require "vnd.dovecot.environment";
This implicitly requires "environment", so that could be removed.
It is all in the specifications. :)
You're saying that to access the new imap. namespace vars for imapsieve that vnd.dovecot.environment is required? I don't find anything in the specifications that say this.
The RFC says those vars MUST be made available, so presumably it would be referring to the RFC-standard environment extension and not some vendor specific one.
Of course it's easy to work with that if this is how it's been built, but as noted above I can't get it to compile anyway. Though what's the point of trying to figure out imap.user or imap.email if I'm required to use vnd.dovecot.environment which already has "username"? :)
The standard "environment" extension [1] does not register a variables namespace [2] for environment items. So, using a "${env.imap.user}" variable requires the Dovecot-specific "vnd.dovecot.environment" extension [3].
But this doesn't work:
require ["environment", "variables", "vnd.dovecot.debug", "vnd.dovecot.environment"]; debug_log "Username: ${env.imap.user}";
Output when running from a COPY event is:
DEBUG: Username:
What did I do wrong here?
In contrast, the normal alternative for this variable using the "imap.user" environment item will work once the "imapsieve" extension [4] is require'd. That is a bit cumbersome though, since you need to put that in a variable with a statement like: if environment :matches "imap.user" "*" { set "imap_user" "${1}"; }.
I don't see that being too cumbersome, as it's the standard way the environment extension is used, and it's what I expect from reading the RFC. But I understand your point that it's more lengthy than just accessing the variable directly.
So the only issue I see is that the script won't compile on the CLI with the needed require. Is it simply a requirement to have Sieve do run-time compilation for this to work?