Enviando e-mails (via Gmail) com Ruby
A linguagem Ruby permite que você envie e-mails facilmente usando diretamente o SMTP (Simple Mail Transfer Protocol). Algumas poucas linhas de código são suficientes para o envio de mensagens eletrônicas. Entretanto, nem sempre temos um bom servidor de e-mails à disposição. Logo, podemos usar um serviço de e-mail gratuito para poder implementar essa facilidade em nossas aplicações. Uma sugestão é o Gmail, do Google: tem espaço de sobra, fácil administração, um bom filtro de spam, antivirus, etc.
E para completar o pacote, não é difícil implementar o envio/recebimento de e-mails do Gmail em sua aplicação Ruby/Rails. Usando a gem gmail
, podemos criar código para manipular com detalhes nossos e-mails hospedados no Google.
A gmail
oferece uma interface ao “estilo Ruby” com o Gmail, possibilitando fazer buscas, ler e enviar e-mails, arquivar, marcar mensagens como lidas/não lidas, excluir e-mails e até gerenciar os marcadores. A gmail
é uma versão melhorada da gem ruby-gmail
(desenvolvida pelo Daniel Parker). O fork ficou mais amigável, melhor documentado e com algumas funcionalidades extras.
Após conhecer essa gem, é difícil não pensar em automatizar o gerenciamento de suas próprias mensagens. Então vamos ver como ela funciona.
Instalando a gem
A instalação da gem é bem simples.
$ gem install gmail
Além da gem gmail
, também serão instaladas as dependências necessárias (mail
, mime
esmpt_tls
).
Logando com sua conta no Gmail
Para logar nos servidores do Google, basta informar seu login e senha.
1 2 3 |
gmail = Gmail.connect(username, password) # aqui fica seu código... gmail.logout |
Você também pode fazer o acesso através de um bloco. Assim, o código fará logout quando o bloco terminar de executar. Usando o método connect!
você obtem mensagem de retorno caso haja algum erro no login (falha de conexão, login/senha incorreto, etc). O métodologged_in?
avisa se a conexão deu certo.
1 2 3 4 |
Gmail.connect!(username, password) do |gmail| gmail.logged_in? #confere se o login deu certo # aqui você brinca com seus e-mails... end |
Contando os e-mais da sua caixa de entrada
Após conectado, temos várias informações disponíveis sobre os e-mails. Por exemplo, para contar as mensagens que estão na caixa de entrada:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# para contar todas as mensagens gmail.inbox.count # para contar apenas as mensagens não lidas gmail.inbox.count(:unread) # para contar apenas as mensagens lidas gmail.inbox.count(:read) # para contar as mensagens de um período gmail.inbox.count(:after => Date.parse("2011-05-05"), :before => Date.parse("2011-06-05")) # para contar as mensagens de um dia gmail.inbox.count(:on => Date.parse("2011-05-06")) # para contar as mensagens vindas de um destinatário gmail.inbox.count(:from => "outro_email@gmail.com") # para contar as mensagens enviadas a um destinatário gmail.inbox.count(:to => "outro_email@gmail.com") # para contar mensagens não lidas de um destinatário gmail.inbox.count(:unread, :from => "outro_email@gmail.com") # para contar mensagens não lidas anteriores a uma data, vindas de um destinatario gmail.inbox.emails(:unread, :before => Date.parse("2011-06-05"), :from => "outro_email@gmail.com") |
As mensagens também podem ser manipuladas por blocos. Por exemplo, para marcar todas as mensagens não lidas como lidas:
1 2 3 |
gmail.inbox.find(:unread) do |email| email.read! end |
Gerenciando seus e-mails
Como podemos ver, a gem é bem dinâmica e permite que você realize uma série de ações com as mensagens. Outra situação: digamos que você queira arquivar todas as mensagens recebidas de um determinado destinatário num período de tempo.
1 2 3 4 |
gmail.inbox.find(:before => Date.parse("2011-06-05"), :from => "newsletter@news.com") do |email| email.read! # poderia ser unread!, spam! ou star! email.archive! end |
Cuidado, pois apagar e-mails também é simples. No caso, iremos excluir os e-mails vindos de um fulano qualquer.
1 2 3 |
gmail.inbox.find(:from => "fulano@gmail.com").each do |email| email.delete! end |
Outra coisa legal é poder salvar apenas os anexos dos e-mails através de código.
1 2 3 4 5 6 |
pasta = "/meus documentos/emails/arquivos/" gmail.mailbox("Faxes").emails do |email| if !email.message.attachments.empty? email.message.save_attachments_to(pasta) end end |
Também podemos trabalhar com os marcadores das mensagens.
1 2 3 4 5 6 |
# para adicionar o marcador 'trabalho' à mensagem email.label("Trabalho") # faz o mesmo que a linha anterior, mas cria o marcador caso não exista email.label!("Trabalho") # para mover mensagens entre marcadores/pastas email.move_to("Trabalho") |
Escrevendo e enviando e-mails
É muito simples enviar e-mails com essa gem. A gmail
utiliza outra gem (mail
) para o envio, configurando-a para usar o Google como servidor – então as mensagens enviadas via script vão parar na pasta de enviadas do Gmail. Também não é necessário especificar o remetente, pois essa informação é preenchida automagicamente para nós.
Veja um exemplo do envio de um e-mail, mostrando uma parte da mensagem em texto plano e outra com formatação HTML:
1 2 3 4 5 6 7 8 9 10 11 |
gmail.deliver do to "email@dominio.com" subject "Teste de e-mail usando a gem" text_part do body "Parte da mensagem em texto plano (sem formatação)." end html_part do body "<p>Parte da mensagem com <strong>texto formatado</strong> em <em>html</em>.</p>" end add_file "/Minhas Imagens/foto.jpg" end |
Mais uma forma de criar a mensagem: gerar o código primeiro para envio posterior.
1 2 3 4 5 6 |
email = gmail.generate_message do to "email@dominio.com" subject "Teste de e-mail usando a gem" body "Este e-mail foi enviado usando código Ruby e a gem gmail!" end email.deliver! # ou gmail.deliver(email) |
No site da gmail você encontra outras possibilidades dessa excelente gem.
Fonte: http://ruby-br.org/?p=2021