Português do Brasil English
Devin no Facebook  Devin no Twitter  RSS do Site 
Linux    

Mandar e-mail via linha de comando no Linux


Comentários  27
Visualizações  
174,509

Todo mundo fica dizendo que e-mail é coisa do passado e que o futuro mesmo é utilizar as redes sociais e a Web 2.0 (lol) para se comunicar. Mas a verdade é que o e-mail ainda é muito útil e acredito que vai demorar bastante tempo para que isso mude. No pior dos casos, e-mail ainda continua sendo uma boa forma de registro e notificação.

E no caso da notificação, enviar e-mail via linha de comando do Linux é bastante útil. Terminou uma tarefa no crontab? Envia um e-mail com o resultado. Caiu um servidor? Envia um e-mail para alguém notificando. Ou então querer apenas testar um servidor de e-mail local? É só usar a imaginação.

Como todos sabemos, o Linux conta com o recurso de shell, que por sua vez permite criar poderosos programas que são chamados de shell scripts. Vejamos aqui esta pequena dica de como enviar e-mail via linha de comando.

O comando mail

O comando mail será usado aqui primeiramente. Ele está contido no pacote mailx, geralmente em todas as distribuições (Debian por exemplo, é o bsd-mailx, Red Hat/Fedora seria apenas mailx). Além disso, é necessário um servidor de e-mail local, o que é comum em todas as distribuições Linux por aí.

Mandando um e-mail com o comando mail, manualmente, via linha de comando:

mail -s "Assunto Teste" seuemail@dominio.com.br

O parâmetro -s especifica o assunto da mensagem. Coloque entre aspas como no exemplo para que ele reconheça todo o assunto com espaços. O último argumento é o endereço para quem se vai enviar a mensagem.

Quando você der ENTER, não vai aparecer nada e nem vai voltar pro prompt. Digite então toda a sua mensagem e quando terminar, aperte CTRL+D. Vai aparecer um “Cc:“, que significa que se você quiser enviar cópia para alguém, basta colocar agora. Aperte ENTER e vói-lá! A mensagem foi para o destinatário (bem, pelo menos era pra ir!).

Agora vamos utilizar um modo mais rápido e não-interativo de se mandar o mesmo e-mail:

echo "Isto é um e-mail de teste" | mail -s "Assunto Teste 2" seuemail@dominio.com.br

Agora ao invés de você ter que digitar, ele já joga a mensagem “Isto é um e-mail de teste” no corpo e manda o e-mail. Isso serve para você acoplar justamente em um shell script sem ter que precisar que alguém digite alguma coisa na hora.

Mas o echo ainda é limitado para mensagens grandes, então vamos ler de um arquivo:

mail -s "Assunto Teste 3" seuemail@dominio.com.br < /var/log/syslog

Ele usou um redirecionador (mais sobre eles no artigo Shell: Entrada e Saída) para que o conteúdo do arquivo /var/log/syslog se tornasse o corpo da mensagem. Mais uma vez, você pode usar um shell-script para gerar o arquivo com o conteúdo que você quiser e depois mandar por e-mail.

Há outros parâmetros no comando mail também. Para ver todos, basta ler a boa e velha página de manual (man mail).

Outro exemplo:

echo 'Maravilha!' | mail -s "Assunto Teste 4" seuemail@dominio.com.br \
-c outroemail@dominio.com.br,maisum@dominio.com.br \
-b espiaodobatima@dominio.com.br

Neste caso, mandei um e-mail para seuemail@dominio.com.br, com cópia para outroemail@dominio.com.br e maisum@dominio.com.br (vários e-mails separados por vírgula) e uma cópia oculta para espiaodobatima@dominio.com.br.

O comando mail faz parte do sistema padrão de e-mails locais que é utilizado há vários anos pelos sistemas Unix em geral. Por isso, o campo From, ou seja, o Remetente da mensagem vai ser o usuário que está executando o comando, mais o nome completo da máquina. Exemplo, se eu sou o usuário eitch, na máquina batima.devin.com.br, quer dizer que o Remetente será: eitch@batima.devin.com.br.

Anexos com o mutt

Como nem tudo são flores, na hora de mandar arquivos anexos junto a mensagem, o comando mail não suporta essa funcionalidade. Neste caso, geralmente o pessoal utiliza o cliente de e-mail de linha de comando mutt.

icon nota Mandar e mail via linha de comando no Linux
NOTA

