Linux Kamarada

Como enviar e-mails a partir de shell scripts com o comando mailx

O e-mail é um meio de comunicação bastante comum nos dias de hoje. A maioria das pessoas tem conta em algum serviço de e-mail gratuito como Gmail, Yahoo, Outlook ou alternativos e os usa a partir do navegador (pelo webmail) ou de algum aplicativo pra smartphone. Há quem use clientes de e-mail para desktop, como o Evolution ou o Thunderbird. Mas há também cliente de e-mail para o terminal, como o mailx e o Mutt.

Não imagino que alguém curta digitar comandos para enviar e-mails (embora o Mutt com sua interface ncurses possa quebrar um galho quando, por qualquer motivo, a interface gráfica não está disponível). Mas comandos como o mailx podem ser úteis quando você quer enviar um e-mail durante a execução de um script, geralmente agendado.

Há vários exemplos de usos: avisar que um script foi executado com sucesso ou não, e informar o resultado ou uma mensagem de erro; alertar que um script de monitoramento detectou algo (como que o espaço livre em disco está pouco); informar que um script de backup foi concluído, possivelmente até mesmo enviando algum arquivo em anexo; etc.

Nesse tutorial, você verá algumas formas possíveis de enviar e-mails pelo terminal (e a partir de shell scripts) usando o mailx, que já vem instalado por padrão no openSUSE Leap e pode ser facilmente instalado no Linux Kamarada.

O Heirloom mailx (antes chamado de nail) é um cliente de e-mail com interface de linha de comando para sistemas baseados no Unix, como o Linux. Ele mantém compatibilidade em grande parte (mas não totalmente) com o cliente de e-mail original do Unix, o mail, ao mesmo tempo em que adiciona algumas funcionalidades. É software livre e é empacotado para fácil instalação por várias distribuições Linux.

O passo a passo a seguir foi testado no openSUSE Leap 15.3 e no Linux Kamarada 15.2.

Para variar, vou usar um serviço de e-mail alternativo ao Gmail, o Zoho Mail. Criei uma conta nesse serviço só para enviar e-mails a partir de scripts para meu e-mail pessoal.

1) Envio de e-mail com MTA local

A forma recomendada de enviar e-mails a partir de shell scripts é com o auxílio de um MTA local, como explicado no tutorial:

Os exemplos a seguir consideram que o Postfix foi configurado conforme esse tutorial.

O mínimo que você precisa digitar para invocar o comando mailx para enviar um e-mail é:

1
$ mailx -r "seunomedeusuario@zohomail.com" "emaildodestinatario@exemplo.com"

A opção -r deve vir acompanhada do endereço de e-mail do remetente (o seu) e o endereço de e-mail do destinatário deve ser o último argumento.

O mailx pergunta o assunto (subject) da mensagem:

1
Subject:

Digite o assunto da mensagem e tecle Enter. Na sequência, digite o corpo da mensagem:

1
2
Subject: Assunto do e-mail
Corpo do e-mail

Aqui você pode digitar à vontade, inclusive teclando Enter para iniciar novas linhas quantas vezes precisar. Quando terminar de digitar o e-mail, tecle Ctrl + D. Com isso, você vai enviar o sinal de EOT (end-of-transmission, “fim da transmissão”) para o mailx, que encerrará.

Seu terminal agora deve estar assim:

1
2
3
4
$ mailx -r "seunomedeusuario@zohomail.com" "emaildodestinatario@exemplo.com"
Subject: Assunto do e-mail
Corpo do e-mail
EOT

Se tudo deu certo, dentro de alguns instantes o destinatário já terá recebido o e-mail:

Você pode conseguir o mesmo efeito com apenas um comando, combinando echo para informar o corpo da mensagem e a opção -s para informar o assunto:

1
$ echo "Corpo do e-mail" | mailx -r "seunomedeusuario@zohomail.com" -s "Assunto do e-mail" "emaildodestinatario@exemplo.com"

Com esse comando, o mailx executa imediatamente e não espera você digitar mais nada. Esse comando já pode ser inserido em um shell script.

Mais algumas opções que você pode adicionar ao comando mailx:

  • Cópia: opção -c
  • Cópia oculta: opção -b
  • Anexo: opção -a (pode usar mais de uma vez, se precisar enviar mais de um anexo)

