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
Quando você envia e-mails usando um cliente de e-mail, como estamos fazendo nesse tutorial, o Zoho Mail guarda uma cópia dos e-mails enviados na pasta Enviados, mas ele permite desativar isso. Caso você não queira guardar cópias dos e-mails enviados por scripts, faça o seguinte:
- Faça login no Zoho Mail
- Acesse as Configurações
- Vá em Contas de e-mail, depois selecione a aba SMTP
- Desmarque a opção Salvar uma cópia dos e-mails enviados
- Clique em Salvar
Execute o script novamente e verá que o e-mail será entregue ao destinatário, mas uma cópia dele não será mais salva na pasta Enviados do seu Zoho Mail.
É 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!