O mutt é na verdade um cliente de e-mail para linha de comando completo. Pode ser que sua distribuição Linux não tenha esse programa instalado. Então se o comando mutt não for encontrado, instale o programa junto à sua distribuição (com o apt-get, yum, ou outros).

O comando é bem parecido com o do mail:

echo "Assunto Anexo" | mutt -s "Assunto Teste 5" -a arquivo.zip seuemail@dominio.com.br

O parâmetro -a é quem cuida dos anexos. No caso de enviar vários anexos, é necessário também que o -a fique antes do destinatário, seguido por “–”, assim:

echo "Assunto Anexo" | mutt -s "Assunto Teste 6" \
-a /home/eitch/imagem.jpg /var/log/syslog /home/eitch/arquivo.zip -- hugo.cisneiros@gmail.com

Via um servidor SMTP

Não são todos os sistemas que tem um servidor de e-mail local. Por exemplo, algumas máquinas de hostings não possuem um sendmail, postfix ou qmail instalados e prontos para usar. Em outros casos, organizações preferem ficar sem o servidor de e-mail de cada máquina e concentrar tudo em uma única file de e-mail, um único servidor de e-mail na rede. Este caso do servidor de e-mail único é bem comum.

O SMTP – Simple Mail Transfer Protocol é o protocolo para envio de e-mails e um servidor SMTP é justamente o que recebe os e-mails e repassa para outros servidores necessários. Não vou me aprofundar muito no assunto SMTP, mas vamos aprender um pouco como usá-lo diretamente.

icon nota Mandar e mail via linha de comando no Linux
NOTA

Para fazer essa parte, você precisa ter um servidor STMP já funcionando. Neste tutorial, usaremos como exemplo o smtp.devin.com.br, que é fictício. Substitua este servidor pelo seu.

Pra enviar o e-mail, vamos primeiro conversar diretamente com o servidor SMTP através do comando nc. O nc é o comando netcat e serve para abrir conexões TCP puras e transferir dados para ela (como se fosse um telnet não-interativo). Se o comando nc não existir na sua máquina, instale-o dos repositórios, já que vem em praticamente todas as distribuições Linux.

Exemplo de script shell para mandar e-mail via nc:

#!/bin/bash
#
cat <<EOF | /usr/bin/nc smtp.devin.com.br 25
HELO $(hostname)
MAIL FROM: <hugo@devin.com.br>
RCPT TO: <destino@dominio.com.br>
DATA
From: Hugo Cisneiros (Eitch) <hugo@devin.com.br>
To: Nome do Destino <destino@dominio.com.br>
Date: $(date '+%a, %d %b %Y %H:%M:%S %z')
Subject: Assunto da mensagem
Content-Type: text/plain; charset=UTF-8
                                                                                                                                                                                              
Fala Destinatário!

Estou mandando este e-mail via shell script, usando o nc diretamente pelo SMTP.
Legal né?

Abraços!

.
QUIT
EOF

O que fizemos no exemplo é conversar usando o protocolo SMTP.

  • Na linha 3 usamos o comando cat para capturar tudo o que digitarmos, até haver uma linha EOF (End Of File). Pense nisso como se fosse um comando echoextendido. Depois repassamos todo esse texto via pipe para o comando nc smtp.devin.com.br 25, que conecta ao servidor SMTP na porta 25. Para aprender mais sobre o pipe veja o Shell: Entrada e Saída;
  • A linha 4 identifica quem é você. O comando hostname identifica-o com o nome da sua máquina;
  • As linhas 5-6 contém de quem é o e-mail (MAIL FROM) e qual o destino (RCPT TO);
  • A linha 7, com o comando DATA, especifica que tudo que tiver a partir da próxima linha serão os dados do e-mail. Estes dados terminam quando houver uma linha apenas com o caracter ponto (.), que vai significar que o e-email acabou e pode ser mandado;
  • As linhas 8-12 contém o cabeçalho do e-mail. Cada cabeçalho é uma linha. No exemplo temos o nome da pessoa que enviou, do destinatário, a data atual (gerada automaticamente pelo comando date), o assunto (Subject) da mensagem e a codificação da mensagem (para a acentuação do português) não sair estranha. Os cabeçalhos acabam quando uma linha em branco é recebida;
  • As linhas 14-20 são o corpo da mensagem. Engloba tudo depois da linha em branco que finaliza o cabeçalho, até o caracter ponto que termina o e-mail.
  • A linha 21, já falada, termina o e-mail. Ao receber o ponto, o servidor SMTP já coloca a mensagem na fila para o envio. A partir daí você pode enviar outro e-mail (começando com o MAIL FROM), ou sair, como na próxima linha com o comando QUIT.
  • Na última linha, o EOF avisa ao cat que acabou o texto e o manda para o comando nc, como diz a linha 3.

