Uma variável de automação é o que separa um "Seu chamado foi atualizado" genérico de um "Chamado 12345 - Impressora sem toner mudou para Em atendimento, com a técnica Ana Paula". No GLPI essas variáveis são as tags de notificação: marcadores ##...## que o motor substitui pelo dado real no momento do envio. Parecem triviais até o dia em que o nome do solicitante sai em branco no e-mail e ninguém sabe por quê. Este guia é o mapa que usamos na sustentação de parques GLPI de clientes para acertar template de primeira.
Onde as variáveis vivem: template não é notificação
Antes de escolher tags, entenda a cadeia que o GLPI monta, porque a maioria dos "a variável não funciona" na verdade é erro de configuração, não de sintaxe. Uma mensagem só sai quando quatro peças estão alinhadas:
- Notificação (Configurar > Notificações): liga o evento - novo chamado, acompanhamento, solução, pesquisa de satisfação.
- Template (Modelos de notificação): o corpo em texto e o corpo em HTML, onde você escreve as tags
##...##. - Destinatários: quem recebe - solicitante, técnico atribuído, grupo, observador.
- Fila e envio: o GLPI não manda o e-mail na hora; ele enfileira e a tarefa automática
queuednotificationdespacha.
Colocar a tag certa num template que não está vinculado a nenhuma notificação ativa não produz e-mail nenhum - e o erro não é da tag.
As tags que você realmente usa
As tags são contextuais: o conjunto disponível muda conforme o item (Ticket, Change, Problem). Para chamado, estas cobrem a maioria dos templates - todas conferidas direto no motor de notificação do GLPI 11:
| Tag | O que devolve |
|---|---|
##ticket.id## | Número do chamado |
##ticket.title## | Título |
##ticket.description## | Descrição (conteúdo da abertura) |
##ticket.url## | Link direto para o chamado (exige login) |
##ticket.status## | Status atual |
##ticket.priority## | Prioridade |
##ticket.category## | Categoria |
##ticket.creationdate## | Data de abertura |
##ticket.solvedate## | Data de solução |
##ticket.duedate## | Prazo de resolução (SLA) |
##ticket.authors## | Solicitante(s) - lista separada por vírgula |
##ticket.assigntousers## | Técnico(s) atribuído(s) - lista por vírgula |
##ticket.assigntogroups## | Grupo(s) atribuído(s) |
##ticket.solution## | Texto da solução |
##followup.author## / ##followup.description## | Dentro de ##FOREACHfollowups## |
##task.author## / ##task.description## | Dentro de ##FOREACHtasks## |
##author.name## / ##author.email## | Dentro de ##FOREACHauthors## |
Repare que ##ticket.assigntousers## devolve uma lista já pronta, separada por vírgula - o GLPI faz o implode internamente. Não é um loop, é texto plano: resolve o caso de "tenho dois técnicos e quero os dois no e-mail" sem nenhum truque.
O erro de campo mais comum: o solicitante não é ##user.name##
Este é, disparado, o problema que mais reabrimos em auditoria de template: o nome do solicitante chega vazio no e-mail. A causa quase sempre é a mesma - alguém copiou ##user.name## de um tutorial de recuperação de senha para dentro de uma notificação de chamado. Em notificação de Ticket, ##user.name## simplesmente não existe: ele pertence às notificações do objeto Usuário (reset de senha, criação de conta). O GLPI não acusa erro - só substitui por vazio, e o técnico passa a tarde caçando um bug que é de fonte de dado. O solicitante de um chamado é ##ticket.authors## (lista pronta) ou, se você quer nome e e-mail de cada um separadamente, o bloco FOREACH a seguir.
FOREACH: a parte que quase ninguém conhece
Um chamado tem N acompanhamentos, N tarefas, N solicitantes. Não existe uma tag mágica que despeje tudo formatado: o GLPI expõe as coleções por um bloco de repetição. Você abre o loop, escreve o miolo uma vez com as tags do item e fecha - e ainda dá para limitar a quantos itens quiser com FIRST ou LAST:
Ola ##ticket.authors##,
Seu chamado ##ticket.id## - ##ticket.title##
mudou para: ##ticket.status##
Tecnico(s): ##ticket.assigntousers##
Ultimo acompanhamento:
##FOREACH LAST 1 followups##
[##followup.date##] ##followup.author##:
##followup.description##
##ENDFOREACHfollowups##
Acesse: ##ticket.url##
O LAST 1 (também aceita FIRST e um número maior) é o que evita o e-mail quilométrico repetindo todo o histórico a cada novo acompanhamento - um pedido recorrente de cliente que a maioria "resolve" cortando conteúdo na marra, quando bastava o modificador. As coleções que aceitam FOREACH incluem followups, tasks, authors, actors, costs e os linkeds (linkedtickets, linkedchanges, linkedproblems).
Notificação multilíngue de graça: as tags ##lang.*##
Detalhe que só aparece quando você abre a lista completa de tags: cada tag de valor tem uma companheira de rótulo. Para ##ticket.status## (o valor) existe ##lang.ticket.status##, que imprime o rótulo "Status" traduzido para o idioma do destinatário. Montando o template com pares rótulo + valor, a mesma mensagem sai em português para um usuário e em espanhol para outro, sem duplicar template:
##lang.ticket.title##: ##ticket.title##
##lang.ticket.status##: ##ticket.status##
##lang.ticket.priority##: ##ticket.priority##
Num cliente com entidades em mais de um país, isso derruba a manutenção de "um template por idioma" para um único template. O valor você não traduz - o dado é o dado; o que muda é só o rótulo, e o ##lang.*## resolve isso sozinho.
Diagnóstico: a variável está certa, mas o e-mail não sai
Quando o template está impecável e mesmo assim o e-mail some, o problema não está na tag - está na fila. O GLPI grava cada mensagem em glpi_queuednotifications e a tarefa automática queuednotification é quem envia de fato. Se a tarefa não roda (cron parado) ou o SMTP recusa, a mensagem acumula com sent_time nulo. É a primeira coisa que rodamos num chamado de "notificação não chega":
-- Notificacoes enfileiradas que ja deveriam ter saido:
-- sent_time NULL = ainda nao enviada; send_time no passado = atrasada.
SELECT id, name AS assunto, recipient, send_time, sent_try
FROM glpi_queuednotifications
WHERE sent_time IS NULL
AND send_time <= NOW()
ORDER BY send_time ASC
LIMIT 30;
Linhas acumulando com sent_try subindo significam SMTP rejeitando; fila crescendo com sent_try em zero significa cron parado. Nos dois casos o template está certo - e você acabou de economizar a tarde que ia gastar reescrevendo tags à toa.
Onde cada variável funciona (matriz de decisão)
A confusão que herdamos de quase todo parque novo é achar que "modelo de chamado" e "template de notificação" são a mesma coisa. Não são - e só um dos dois faz substituição de ##tag##:
| Onde | Substitui ##tag##? | Para que serve |
|---|---|---|
| Template de notificação (corpo e assunto) | Sim - tags, FOREACH e ##lang.*## | Corpo de e-mail dinâmico |
| Modelo de chamado (TicketTemplate) | Não | Predefinir, ocultar ou tornar obrigatórios campos na abertura |
| Modelo de tarefa / acompanhamento | Não | Texto-base reutilizável, sem substituição dinâmica |
| Assunto (subject) da notificação | Sim | Mesmas tags do corpo, em uma única linha |
Dica final que vale por todo o resto: ao editar um template de notificação, o GLPI mostra a aba de tags disponíveis para aquele item específico. É a fonte da verdade - contextual e sempre alinhada à versão instalada. Antes de copiar uma tag de um blog (inclusive deste), confirme que ela aparece ali.
Precisa de notificações que informem de verdade - multilíngues, com o solicitante certo e sem e-mail preso na fila? Conheça a sustentação de GLPI da NexTool.
Revisado pela equipe NexTool Solutions.