Um alerta por e-mail no Node-RED é uma das formas mais simples de ser avisado quando um valor de sensor publicado via MQTT sai da faixa. Neste tutorial você vai montar um flow que observa um topic de temperatura, envia um e-mail quando ela ultrapassa um limite, evita enviar dezenas de duplicatas e também avisa quando um dispositivo para de publicar de vez.
O que vamos construir
O flow final faz quatro coisas:
- Assina um topic de sensor em um broker MQTT.
- Decide se o valor está em estado de alarme, usando um limite alto e um limite de rearme mais baixo (histerese), para que um valor oscilando no limite não dispare e-mails repetidos.
- Envia um e-mail quando o alarme começa e outro quando ele é normalizado, com um cooldown para que um sensor instável não lote sua caixa de entrada.
- Envia um e-mail separado se nenhuma mensagem chegar por dez minutos, porque um sensor morto muitas vezes é mais perigoso do que uma leitura alta.
Nos exemplos usamos o servidor MQTT público gratuito em broker.connectmq.com com o prefixo de topic connectmq/demo/k7f3qa. Escolha sua própria string aleatória em vez de k7f3qa e lembre-se de que a área pública pode ser lida por qualquer pessoa e serve apenas para testes. O cenário é uma estufa, como as de produtores de hortaliças e flores no interior paulista.
Instalando o node de e-mail
O Node-RED não vem com um node de e-mail. Instale-o em Menu → Manage palette → Install pesquisando node-red-node-email, ou pela linha de comando no diretório de usuário do Node-RED:
cd ~/.node-red
npm install node-red-node-email
# depois reinicie o Node-RED
O pacote adiciona um node de saída e-mail, que envia via SMTP, e um node de entrada de e-mail, que lê uma caixa postal. Precisamos apenas do node de saída. O comportamento dele é simples: msg.payload vira o corpo, msg.topic vira o assunto e, se o campo To do node ficar vazio, msg.to define o destinatário.
Configurações SMTP que realmente funcionam
| Provedor | Servidor | Porta | Conexão segura | Observações |
|---|---|---|---|---|
| Gmail / Google Workspace | smtp.gmail.com | 465 | Ativada | Exige verificação em duas etapas e uma senha de app |
| Microsoft 365 | smtp.office365.com | 587 | Desativada (usa STARTTLS) | O SMTP AUTH precisa estar liberado para a caixa postal |
| Serviço transacional (SendGrid, Mailgun, SES) | Host do provedor | 465 ou 587 | Conforme o provedor | Melhor entregabilidade para e-mails automáticos |
| Relay local (Postfix) | localhost | 25 | Desativada | Só se você já roda um relay |
Com o Gmail, não use sua senha normal. Crie uma senha de app nas configurações de segurança da sua conta Google e cole-a no node. Para qualquer coisa além de um projeto pessoal, um serviço de e-mail transacional com domínio de envio verificado oferece melhor entregabilidade, porque e-mails de alerta automáticos enviados de uma caixa pessoal caem facilmente nos filtros de spam.
Montando o flow de alerta por e-mail no Node-RED
O flow é: mqtt in → function (lógica de alarme) → e-mail, mais um ramo com um node trigger para detecção de silêncio. Se você nunca ligou nodes MQTT, o tutorial Node-RED MQTT explica o node de configuração do broker em detalhes.
Passo 1: assine o sensor
Adicione um node mqtt in com:
- Servidor:
broker.connectmq.com, porta1883, um client ID único comonr-alerts-k7f3qa - Topic:
connectmq/demo/k7f3qa/greenhouse/temperature - Saída: auto-detect (objeto JSON analisado ou string)
Passo 2: a lógica de alarme
Um switch node simples que verifica payload > 30 envia um e-mail para cada leitura acima de 30. Se o sensor reporta a cada dez segundos, são 360 e-mails por hora. Em vez disso, guarde o estado no contexto do node e só emita nas transições. Coloque isto em um function node:
const HIGH = 30; // dispara o alarme neste valor ou acima
const RESET = 28; // normaliza o alarme neste valor ou abaixo
const COOLDOWN_MS = 15 * 60 * 1000; // tempo mínimo entre e-mails
let value = msg.payload;
if (typeof value === "object" && value !== null) value = value.value;
value = Number(value);
if (isNaN(value)) return null;
const inAlarm = context.get("inAlarm") || false;
const lastSent = context.get("lastSent") || 0;
const now = Date.now();
let event = null;
if (!inAlarm && value >= HIGH) event = "raised";
if (inAlarm && value <= RESET) event = "cleared";
if (!event) return null;
context.set("inAlarm", event === "raised");
// Sempre reporta a normalização, mas limita a taxa de novos alarmes
if (event === "raised" && now - lastSent < COOLDOWN_MS) {
node.status({ fill: "yellow", shape: "ring", text: "alarm suppressed (cooldown)" });
return null;
}
context.set("lastSent", now);
node.status({
fill: event === "raised" ? "red" : "green",
shape: "dot",
text: event + " at " + value
});
msg.topic = event === "raised"
? `ALARM: greenhouse temperature ${value} C`
: `Cleared: greenhouse temperature back to ${value} C`;
msg.payload =
`Greenhouse temperature ${event}.\n\n` +
`Current value: ${value} C\n` +
`Alarm limit: ${HIGH} C, reset limit: ${RESET} C\n` +
`Time: ${new Date(now).toISOString()}\n` +
`Source topic: connectmq/demo/k7f3qa/greenhouse/temperature\n`;
return msg;
A diferença entre HIGH e RESET é a faixa de histerese. Um valor oscilando entre 29,8 e 30,2 dispara uma vez e permanece em alarme até realmente cair para 28.
Passo 3: configure o node de e-mail
Ligue a saída do function node a um node de e-mail. Preencha destinatário, servidor, porta, conexão segura, usuário e senha conforme a tabela acima. Faça o deploy, e o status do node mostra se o login SMTP deu certo na primeira vez que uma mensagem passar por ele.
Passo 4: detecte dispositivos silenciosos
Adicione um segundo fio do node mqtt in para um node trigger configurado assim:
- Send: nothing
- Then: wait for 10 minutos, com extend delay if new message arrives marcado
- Then send: uma string como
No data from greenhouse sensor for 10 minutes
Cada leitura recebida reinicia o temporizador, então o trigger só dispara quando o sensor fica em silêncio. Envie a saída dele para um change node que define msg.topic como linha de assunto e, em seguida, para o mesmo node de e-mail.
Testando sem esperar uma onda de calor
Publique valores de teste em um terminal:
# normal
mosquitto_pub -h broker.connectmq.com -p 1883 -i test-k7f3qa -t "connectmq/demo/k7f3qa/greenhouse/temperature" -m "24.5"
# dispara o alarme
mosquitto_pub -h broker.connectmq.com -p 1883 -i test-k7f3qa -t "connectmq/demo/k7f3qa/greenhouse/temperature" -m "31.2"
# ainda alto, nenhum e-mail novo
mosquitto_pub -h broker.connectmq.com -p 1883 -i test-k7f3qa -t "connectmq/demo/k7f3qa/greenhouse/temperature" -m "30.4"
# normaliza
mosquitto_pub -h broker.connectmq.com -p 1883 -i test-k7f3qa -t "connectmq/demo/k7f3qa/greenhouse/temperature" -m "27.0"
Você deve receber exatamente dois e-mails. Durante os testes, reduza temporariamente COOLDOWN_MS e o atraso do trigger, e coloque um debug node em paralelo com o node de e-mail para ver o que seria enviado sem acionar o servidor SMTP toda vez.
Solução de problemas na entrega de e-mails
| Problema | O que verificar |
|---|---|
| O node mostra "Invalid login" | Use uma senha de app no Gmail; verifique se o SMTP AUTH está ativado nas caixas do Microsoft 365 |
| Timeout de conexão | A porta 25, e às vezes 465/587, é bloqueada por alguns provedores de internet e de nuvem; tente a outra porta ou um serviço transacional |
| Erro "Self signed certificate" | Combinação errada de porta e conexão segura, por exemplo conexão segura ativada na 587 |
| E-mails caem no spam | Envie de um domínio com SPF e DKIM configurados e evite assuntos todo em maiúsculas |
| Um e-mail por leitura | O function node não está guardando estado; garanta que você retorne null quando não há transição |
| Nenhum e-mail após reiniciar com o valor alto | O contexto fica na memória por padrão; isso é esperado, a próxima leitura reavalia o estado |
Se você precisa que o estado de alarme sobreviva a uma reinicialização do Node-RED, ative um armazenamento de contexto persistente no settings.js e use context.get("inAlarm", "file"). O guia de contexto do Node-RED explica as opções.
Alertas por e-mail no Node-RED vs regras de alerta por limite do ConnectMQ
Se seus dispositivos publicam em um broker ConnectMQ, você já tem uma segunda opção. O portal inclui regras de alerta por limite e um log de alertas: você escolhe um topic, define um limite e cada ultrapassagem fica registrada onde você e sua equipe podem revisá-la, sem rodar nenhum software extra.
As duas abordagens se complementam:
| Necessidade | Regras de alerta do portal | Flow de e-mail no Node-RED |
|---|---|---|
| Limite simples em um topic | Sim, configurado no portal | Sim |
| Histórico de alertas em um só lugar | Log de alertas no portal | Você constrói, por exemplo com Node-RED e MySQL |
| Lógica customizada (histerese, condições combinadas, horários) | Apenas regras de limite | Tudo o que você conseguir escrever em JavaScript |
| Entrega em caixa de entrada, chat ou SMS | Não é o propósito do log de alertas | Node de e-mail, além do Telegram ou de outros nodes de notificação |
| Nenhum servidor extra para manter | Sim | Precisa de uma instância do Node-RED |
Um padrão comum é configurar regras de limite no portal para visibilidade e auditoria e rodar ao lado um pequeno flow Node-RED para as poucas condições que precisam chegar ao celular de alguém à noite. Como o Node-RED é só mais um cliente MQTT, os dois leem os mesmos topics do mesmo broker. Esse é o formato geral das integrações com um broker MQTT gerenciado: o broker transporta as mensagens com confiabilidade, e ferramentas externas assinam e agem sobre elas.
Checklist de produção
- Saia do servidor público e use suas próprias credenciais (
YOUR_USERNAME,YOUR_PASSWORD,YOUR_CLIENT_ID) na porta 8883 com TLS. - Guarde as senhas SMTP nas credenciais do node, nunca em um function node ou em um arquivo de flow que você versiona no git.
- Use QoS 1 na assinatura para que uma desconexão breve não descarte silenciosamente a leitura que ultrapassa o limite.
- Mantenha o watchdog de silêncio; ele detecta baterias descarregadas, quedas de Wi-Fi e gateways travados.
- Envie para um endereço de grupo ou lista de distribuição em vez de uma única pessoa.
- Teste a cadeia completa todo mês publicando um valor alto falso.
Comece com o ConnectMQ
Os alertas são tão confiáveis quanto o broker que entrega as leituras. O ConnectMQ oferece um broker MQTT gerenciado com TLS, MQTT 5 e alertas por limite no portal, e seus flows Node-RED se conectam a ele como qualquer outro cliente. Crie um broker Serverless gratuito em app.connectmq.com, sem cartão de crédito, e em poucos minutos você leva este flow do servidor público para credenciais privadas.
Perguntas frequentes
Qual node do Node-RED envia e-mail?
O node de saída e-mail do pacote node-red-node-email. Instale-o pelo gerenciador de paleta e depois defina msg.payload para o corpo e msg.topic para o assunto.
Como faço o Node-RED parar de enviar um e-mail para cada leitura?
Guarde o estado de alarme no contexto e só envie nas transições, adicione um limite de rearme abaixo do limite de alarme para ter histerese e imponha um cooldown entre e-mails de alarme, como no function node acima.
O ConnectMQ pode enviar o e-mail no lugar do Node-RED?
O portal oferece regras de alerta por limite e um log de alertas. Para entregar notificações em uma caixa de entrada, rode um cliente como o Node-RED, que assina o broker e envia o e-mail.
Por que o Gmail rejeita o login do meu Node-RED?
O Google bloqueia senhas normais para SMTP a partir de aplicativos. Ative a verificação em duas etapas, gere uma senha de app e use-a no node de e-mail com smtp.gmail.com na porta 465 e conexão segura.



