domingo, 22 de agosto de 2010

Enviando email pela linha de comando usando o msmtp

O msmtp é um cliente de SMTP que em seu modo de operação padrão transmite um e-mail para um servidor SMTP, por exemplo para seu provedor, que faz a entrega. Pode ser usado por um programa cliente de e-mail (MUA) e é compatível com o programa sendmail. Dentre outros atributos o msmtp pode trabalhar com diversos métodos de autenticação e com múltiplas contas de e-mail.

O msmtp é executado pela linha de comando e pode ser configurado por arquivo alcançável em todo o sistema (/etc/msmtprc), por arquivo restrito ao usuário (~/.msmtprc) ou diretamente por parâmetros na linha de comando. Um exemplo de conteúdo para o arquivo de configuração é o apresentado a seguir:

account gmail
host smtp.gmail.com
port 587
timeout off
protocol smtp
auto_from off
from usuario@gmail.com
maildomain gmail.com
auth on
user usuario
password suasenha
tls on
tls_starttls on
tls_certcheck off
logfile ~/.msmtp.log
syslog LOG_MAIL

account default: gmail

Este exemplo serve para o servidor SMTP do Gmail. Múltiplas contas podem ser configuradas neste arquivo, identificadas pela linha "account nome_da_conta". É recomemdável proteger o arquivo de configuração do msmtp com permissões de leitura e escrita somente para o próprio usuário (0600, -rw-------), senão a senha ficará exposta aos outros usuários.

O msmtp possui muitas opções para sua linha de comando mas basicamente o comando pode ser "msmtp " se o arquivo de configuração existir. Com este comando simples o programa inicia um prompt para a entrada do conteúdo do e-mail, para o cabeçalho e corpo. A combinação de teclas "Ctrl+D" encerra esta edição. Entretanto, pode ser mais prático utilizar um arquivo texto contendo toda esta estrutura de mensagem e direcioná-lo para a entrada padrão do msmtp. Um exemplo de como pode ser este arquivo texto é apresentado abaixo:

To: fulano@provedor.com.br, sicrano@provedor.com.br
Cc: beltrano@provedor.com.br
Bcc: johndoe@provedor.com.br
From: usuario@gmail.com
Subject: Assunto do e-mail

Texto do corpo da mensagem.

A linha de comando do msmtp ficaria então desta forma:

$ msmtp --read-recipients < email.txt

Para não utilizar um arquivo de configuração é necessário passar todos os dados do servidor SMTP pela linha de comando do msmtp. Aproveitando o exemplo da conta do Gmail mostrado anteriormente, a seguir está o exemplo da linha de comando equivalente:

$ msmtp --host=smtp.gmail.com --port=587 --timeout=off --protocol=smtp --auto-from=off --from=usuario@gmail.com --maildomain=gmail.com --auth=on --user=usuario --tls=on --tls-starttls=on --tls-certcheck=off --syslog=LOG_MAIL --read-recipients < email.txt

A senha do servidor não é passada pela linha de comando, ela é solicitada pelo msmtp em um prompt semelhante ao abaixo:

password for usuario at smtp.gmail.com:

Outros parâmetros poderão ser úteis, o parâmetro --file=arquivo é usado para indicar outro arquivo de configuração ao invés do padrão e --account=nomedaconta para indicar outra conta de e-mail ao invés da conta padrão.

O conteúdo de uma mensagem de e-mail é sempre em texto ASCII, porém é possível anexar um conteúdo binário no corpo da mensagem. Um arquivo binário pode ser codificado para o formato ASCII por ferramentas como o uuencode ou o uuenview, este último mais poderoso. A linha de comando para um e-mail com anexo binário pode ser como no exemplo a seguir:

$ (cat email.txt; uuenview foto.jpg) | msmtp --read-recipients

Neste exemplo tanto o conteúdo do arquivo email.txt como o resultado da codificação do arquivo foto.jpg são canalizados para a entrada padrão do comando msmtp. Contudo, aqui tem uma ressalva, o programa msmtp não trata garantidamente os tipos MIME e, dependendo do programa cliente ou provedor que irá receber a mensagem, o arquivo anexo poderá não ser reconhecido no recebimento. Por exemplo, em testes feitos por mim, contas do Gmail e do Yahoo receberam adequadamente mas a conta do Terra não. A solução garantida é utilizar outra ferramenta para formatar o e-mail e trabalhar em parceria com o msmtp, no envio. Uma boa ferramenta para linha de comando é o Mutt, que será descrito em um próximo artigo.

Mais informações em http://msmtp.sourceforge.net/ ou nas páginas manuais do msmtp.

2 comentários:

  1. cara, muito bom o tutorial. estou estudando o msmtp ultimamente e seu texto foi o mais explicado que eu achei, muito bom mesmo.
    é isso ai !
    abraço e sucesso !!!

    ResponderExcluir
  2. Esse tal de msmtp é para Linux ou Windows ou ambos? Estou meio perdido na net pesquisando um método de envio de e-mail. Estava pesquisando cliente de e-mail por linha de comando e cheguei aqui. Preciso de algo assim no Windows, algo que seja bom para anexos de até uns 3 mb. Será que terei que apelar ao outlook express ou ao windows live mail? O problema é que os clientes usam ou windows xp ou 7, e aí o cliente de e-mail muda... Por isso pensei em procurar um que funcione via linha de comando para instalar em qualquer versão do windows. Complicado né...

    ResponderExcluir