Eu consegui com essa regra:
if envelope :regex "to" "([^.]*)\.?([^.]*)\.?([^.]*)\.?([^.]*)\.?([^.]*)\.?([^.]*)@.*$" {
if string :is "${1}" "" {} else { set :lower "part1" "${1} "; }
if string :is "${2}" "" {} else { set :lower "part2" "${2} "; }
if string :is "${3}" "" {} else { set :lower "part3" "${3} "; }
if string :is "${4}" "" {} else { set :lower "part4" "${4} "; }
if string :is "${5}" "" {} else { set :lower "part5" "${5} "; }
if string :is "${6}" "" {} else { set :lower "part6" "${6} "; }
set "targetfolder" "${part1}${part2}${part3}${part4}${part5}${part6}";
if string :is "${targetfolder}" "" {} else {
fileinto "domains.${targetfolder}";
}
}
O regex é uma repetição ([^.] *) \. até o último. Isso captura os não-pontos até que haja um ponto. O último apenas omite o último ponto e corresponde de um @ ao final do endereço.
Então, para cada string capturada, se não estiver vazia, adiciono um espaço após ela. Se estiver vazio, não terá espaço e essa parte ficará vazia. Você precisa de "parte", como você não pode atribuir para coincidir com variáveis.
Eu então concateno todas as strings com espaços ou vazios para obter o nome da pasta que quero.