Durante a semana, nossa equipe precisou migrar os grupos de contato do servidor de e-mails AtMail para o Zimbra. O analista (Helder), responsável pelo MTA (Mail Transfer Agent), capturou todos os grupos do AtMail através de uma consulta SQL diretamente ao Banco de Dados do servidor e exportou em formato texto. Feito isto, restava automatizar todo o processo para importação no Zimbra. Minha contribuição foi a codificação de um script em perl.
O arquivo texto exportado via consulta SQL apresentava o seguinte formato:
conta@dominio.com.br,Familia,pai@dominio.com.br,Meu Pai conta@dominio.com.br,Familia,irma@dominio.com.br,Minha irmã conta@dominio.com.br,Trabalho,colaborador1@empresa.com.br, Colaborador fulano
Conforme exibido acima, utilizamos como separador ‘,’; sendo a primeira posição a “identificação da conta“, a segunda é a “identificação do grupo“, em seguida o “e-mail do contato” e por último o “nome por extenso do contato“.
A execução manual no Zimbra para o grupo “Familia” é a seguinte:
#~ zmmailbox -z -m conta@dominio.com.br cct --folder '/Contacts' type group nickname 'Familia' fileAs 8:'Familia' dlist "'Meu Pai'<pai@dominio.com.br>, 'Minha irmã'<irma@dominio.com.br>" #~ zmsoap -z -v -t admin MigrateAccountRequest/migrate @action=contactGroup @id=`zmprov -l ga conta@dominio.com.br | grep "zimbraId:" | cut -d" " -f2`
O primeiro comando (zmmailbox) criará o grupo Familia “com os respectivos contatos” (Pai e Irmã). Porém, a migração completa que torna os contatos visíveis no Zimbra, para a conta em questão (conta@dominio.com.br), dependerá do comando zmsoap.
A primeira vista, parece simples. Mas, a dificuldade será concatenar todos o membros do grupo em um único comando (vide zmmailbox). Para fazer isto, optamos por um script em perl.
Segue o código:
#!/usr/bin/perl my $lista="/tmp/mail/lista.txt"; my @conta=(); my %grupo_usuario=(); my %grupos_lista=(); my %grupos_lista_email=(); sub read_lista { my @auxline = (); if (-e "$lista") { open FILE, "<$lista"; while (<FILE>) { @auxline = split /,/, $_,4; $auxline[0] =~ s/\n//; $auxline[1] =~ s/\n//; my $aux_grupo=""; my $find_conta=0, $find_grupo=0; $aux_grupo="$auxline[0]_$auxline[1]"; foreach my $aux_conta (@conta) { $find_conta=1 if ($aux_conta eq "$auxline[0]"); foreach my $aux2_grupo (@{$grupo_usuario{$aux_conta}}) { $find_grupo=1 if ($aux2_grupo eq "$aux_grupo"); } } push(@conta,"$auxline[0]") if ($find_conta == 0); push(@{$grupo_usuario{$auxline[0]}}, $aux_grupo) if ($find_grupo == 0); if ($auxline[2] ne "") { push(@{$grupos_lista{$aux_grupo}}, "$auxline[1],$auxline[2],$auxline[3]"); push(@{$grupos_lista_email{$aux_grupo}}, "$auxline[2]"); } } close(FILE); } } print "echo Processando $lista..."; read_lista; foreach my $aux_conta (@conta) { $aux_conta =~ s/\n//; print "\necho --- $aux_conta"; foreach my $aux_grupo (@{$grupo_usuario{$aux_conta}}) { my $aux2_grupo = $aux_grupo; $aux2_grupo =~ s/.*_//; my $aux2_lista = ""; my $conta_lista = 0; foreach my $aux_lista (@{$grupos_lista{"$aux_grupo"}}) { my ($l_grupo, $l_mail, $l_nome) = split(/,/, $aux_lista, 3); $l_grupo =~ s/\n//; $l_mail =~ s/\n//; $l_nome =~ s/\n//; if ($conta_lista == 0) { $aux2_lista="'$l_nome' <$l_mail>"; } else { $aux2_lista="$aux2_lista,'$l_nome' <$l_mail>"; } $conta_lista++; } print "\nzmmailbox -z -m $aux_conta cct --folder '/Contacts' type group nickname '$aux2_grupo' fileAs 8:'$aux2_grupo' dlist \"$aux2_lista\"" if ($aux_conta ne "") ; } print "\nzmsoap -z -v -t admin MigrateAccountRequest/migrate \@action=contactGroup \@id=\`zmprov -l ga $aux_conta | grep \"zimbraId:\" | cut -d\" \" -f2\`" if ($aux_conta ne ""); }
Para a execução e importação dos dados, edite o script e modifique a variável $lista, informando qual arquivo contém a estrutura do grupo com o separador ‘,‘.
“No primeiro laço (em read_lista), você pode escolher outro separador modificando a instrução split.“
Link para download:
http://linuxfirewall.com.br/linuxwp/wp-content/uploads/2019/08/zimbra-grp.zip
No Comments Yet