{"id":783,"date":"2014-09-24T17:30:21","date_gmt":"2014-09-24T20:30:21","guid":{"rendered":"http:\/\/blog.abratel.com.br\/?p=783"},"modified":"2014-09-24T17:44:29","modified_gmt":"2014-09-24T20:44:29","slug":"mandar-e-mail-via-linha-de-comando-no-linux","status":"publish","type":"post","link":"https:\/\/blog.abratel.com.br\/?p=783","title":{"rendered":"Mandar e-mail via linha de comando no Linux"},"content":{"rendered":"<p>Todo mundo fica dizendo que e-mail \u00e9 coisa do passado e que o futuro mesmo \u00e9 utilizar as redes sociais e a Web 2.0 (lol) para se comunicar. Mas a verdade \u00e9 que o e-mail ainda \u00e9 muito \u00fatil 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\u00e7\u00e3o.<\/p>\n<p>E no caso da notifica\u00e7\u00e3o, enviar e-mail via linha de comando do Linux \u00e9 bastante \u00fatil. Terminou uma tarefa no crontab? Envia um e-mail com o resultado. Caiu um servidor? Envia um e-mail para algu\u00e9m notificando. Ou ent\u00e3o querer apenas testar um servidor de e-mail local? \u00c9 s\u00f3 usar a imagina\u00e7\u00e3o.<\/p>\n<p>Como todos sabemos, o Linux conta com o recurso de shell, que por sua vez permite criar poderosos programas que s\u00e3o chamados de shell scripts. Vejamos aqui esta pequena dica de como enviar e-mail via linha de comando.<\/p>\n<p><strong>O comando mail<\/strong><\/p>\n<p>O comando mail ser\u00e1 usado aqui primeiramente. Ele est\u00e1 contido no pacote mailx, geralmente em todas as distribui\u00e7\u00f5es (Debian por exemplo, \u00e9 o bsd-mailx, Red Hat\/Fedora seria apenas mailx). Al\u00e9m disso, \u00e9 necess\u00e1rio um servidor de e-mail local, o que \u00e9 comum em todas as distribui\u00e7\u00f5es Linux por a\u00ed.<\/p>\n<p>Mandando um e-mail com o comando mail, manualmente, via linha de comando:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nmail -s &quot;Assunto Teste&quot; seuemail@dominio.com.br\r\n<\/pre>\n<p>O par\u00e2metro -s especifica o assunto da mensagem. Coloque entre aspas como no exemplo para que ele reconhe\u00e7a todo o assunto com espa\u00e7os. O \u00faltimo argumento \u00e9 o endere\u00e7o para quem se vai enviar a mensagem.<\/p>\n<p>Quando voc\u00ea der ENTER, n\u00e3o vai aparecer nada e nem vai voltar pro prompt. Digite ent\u00e3o toda a sua mensagem e quando terminar, aperte CTRL+D. Vai aparecer um \u201cCc:\u201c, que significa que se voc\u00ea quiser enviar c\u00f3pia para algu\u00e9m, basta colocar agora. Aperte ENTER e v\u00f3i-l\u00e1! A mensagem foi para o destinat\u00e1rio (bem, pelo menos era pra ir!).<\/p>\n<p>Agora vamos utilizar um modo mais r\u00e1pido e n\u00e3o-interativo de se mandar o mesmo e-mail:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\necho &quot;Isto \u00e9 um e-mail de teste&quot; | mail -s &quot;Assunto Teste 2&quot; seuemail@dominio.com.br\r\n<\/pre>\n<p>Agora ao inv\u00e9s de voc\u00ea ter que digitar, ele j\u00e1 joga a mensagem \u201cIsto \u00e9 um e-mail de teste\u201d no corpo e manda o e-mail. Isso serve para voc\u00ea acoplar justamente em um shell script sem ter que precisar que algu\u00e9m digite alguma coisa na hora.<\/p>\n<p>Mas o echo ainda \u00e9 limitado para mensagens grandes, ent\u00e3o vamos ler de um arquivo:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nmail -s &quot;Assunto Teste 3&quot; seuemail@dominio.com.br &lt; \/var\/log\/syslog\r\n<\/pre>\n<p>Ele usou um redirecionador (mais sobre eles no artigo Shell: Entrada e Sa\u00edda) para que o conte\u00fado do arquivo \/var\/log\/syslog se tornasse o corpo da mensagem. Mais uma vez, voc\u00ea pode usar um shell-script para gerar o arquivo com o conte\u00fado que voc\u00ea quiser e depois mandar por e-mail.<\/p>\n<p>H\u00e1 outros par\u00e2metros no comando mail tamb\u00e9m. Para ver todos, basta ler a boa e velha p\u00e1gina de manual (man mail).<\/p>\n<p>Outro exemplo:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\necho 'Maravilha!' | mail -s &quot;Assunto Teste 4&quot; seuemail@dominio.com.br \\\r\n-c outroemail@dominio.com.br,maisum@dominio.com.br \\\r\n-b espiaodobatima@dominio.com.br\r\n<\/pre>\n<p>Neste caso, mandei um e-mail para seuemail@dominio.com.br, com c\u00f3pia para outroemail@dominio.com.br e maisum@dominio.com.br (v\u00e1rios e-mails separados por v\u00edrgula) e uma c\u00f3pia oculta para espiaodobatima@dominio.com.br.<\/p>\n<p>O comando mail faz parte do sistema padr\u00e3o de e-mails locais que \u00e9 utilizado h\u00e1 v\u00e1rios anos pelos sistemas Unix em geral. Por isso, o campo From, ou seja, o Remetente da mensagem vai ser o usu\u00e1rio que est\u00e1 executando o comando, mais o nome completo da m\u00e1quina. Exemplo, se eu sou o usu\u00e1rio eitch, na m\u00e1quina batima.devin.com.br, quer dizer que o Remetente ser\u00e1: eitch@batima.devin.com.br.<br \/>\nAnexos com o mutt<\/p>\n<p>Como nem tudo s\u00e3o flores, na hora de mandar arquivos anexos junto a mensagem, o comando mail n\u00e3o suporta essa funcionalidade. Neste caso, geralmente o pessoal utiliza o cliente de e-mail de linha de comando mutt.<\/p>\n<p><strong>Mandar e mail via linha de comando no Linux<\/strong><\/p>\n<p>O mutt \u00e9 na verdade um cliente de e-mail para linha de comando completo. Pode ser que sua distribui\u00e7\u00e3o Linux n\u00e3o tenha esse programa instalado. Ent\u00e3o se o comando mutt n\u00e3o for encontrado, instale o programa junto \u00e0 sua distribui\u00e7\u00e3o (com o apt-get, yum, ou outros).<\/p>\n<p>O comando \u00e9 bem parecido com o do mail:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\necho &quot;Assunto Anexo&quot; | mutt -s &quot;Assunto Teste 5&quot; -a arquivo.zip seuemail@dominio.com.br\r\n<\/pre>\n<p>O par\u00e2metro -a \u00e9 quem cuida dos anexos. No caso de enviar v\u00e1rios anexos, \u00e9 necess\u00e1rio tamb\u00e9m que o -a fique antes do destinat\u00e1rio, seguido por \u201c\u2013\u201d, assim:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\necho &quot;Assunto Anexo&quot; | mutt -s &quot;Assunto Teste 6&quot; \\\r\n-a \/home\/eitch\/imagem.jpg \/var\/log\/syslog \/home\/eitch\/arquivo.zip -- hugo.cisneiros@gmail.com\r\n<\/pre>\n<p><strong>Via um servidor SMTP<\/strong><\/p>\n<p>N\u00e3o s\u00e3o todos os sistemas que tem um servidor de e-mail local. Por exemplo, algumas m\u00e1quinas de hostings n\u00e3o possuem um sendmail, postfix ou qmail instalados e prontos para usar. Em outros casos, organiza\u00e7\u00f5es preferem ficar sem o servidor de e-mail de cada m\u00e1quina e concentrar tudo em uma \u00fanica file de e-mail, um \u00fanico servidor de e-mail na rede. Este caso do servidor de e-mail \u00fanico \u00e9 bem comum.<\/p>\n<p>O SMTP \u2013 Simple Mail Transfer Protocol \u00e9 o protocolo para envio de e-mails e um servidor SMTP \u00e9 justamente o que recebe os e-mails e repassa para outros servidores necess\u00e1rios. N\u00e3o vou me aprofundar muito no assunto SMTP, mas vamos aprender um pouco como us\u00e1-lo diretamente.<br \/>\nicon nota Mandar e mail via linha de comando no Linux<br \/>\nNOTA<\/p>\n<p>Para fazer essa parte, voc\u00ea precisa ter um servidor STMP j\u00e1 funcionando. Neste tutorial, usaremos como exemplo o smtp.devin.com.br, que \u00e9 fict\u00edcio. Substitua este servidor pelo seu.<\/p>\n<p>Pra enviar o e-mail, vamos primeiro conversar diretamente com o servidor SMTP atrav\u00e9s do comando nc. O nc \u00e9 o comando netcat e serve para abrir conex\u00f5es TCP puras e transferir dados para ela (como se fosse um telnet n\u00e3o-interativo). Se o comando nc n\u00e3o existir na sua m\u00e1quina, instale-o dos reposit\u00f3rios, j\u00e1 que vem em praticamente todas as distribui\u00e7\u00f5es Linux.<\/p>\n<p>Exemplo de script shell para mandar e-mail via nc:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n#!\/bin\/bash\r\n#\r\ncat &lt;&lt;EOF | \/usr\/bin\/nc smtp.devin.com.br 25\r\nHELO $(hostname)\r\nMAIL FROM: &lt;hugo@devin.com.br&gt;\r\nRCPT TO: &lt;destino@dominio.com.br&gt;\r\nDATA\r\nFrom: Hugo Cisneiros (Eitch) &lt;hugo@devin.com.br&gt;\r\nTo: Nome do Destino &lt;destino@dominio.com.br&gt;\r\nDate: $(date '+%a, %d %b %Y %H:%M:%S %z')\r\nSubject: Assunto da mensagem\r\nContent-Type: text\/plain; charset=UTF-8\r\n                                                                                                                                                                                               \r\nFala Destinat\u00e1rio!\r\n \r\nEstou mandando este e-mail via shell script, usando o nc diretamente pelo SMTP.\r\nLegal n\u00e9?\r\n \r\nAbra\u00e7os!\r\n \r\n.\r\nQUIT\r\nEOF\r\n\r\n<\/pre>\n<p>O que fizemos no exemplo \u00e9 conversar usando o protocolo SMTP.<\/p>\n<p>    Na linha 3 usamos o comando cat para capturar tudo o que digitarmos, at\u00e9 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\u00edda;<br \/>\n    A linha 4 identifica quem \u00e9 voc\u00ea. O comando hostname identifica-o com o nome da sua m\u00e1quina;<br \/>\n    As linhas 5-6 cont\u00e9m de quem \u00e9 o e-mail (MAIL FROM) e qual o destino (RCPT TO);<br \/>\n    A linha 7, com o comando DATA, especifica que tudo que tiver a partir da pr\u00f3xima linha ser\u00e3o 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;<br \/>\n    As linhas 8-12 cont\u00e9m o cabe\u00e7alho do e-mail. Cada cabe\u00e7alho \u00e9 uma linha. No exemplo temos o nome da pessoa que enviou, do destinat\u00e1rio, a data atual (gerada automaticamente pelo comando date), o assunto (Subject) da mensagem e a codifica\u00e7\u00e3o da mensagem (para a acentua\u00e7\u00e3o do portugu\u00eas) n\u00e3o sair estranha. Os cabe\u00e7alhos acabam quando uma linha em branco \u00e9 recebida;<br \/>\n    As linhas 14-20 s\u00e3o o corpo da mensagem. Engloba tudo depois da linha em branco que finaliza o cabe\u00e7alho, at\u00e9 o caracter ponto que termina o e-mail.<br \/>\n    A linha 21, j\u00e1 falada, termina o e-mail. Ao receber o ponto, o servidor SMTP j\u00e1 coloca a mensagem na fila para o envio. A partir da\u00ed voc\u00ea pode enviar outro e-mail (come\u00e7ando com o MAIL FROM), ou sair, como na pr\u00f3xima linha com o comando QUIT.<br \/>\n    Na \u00faltima linha, o EOF avisa ao cat que acabou o texto e o manda para o comando nc, como diz a linha 3.<\/p>\n<p>At\u00e9 que \u00e9 f\u00e1cil n\u00e9? Basta agora ir substituindo os campos de e-mail e testando. Esse m\u00e9todo com o comando nc \u00e9 o ideal para utilizar junto com shell-scripts em servidores. Ele s\u00f3 n\u00e3o serve muito bem para mandar anexos, pois transformar os anexos para mandar via nc n\u00e3o \u00e9 algo trivial de se fazer.<br \/>\n&#8211; See more at: http:\/\/www.devin.com.br\/mail-via-linha-de-comando\/#sthash.PjGWxGu6.dpuf<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Todo mundo fica dizendo que e-mail \u00e9 coisa do passado e que o futuro mesmo \u00e9 utilizar as redes sociais e a Web 2.0 (lol) para se comunicar. Mas a verdade \u00e9 que o e-mail ainda \u00e9 muito \u00fatil e acredito que vai demorar bastante&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[2],"tags":[],"_links":{"self":[{"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=\/wp\/v2\/posts\/783"}],"collection":[{"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=783"}],"version-history":[{"count":10,"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=\/wp\/v2\/posts\/783\/revisions"}],"predecessor-version":[{"id":794,"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=\/wp\/v2\/posts\/783\/revisions\/794"}],"wp:attachment":[{"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=783"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=783"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=783"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}