Até que é fácil né? Basta agora ir substituindo os campos de e-mail e testando. Esse método com o comando nc é o ideal para utilizar junto com shell-scripts em servidores. Ele só não serve muito bem para mandar anexos, pois transformar os anexos para mandar via nc não é algo trivial de se fazer.

Referências


Comentários  27
Visualizações  
174,509


TagsLeia também

Apaixonado por Linux e administração de sistemas. Viciado em Internet, servidores, e em passar conhecimento. Idealizador do Devin, tem como meta aprender e ensinar muito Linux, o que ele vem fazendo desde 1997 :-)


Leia também



Comentários

27 respostas para “Mandar e-mail via linha de comando no Linux”

  1. Marcelo Marques disse:

    Congrats. Utilizo muito isso para testes em novos servidores ou servidores de monitoramente. heheheehe! Abs!

  2. O tutorial está muito legal, só falta dizer como inserir um destinatário oculto. ;P

  3. Miwako disse:

    Muito show ^^

  4. gabriel disse:

    só fiquei na dúvida pelo seguinte, na parte de anexar o "arquivo.zip" eu tenho que estar dentro do diretório onde está o "arquivo.zip" não é ?

    no meu caso eu tentei anexar uma foto (arquivo.jpg) e não deu certo! :S

  5. Haddaway disse:

    Tenho uma dúvida!!! Qual o nome de e-mail que aparece quando a pessoa recebe sua mensagem!!!?

  6. Bertao disse:

    Haddaway, o nome pode ser visto através do comando "-s"

    Ex:

    Echo "teste " | mail -s " FAVOR ABRIR ESTE EMAIL" -a /tmp/bola.jpeg seuemail@hotmail.com

    Quando chegar para o seu email, terá nome como "FAVOR ABRIR …"

    Isto que entendi,,

    abs

  7. José Luiz disse:

    O computador que utilizo está ligado na rede da empresa. Nele instalei o Ubuntu via máquina virtual. Estou testando o envio de e-mail da máquina linux virtual para o meio externo via linha de comando: >echo "teste de envio" | mailx -s "TESTE" e-mail, mas não está funcionando. Gostaria de saber se tenho de fazer configurações no Ubuntu para funcionar. Obrigado, José Luiz

  8. alan disse:

    tem como enviar uma lista de email ?

  9. romero disse:

    Olá, no techo: "Mas como nem tudo são flores, na hora de mandar arquivos anexos junto a mensagem, o comando mail suporta essa funcionalidade."

    Acredito que vc quis dizer: "…o comando mail NÃO suporta essa funcionalidade."

  10. @romero

    Arrumei aqui, muito obrigado!

  11. Leo_Frozen disse:

    Tenho tentando enviar um uma mensagem para minha conta do gmail, mas sem sucesso.

    mail -s "aqui vai o assunto" meu_email@gmail.com < texto_do_email.txt

    é preciso fazer alguma configuração na minha conta de e-mail para que a mensagem chegue?

    é necessário especificar porta (995)ou o servidor (pop.googlemail.com) no comando mail (se sim, como faz?) ??

    • eitchugo disse:

      Se não apresentou nenhum erro, é bom olhar nos logs o que aconteceu. Quando ele usa o servidor de e-mail local, o e-mail é colocado em uma fila, e desta fila ele sai pros outros servidores. O log dessa fila pode ser encontrado em /var/log/maillog (ou /var/log/mail.log).

      Por exemplo, aqui no Brasil, muitos provedores bloqueiam a saída para a porta 25 das conexões "residenciais" para evitar SPAM. Isso pode ser identificado nos logs como vários "Connection Timeout" ao tentar se conectar nos sevidores SMTP.

  12. Fabio Atala disse:

    Amigo o comando mutt não funciona no bash.

    • eitchugo disse:

      O mutt é na verdade um cliente de e-mail para linha de comando completo. Pode ser que sua distribuição Linux não tenha esse programa instalado. Então se o comando mutt não for encontrado, instale o programa junto à sua distribuição (com o apt-get, yum, ou outros).

      Atualizei o tutorial com essa informação :)

  13. Andre disse:

    Sou um iniciante no linux ubuntu fiz tudo como explicado no tutorial, so que e o mail não chegou no destinatário mais tbm não apresentou nem um ero tem algo que pode ser feito ?

    • eitchugo disse:

      Se não apresentou nenhum erro, é bom olhar nos logs o que aconteceu. Quando ele usa o servidor de e-mail local, o e-mail é colocado em uma fila, e desta fila ele sai pros outros servidores. O log dessa fila pode ser encontrado em /var/log/maillog (ou /var/log/mail.log).

      Por exemplo, aqui no Brasil, muitos provedores bloqueiam a saída para a porta 25 das conexões "residenciais" para evitar SPAM. Isso pode ser identificado nos logs como vários "Connection Timeout" ao tentar se conectar nos sevidores SMTP.

  14. Mateus disse:

    Ao tentar enviar via nc obtive o seguinte erro:

    220 bart0059.correio.pw ESMTP Postfix (Debian/GNU)
    250 bart0059.correio.pw
    250 2.1.0 Ok
    503 5.0.3 <unknown[177.10.46.182]>: Client host rejected: Para envio de mensagens e necessaria autenticacao. Para saber como corrigir este erro acesse: http://wiki.locaweb.com/pt-br/Email_Locaweb_-_Env… /This mail server requires authentication
    554 5.5.1 Error: no valid recipients
    221 2.7.0 Error: I can break rules, too. Goodbye.

    Sabe como posso resolver?

    • eitchugo disse:

      Pois é Mateus, nesse caso seu servidor SMTP precisa de usuário e senha para poder enviar um e-mail por ele. Eu nunca precisei fazer isso, por isso não sei como ajudar. Mas é algo bom para eu pesquisar e complementar aqui no tutorial! :)

      • Mateus disse:

        Vou pesquisar aqui também. Muito Obrigado.

        • Mateus disse:

          Consegui enviar usando o Sendmail :

          pacotes para instalação :

          sendemail
          libio-socket-ssl-perl

          comando: sendEmail -f origem -t destino -u "assunto" -m "msg" -s smtp.compels.net:587 -xu origem -xp senha

          Talvez ocorra um erro na linha 332 do aquivo SSL.pm , basta substituir o que está escrito lá por m{^(!?)(?:(SSL(?:v2|v3|v23|v2/3))|(TLSv1[12]?))}i e pronto.

  15. gustavo disse:

    Olá, eu preciso enviar um email com um arquivo em anexo pelo prompt do windows. Tem como me ajudar?

  16. Deivison Xavier disse:

    Consegui utilizar o script, enviou o email normailmente mas a data está errada quando chega ao destinatario:
    data: 31 de dezembro de 1969 21:00

    o date no script pega a data atual, e no sevidor a data também está correta. O que pode está ocorrendo?

  17. Marcelo disse:

    Boa tarde!
    Sei que o tópico é antigo, mas o assunto é muito interessante . . .
    Para enviar imagem no corpo da mensagem, é necessário "setar" o valor da variável Content-Type para text/html,
    da seguinte maneira:
    echo -e "n Testando envio de IMAGEM n" |mutt -e "set content_type=text/html" -s "ASSUNTO” -a imagem.png — email_destinatário

    Depois do anexo é usado "–" (hífen hífen)

    Aproveitando,
    para inserir o destinatário oculto (BCC), use a opção -b => Specify a blind-carbon-copy (BCC) recipient <=
    CC use -c => Specify a carbon-copy (CC) recipient <=

    Configuração do mutt:
    cat ~/.muttrc

    set from = 'EMAIL'
    set realname = 'NOME'
    set imap_user = 'EMAIL'
    set imap_pass = 'SENHA'
    set folder = 'imaps://imap.gmail.com:993'
    set spoolfile = '+INBOX'
    set postponed='+[Gmail]/Drafts'
    set header_cache=~/.mutt/cache/headers
    set message_cachedir=~/.mutt/cache/bodies
    set certificate_file=~/.mutt/certificates
    set smtp_url = 'smtps://LOGIN@smtp.gmail.com:465/'
    set smtp_pass = 'SENHA'
    set move = no
    set imap_keepalive = 900

    Veja a page do man no ICEWEASEL:
    man -H/usr/bin/iceweasel mutt

    Att.,
    Marcelo

  18. mceagle disse:

    Excelente teste! Com o google não funcionou (proteção anti spam é claro, diz a mensagem). Mas irei criar um MTA (postfix eu acho) pra testar mais a fundo!

Deixe uma resposta