Exemplo:

1
$ echo "Corpo do e-mail" | mailx -r "seunomedeusuario@zohomail.com" -s "Assunto do e-mail" -c "emaildacopia@exemplo.com" -b "emaildacopiaoculta@exemplo.com" -a backup.zip "emaildodestinatario@exemplo.com"

Veja a seguir um exemplo de script que você pode fazer com o comando mailx:

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash

DE="seunomedeusuario@zohomail.com"
PARA="emaildodestinatario@exemplo.com"
CC="emaildacopia@exemplo.com"
CCO="emaildacopiaoculta@exemplo.com"
ASSUNTO="Assunto do e-mail"
CORPO="Corpo do e-mail"
ANEXO="backup.zip"

echo "$CORPO" | mailx -r "$DE" -s "$ASSUNTO" -c "$CC" -b "$CCO" -a "$ANEXO" "$PARA"

Se você executar esse script e der tudo certo, dentro de alguns instantes os destinatários já terão recebido o e-mail:

2) Envio de e-mail sem MTA local

Você pode usar o mailx apenas, sem auxílio de nenhum outro software.

Nesse caso, você deve passar as configurações da conexão SMTP para o próprio mailx.

Uma alternativa seria acrescentar essas configurações no script:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash

SERVIDOR="smtp://smtp.zoho.com:587"
SENHA="SuaSenha"

DE="seunomedeusuario@zohomail.com"
PARA="emaildodestinatario@exemplo.com"
CC="emaildacopia@exemplo.com"
CCO="emaildacopiaoculta@exemplo.com"
ASSUNTO="Assunto do e-mail"
CORPO="Corpo do e-mail"
ANEXO="backup.zip"

echo "$CORPO" | mailx -S smtp="$SERVIDOR" \
-S smtp-auth-user="$DE" \
-S smtp-auth-password="$SENHA" \
-S smtp-use-starttls \
-r "$DE" -s "$ASSUNTO" -c "$CC" -b "$CCO" -a "$ANEXO" "$PARA"

(note que eu dividi o comando mailx em algumas linhas para melhor legibilidade)

Mas não é recomendado deixar uma senha em um arquivo de texto simples como um script, principalmente se você vai expor esse arquivo publicamente, por exemplo, em um sistema de controle de versão, como o Git.

O melhor é escrever as configurações da conexão SMTP no arquivo de configuração do mailx, o .mailrc, na sua pasta pessoal. Crie-o com o seu editor de texto preferido, por exemplo:

1
$ vim ~/.mailrc

Ou:

1
$ gedit ~/.mailrc

E copie e cole nele o seguinte conteúdo:

1
2
3
4
set smtp=smtp://smtp.zoho.com:587
set smtp-auth-user=seunomedeusuario@zohomail.com
set smtp-auth-password=SuaSenha
set smtp-use-starttls

Note que esse arquivo também é um arquivo de texto simples. Para torná-lo um pouco mais seguro, você pode ajustar suas permissões para que apenas seu usuário possa acessá-lo:

1
$ chmod 600 ~/.mailrc

E não exponha esse arquivo publicamente, mantenha-o apenas na sua pasta pessoal.

Feito isso, você pode voltar o script à versão anterior, sem as configurações de conexão.

Conclusão

É isso! Espero que esse tutorial possa ter te ajudado. Se você é administrador de sistemas e/ou de redes, certamente vai fazer muitos scripts como esses.

O mailx não é o único programa que pode ser usado para enviar e-mails a partir de shell scripts. Existem algumas alternativas. Como eu disse, decidi usá-lo pela conveniência, por já vir instalado no openSUSE.

Se ficou com alguma dúvida ou tiver algo a sugerir, escreva nos comentários.

Até a próxima!

Referências

Me paga um café?
Se você gostou muito, se foi muito útil pra você, será que vale um café? Se quiser, você pode "me pagar um café" pelo PayPal ou contribuir com o projeto de outras formas.

Comentários

Sobre

O Projeto Linux Kamarada visa divulgar e promover o Linux como um sistema operacional robusto, seguro, versátil e fácil de usar, adequado para o uso diário seja em casa, no trabalho ou no servidor. Os focos do projeto são principalmente distribuição e documentação.

Anúncios

Facebook

Autor