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  33
Visualizações  
321.567

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.

NOTA
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.

NOTA
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:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/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

321.567

Comentários  33
Visualizações  
321.567


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

Comentários (35)

Carregando... Logando...
  • Logado como
alguem aqui tem comanda pra configura centos pra smtp qualquer coisa chama email empresa.dividas@gmail.com
Como faco para enviar um email e no corpo do email colocar o output de um comando? Por exemplo:

Prezado Cliente

Informamos que o filesystem /home esta com alto consumo e solicitamos que seja verificado para que nao impacte na performance do servidor/aplicacao." (Essa parte ja consegui)

Mas quero enviar no corpo do email o output do comando "df -h /home"
Show de bola o mutt, enviei diversos anexos para o meu Gmail.
Percebi que ele entra num modo interativo do mutt, acredito que seja possível disparar e-mail sem entrar no modo interativo, para inserir em alguns scripts.

Usei: "mutt -s "Subjetc ... " vandomen@gmail.com -a script*"
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?
2 respostas · ativo 429 semanas atrás
pode ser timezones diferentes
Não sei dizer, nos meus testes a data sempre foi correta :(
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!
2 respostas · ativo 444 semanas atrás
Boa tarde "mceagle".
Para funcionar com o gmail, é necessário alterar a configuração da conta,
Ativando o acesso a aplicativos menos seguros.
Para isso, estando logado, use o link abaixo: https://www.google.com/settings/security/lesssecu...
E marque a opção "Ativar"

Att.:
Marcelo Oliver
Muitíssimo obrigado Marcelo Oliver.
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
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 ?
3 respostas · ativo 558 semanas atrás
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.
Acho que tá acontecendo isso aqui, por no final do log aparece "alt2.gmail-smtp-in.l.google.com[74.125.136.26]:25: Connection timed out".
Tem alguma maneira de contornar essa situação?
Valeu!
smtp do gmail e na porta 587
Olá, eu preciso enviar um email com um arquivo em anexo pelo prompt do windows. Tem como me ajudar?
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?
3 respostas · ativo 585 semanas atrás
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! :)
Vou pesquisar aqui também. Muito Obrigado.
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.
muito bom tutorial
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?) ??
1 resposta · ativo 615 semanas atrás
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.
Amigo o comando mutt não funciona no bash.
1 resposta · ativo 615 semanas atrás
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 :)
@romero

Arrumei aqui, muito obrigado!
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."
tem como enviar uma lista de email ?
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
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
Tenho uma dúvida!!! Qual o nome de e-mail que aparece quando a pessoa recebe sua mensagem!!!?
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
Muito show ^^
O tutorial está muito legal, só falta dizer como inserir um destinatário oculto. ;P
Congrats. Utilizo muito isso para testes em novos servidores ou servidores de monitoramente. heheheehe! Abs!

Postar um novo comentário

Comments by