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.

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 (mailmime 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

Deixe um comentário