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 e smpt_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étodo logged_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.
Artigos relacionados
10 Responses to Enviando e-mails (via Gmail) com Ruby
Deixe uma resposta Cancelar resposta
Aprenda Ruby
Categorias






como entrar no meu email
nao estou conseguindo navegar
Milton ferreira batista neto ou netinho
neto
lindo
AMEI AMEI PORQUE TENHO 12 ANOS
amigos e foda.
Realmente muito bacana essa API do Gmail em Ruby
Realmente funcionou para mim, só tenho medo de ser tachado como spam
[...] Fonte: http://ruby-br.org/?p=2021 [...]