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 Familiacom 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