mailee 0.3.0 → 0.4.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -7,58 +7,152 @@
7
7
 
8
8
  == A solução
9
9
 
10
- Este plugin tem como objetivo manter os contatos da sua aplicação sincronizados com os contatos do Mailee (www.mailee.me) sem muito esforço. De fato, basta executar o método "sync_with_mailee" no seu modelo (clientes, contatos, pessoas...) que este irá automaticamente realizar as tarefas de inserir, atualizar, excluir e descadastrar via REST. No Mailee, seu cliente poderá então montar as mensagens e enviar para os contatos.
10
+ Esta gem tem como objetivo manter os contatos da sua aplicação sincronizados com os contatos do Mailee (www.mailee.me) sem muito esforço. De fato, basta executar o método "sync_with_mailee" no seu modelo (clientes, contatos, pessoas...) que este irá automaticamente realizar as tarefas de inserir, atualizar, excluir e descadastrar via REST. No Mailee, seu cliente poderá então montar as mensagens e enviar para os contatos.
11
+
12
+ == O que posso fazer com a gem?
13
+
14
+ * Simplesmente utilizar as classes do Mailee para:
15
+ * Criar, atualizar, buscar e excluir contatos.
16
+ * Importar contatos com nome e email.
17
+ * Criar, atualizar, buscar e excluir listas.
18
+ * Criar, atualizar, buscar e excluir templates.
19
+ * Criar rascunhos, enviar testes e enviar mensagens agora ou para uma data futura. O envio de mensagens permite enviar para uma lista, para um conjunto de emails, definindo o html na mão ou usando um template do Mailee.me e definindo áreas editáveis e de repetições.
20
+ * Buscar datos dos relatórios.
21
+ * Integrar com ActiveRecord (com ou sem Rails) e fazer um modelo sincronizar automaticamente com o Mailee.me.
22
+ * Integrar com ActionMailer (com ou sem Rails) e fazer os mailers enviarem as mensagens pelo Mailee.me.
11
23
 
12
24
  == Instalação
13
25
 
14
- * Execute o seguinte comando em sua aplicação Rails:
15
- > script/plugin install git@github.com:softa/mailee-api.git
16
- * Adicione a seguinte linha de configuração em sua aplicação:
17
- Mailee::Config.site = 'http://api.chave.subdominio.wizee.net'
18
- O site você descobre entrando no Mailee e indo em Configurações > Integração > REST
19
-
20
- Pronto!
26
+ * Adicione a seguinte linha ao seu Gemfile:
27
+ > gem 'mailee'
28
+ * E execute o bundle:
29
+ > bundle install
30
+ * Uma vez instalado, para configurar, execute:
31
+ > rake mailee_rails:setup
32
+
33
+ Este comando irá solicitar sua URL da API e criar um initializer com toda a configuração necessária.
34
+ A URL da API você descobre entrando no Mailee e indo em Configurações > Integração > REST
21
35
 
36
+ Pronto!
37
+
38
+ == Compatibilidade
39
+
40
+ Rails 3. 'Nuff said. Se você precisa de suporte aoRails 2, baixe a versão 0.1.0, mas ela possui muito menos funcionalidades do que a versão atual.
41
+
22
42
  == Uso
23
43
 
24
44
  * Na mão (console)
45
+
25
46
  Você pode usar a api do maile "na mão". Basta abrir o console e usar:
26
47
  > ruby script/console
48
+ >> include Mailee
27
49
  >> Contact.find(:all)
28
50
  >> Contact.find(:first)
51
+ >> Contact.search('russell')
52
+ >> Contact.find_by_internal_id(789)
53
+ >> Contact.find_by_email('russell@cambridge.edu.uk')
29
54
  >> Contact.create(:name => 'Bertrand Russell', :email => 'russell@cambridge.edu.uk')
30
- Mais exemplos você encontra(rá) na (futura) documentação da API.
55
+ >> Contact.create(:email => 'ludwig@wittgenstein.edu.uk', :dynamic_attributes => {:influence => 'Frege'})
56
+ >> List.find(:all)
57
+ >> List.find(:first)
58
+ >> List.create(:name => 'My List')
59
+ >> Template.find(:all)
60
+ >> Template.find(:first)
61
+ >> Template.create(:title => 'My Template', :html => File.read('mytemplate.html'))
62
+ # Message with HTML and list
63
+ >> message = Message.create :title => "Title", :subject => "Subject", :from_name => "Rorty", :from_email => "rorty@princeton.us", :html => File.read('myhtml.html'), :list_id => 987
64
+ # Message with emails and template (with edits & repeats)
65
+ >> message = Message.create :title => "Title", :subject => "Subject", :from_name => "Rorty", :from_email => "rorty@princeton.us", :template_id => 765, :edits => {:greeting => 'Hi Davidson!'}, :repeats => {:news => ['A good news', 'A bad news'], :emails => 'davidson@some.com davidson@another.com'}
66
+ >> message.test([44,55,66])
67
+ >> message.ready # send it now
68
+ >> message.ready(10.days.from_now)
69
+
31
70
  * Com modelos (ActiveRecord)
32
- Este plugin é feito para manter um modelo AciveRecord sincronizado com os contatos do Mailee. Para fazer isto, basta colocar o método "sync_with_mailee" em seu modelo. Se o seu modelo se chama "Contact", por exemplo, o código seria este:
71
+
72
+ Esta gem é feita para manter um modelo AciveRecord sincronizado com os contatos do Mailee. Para fazer isto, basta colocar o método "sync_with_mailee" em seu modelo. Se o seu modelo se chama "Contact", por exemplo, o código seria este:
33
73
  =code
34
74
  class Contact < ActiveRecord::Base
35
75
  sync_with_mailee
36
76
  end
37
- A priori, o plugin espera que você tenha pelo menos um campo de email e pressupõe que o nome deste campo é "email". Se o campo da sua tabela não tem este nome, você pode fazer o seguinte:
77
+ A priori, a gem espera que você tenha pelo menos os campos de email e optins, e pressupõe que estes campos se chamem "email" e "news". Se os campos da sua tabela não tem estes nomes, você pode fazer o seguinte:
38
78
  =code
39
79
  class Contact < ActiveRecord::Base
40
- sync_with_mailee :email => :my_email_column
80
+ sync_with_mailee :email => :my_email_column, :news => :my_optin_column
41
81
  end
42
- Onde "my_email_column" é a coluna que guarda o e-mail na sua tabela.
43
- O plugin também pode manter o nome do seu contato sincronizado, bastando para isto ter um campo "name" que será mapeado por padrão, mas que também pode ser sobrescrito:
82
+ Onde "my_email_column" é a coluna que guarda o e-mail na sua tabela e "my_optin_column" o booleano que guarda o optin.
83
+ A gem também pode manter o nome do seu contato sincronizado, bastando para isto ter um campo "name" que será mapeado por padrão, mas que também pode ser sobrescrito:
44
84
  =code
45
85
  class Contact < ActiveRecord::Base
46
- sync_with_mailee :email => :my_email_column, :name => :my_name_column
47
- end
48
- Por fim, o plugin permite que o cadastro no Mailee seja condicionado a um campo booleano (o padrão é "news"), que corresponde ao "opt-in" (a escolha de receber ou não mensagens) do seu contato. Ou seja, se o valor do campo for false, o plugin não cadastrará o contato no Mailee, e se o contato já estiver cadastrado e o valor deste campo mudar para falso, o contato será descadastrado e _não_ poderá ser mais cadastrado no Mailee (normas de privacidade). Para mudar o campo, basta:
49
- =code
50
- class Contact < ActiveRecord::Base
51
- sync_with_mailee :email => :my_email_column, :name => :my_name_column, :news => :do_you_really_accept_to_receive_our_newsletter
86
+ sync_with_mailee :name => :my_name_column
52
87
  end
88
+ Se o valor do campo "news" (ou o que você utilizar para optin) for false, a gem não cadastrará o contato no Mailee. Se o contato já estiver cadastrado e o valor deste campo mudar para falso, o contato será descadastrado e _não_ poderá ser mais cadastrado no Mailee (normas de privacidade). Se ele estiver falso e mudar para verdadeiro, ele irá cadastrá-lo.
89
+
90
+ * Com mailers (ActionMailer)
91
+
92
+ Esta gem permite que você utilize o Mailee.me como meio de enviar suas mensagens sem precisar configurar um servidor smtp ou algo pareceido.
93
+
94
+ Você pode optar por enviar todas as mensagens por ele, ou só as mensagens de determinados mailers. Para a configuração global, adicione a seguinte linha ao seu arquivo de ambiente (config/environments/production.rb ou development.rb):
95
+
96
+ = code
97
+ config.action_mailer.delivery_method = Mailee::Mailer
98
+
99
+ Agora, se você quer enviar apenas mensagens de um certo mailer pelo Mailee, basta adicionar o método "send_with_mailee" em cada um:
100
+
101
+ = code
102
+ class Notifications < ActionMailer::Base
103
+ send_with_mailee
104
+ ...
105
+ end
106
+
107
+ É importante definir o from com o formato completo:
108
+
109
+ = code
110
+ class Notifications < ActionMailer::Base
111
+ default :from => "Plato <plato@liceum.gr>
112
+ ...
113
+ end
114
+
115
+ Ao enviar uma mensagem, você pode também optar por enviá-la agora ou no futuro:
116
+
117
+ = code
118
+ class Notifications < ActionMailer::Base
119
+ def signup(client, date=Time.now)
120
+ mail :date => date, :to => client.email
121
+ end
122
+ def feedback(client, date=Time.now)
123
+ mail :date => date, :to => client.email
124
+ end
125
+ end
126
+ ...
127
+ Notifications.signup(client).deliver
128
+ Notifications.feedback(client, 3.days.from_now).deliver
129
+
130
+ Por fim, ao enviar uma mensagem, a gem adiciona um método que representa a mensagem no Mailee.me, veja:
131
+
132
+ = code
133
+ mail = Notifications.signup(client).deliver
134
+ mail.mailee_message.id # Retorna o id
135
+ mail.mailee_message.html # Retorna o html
136
+ # e assim por diante...
137
+
138
+ Isto é útil, pois você já pode monitorar os resultados com este id:
139
+
140
+ = code
141
+ mail = Notifications.signup(client).deliver
142
+ Mailee::Report.find(mail.mailee_message.id)
143
+
53
144
  * Tarefas (rake)
145
+
54
146
  Caso você já tenha itens cadastrados, é necessário adicionar estes contatos ao Mailee antes de mais nada. Para isso execute a tarefa rake:
55
147
  > rake mailee:send CLASS=Contact
56
148
  Onde "Contact" é o nome do seu modelo. Se você quer apenas enviar os contatos a partir de uma determinada data, você pode fazê-lo desta forma:
57
149
  > rake mailee:send CLASS=Contact AFTER=5.days.ago
58
150
  Neste caso, ele vai apenas sincronizar os contatos que foram atualizados (baseado no campo "updated_at") nos últimos 5 dias.
59
- * Mas... como isso funciona, caso eu precise saber?
60
- O plugin utiliza a API REST do Mailee para enviar dados, por isto cuide bem da sua URL - se alguém descobrir isso pode ser ruim. Para saber qual o contato na sua aplicação o plugin utiliza um campo disponível no Mailee chamado "internal_id" o qual recebe o "id" da sua tabela na criação. Este id é usado nas atualizações, descadastros e exclusões, então tome (ou avise seu cliente para tomar!) cuidado ao editar este campo na interface do Mailee.
151
+
152
+ == Cuidado!
153
+
154
+ A gem utiliza a API REST do Mailee para enviar dados, por isto cuide bem da sua URL - se alguém descobrir isso pode ser ruim. Para saber qual o contato na sua aplicação a gem utiliza um campo disponível no Mailee chamado "internal_id" o qual recebe o "id" da sua tabela na criação. Este id é usado nas atualizações, descadastros e exclusões, então tome (ou avise seu cliente para tomar!) cuidado ao editar este campo na interface do Mailee.
61
155
 
62
156
  == Dúvidas?
63
157
 
64
- Qualquer dúvida, não hesite em falar conosco pelo e-mail suporte@mailee.me.
158
+ Qualquer dúvida, não hesite em falar conosco pelo e-mail suporte@mailee.me, pelo twitter @maileeme ou pelo IRC #maileeme.
@@ -0,0 +1,64 @@
1
+ = Mailee - Email marketing para quem entende de tecnologia.
2
+ ==============
3
+
4
+ == O problema
5
+
6
+ Você está desenvolvendo um sistema (e-commerce, cms, erp...) e o seu cliente solicita a possibilidade de enviar e-mails promocionais, ou notícias, para diversos contatos. Por experiência própria, você sabe que enviar e-mails não é coisa para _scriptkiddies_, e que, de fato, não vale a pena o esforço de desenvolver todo um sistema que faça o envio, garanta a entrega, analise os retornos e também apresente resultados de tudo isso. O problema é que os sistemas que você conhece não permitem uma integração fácil e rápida com seus sistemas em Rails...
7
+
8
+ == A solução
9
+
10
+ Este plugin tem como objetivo manter os contatos da sua aplicação sincronizados com os contatos do Mailee (www.mailee.me) sem muito esforço. De fato, basta executar o método "sync_with_mailee" no seu modelo (clientes, contatos, pessoas...) que este irá automaticamente realizar as tarefas de inserir, atualizar, excluir e descadastrar via REST. No Mailee, seu cliente poderá então montar as mensagens e enviar para os contatos.
11
+
12
+ == Instalação
13
+
14
+ * Execute o seguinte comando em sua aplicação Rails:
15
+ > script/plugin install git@github.com:softa/mailee-api.git
16
+ * Adicione a seguinte linha de configuração em sua aplicação:
17
+ Mailee::Config.site = 'http://api.chave.subdominio.wizee.net'
18
+ O site você descobre entrando no Mailee e indo em Configurações > Integração > REST
19
+
20
+ Pronto!
21
+
22
+ == Uso
23
+
24
+ * Na mão (console)
25
+ Você pode usar a api do maile "na mão". Basta abrir o console e usar:
26
+ > ruby script/console
27
+ >> Contact.find(:all)
28
+ >> Contact.find(:first)
29
+ >> Contact.create(:name => 'Bertrand Russell', :email => 'russell@cambridge.edu.uk')
30
+ Mais exemplos você encontra(rá) na (futura) documentação da API.
31
+ * Com modelos (ActiveRecord)
32
+ Este plugin é feito para manter um modelo AciveRecord sincronizado com os contatos do Mailee. Para fazer isto, basta colocar o método "sync_with_mailee" em seu modelo. Se o seu modelo se chama "Contact", por exemplo, o código seria este:
33
+ =code
34
+ class Contact < ActiveRecord::Base
35
+ sync_with_mailee
36
+ end
37
+ A priori, o plugin espera que você tenha pelo menos um campo de email e pressupõe que o nome deste campo é "email". Se o campo da sua tabela não tem este nome, você pode fazer o seguinte:
38
+ =code
39
+ class Contact < ActiveRecord::Base
40
+ sync_with_mailee :email => :my_email_column
41
+ end
42
+ Onde "my_email_column" é a coluna que guarda o e-mail na sua tabela.
43
+ O plugin também pode manter o nome do seu contato sincronizado, bastando para isto ter um campo "name" que será mapeado por padrão, mas que também pode ser sobrescrito:
44
+ =code
45
+ class Contact < ActiveRecord::Base
46
+ sync_with_mailee :email => :my_email_column, :name => :my_name_column
47
+ end
48
+ Por fim, o plugin permite que o cadastro no Mailee seja condicionado a um campo booleano (o padrão é "news"), que corresponde ao "opt-in" (a escolha de receber ou não mensagens) do seu contato. Ou seja, se o valor do campo for false, o plugin não cadastrará o contato no Mailee, e se o contato já estiver cadastrado e o valor deste campo mudar para falso, o contato será descadastrado e _não_ poderá ser mais cadastrado no Mailee (normas de privacidade). Para mudar o campo, basta:
49
+ =code
50
+ class Contact < ActiveRecord::Base
51
+ sync_with_mailee :email => :my_email_column, :name => :my_name_column, :news => :do_you_really_accept_to_receive_our_newsletter
52
+ end
53
+ * Tarefas (rake)
54
+ Caso você já tenha itens cadastrados, é necessário adicionar estes contatos ao Mailee antes de mais nada. Para isso execute a tarefa rake:
55
+ > rake mailee:send CLASS=Contact
56
+ Onde "Contact" é o nome do seu modelo. Se você quer apenas enviar os contatos a partir de uma determinada data, você pode fazê-lo desta forma:
57
+ > rake mailee:send CLASS=Contact AFTER=5.days.ago
58
+ Neste caso, ele vai apenas sincronizar os contatos que foram atualizados (baseado no campo "updated_at") nos últimos 5 dias.
59
+ * Mas... como isso funciona, caso eu precise saber?
60
+ O plugin utiliza a API REST do Mailee para enviar dados, por isto cuide bem da sua URL - se alguém descobrir isso pode ser ruim. Para saber qual o contato na sua aplicação o plugin utiliza um campo disponível no Mailee chamado "internal_id" o qual recebe o "id" da sua tabela na criação. Este id é usado nas atualizações, descadastros e exclusões, então tome (ou avise seu cliente para tomar!) cuidado ao editar este campo na interface do Mailee.
61
+
62
+ == Dúvidas?
63
+
64
+ Qualquer dúvida, não hesite em falar conosco pelo e-mail suporte@mailee.me.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.0
1
+ 0.4.2
@@ -1,7 +1,7 @@
1
1
  source 'http://rubygems.org'
2
2
 
3
3
  gem 'rails', '3.0.0'
4
- gem 'mailee'
4
+ gem 'mailee', '0.4.0'
5
5
  # Bundle edge Rails instead:
6
6
  # gem 'rails', :git => 'git://github.com/rails/rails.git'
7
7
 
@@ -38,6 +38,7 @@ GEM
38
38
  activesupport (>= 2.3.6)
39
39
  mime-types
40
40
  treetop (>= 1.4.5)
41
+ mailee (0.4.0)
41
42
  mime-types (1.16)
42
43
  polyglot (0.3.1)
43
44
  rack (1.2.1)
@@ -69,5 +70,6 @@ PLATFORMS
69
70
  ruby
70
71
 
71
72
  DEPENDENCIES
73
+ mailee (= 0.4.0)
72
74
  rails (= 3.0.0)
73
75
  sqlite3-ruby
@@ -1 +1 @@
1
- Mailee::Config.site = 'your.api.path'
1
+ Mailee::Config.site = 'http://api.bdb28c0a0a4a3.softa.mailee.me'
@@ -1,280 +1,8 @@
1
1
  require 'active_resource'
2
- module Mailee
3
2
 
4
- # The Config class is used to set your api url.
5
- # You can do it in your applications.rb or in a initializar.
6
- # It's simple:
7
- #
8
- # Mailee::Config.site = "http://your.mailee.api.url"
9
- class Config < ActiveResource::Base
10
- end
3
+ module Mailee; end
11
4
 
12
- # The Contact class gives you default access to your contacts (all,
13
- # first, create, update, destroy) plus some facilities, like searching
14
- # contacts by email, keyword (a smart search), signature (name & email)
15
- # and internal id.
16
- #
17
- # Also, you can subscribe contacts to lists and unsubscribe. In Mailee
18
- # unsubscribing a contact is radical: it will be unsubscribed from ALL
19
- # lists FOREVER. House rules.
20
- #
21
- # If you use mailee gem to sync a model, it will always set the internal_id
22
- # to your "local" model id and then search based on it to update de remote
23
- # record.
24
- class Contact < Config
25
- def self.find_by_internal_id iid
26
- find(:first, :params => {:internal_id => iid})
27
- end
28
- def self.find_by_email email
29
- find(:first, :params => {:email => email})
30
- end
31
- def self.search keyword, page=1
32
- find(:all, :params => {:page => page, :by_keyword => keyword })
33
- end
34
- def unsubscribe(data={})
35
- #E.g. data --> {:reason => 'Trip to nowhere', :spam => false}
36
- put(:unsubscribe, :unsubscribe => {:reason => 'Motivo não especificado'}.merge(data))
37
- end
38
- def subscribe(list)
39
- put(:subscribe, :list => {:name => list})
40
- end
41
- end
42
-
43
- # The List class gives you default access to your lists (all, first, create, update, destroy)
44
- class List < Config
45
- end
46
-
47
- # The Template class gives you default access to your templates (all, first, create, update, destroy)
48
- class Template < Config
49
- end
50
-
51
- # The Quick class allows you to import contacts to mailee just like
52
- # in the interface
53
- #
54
- # USAGE:
55
- #
56
- # # Emails only
57
- # Mailee::Quick.import("witt@cambridge.uk dick@princeton.edu")
58
- #
59
- # # Names and emails (needs line breaks)
60
- # Mailee::Quick.import("witt@cambridge.uk, Wittgenstein\ndick@princeton.edu, Rorty")
61
- #
62
- # # Signatures (gmail style)
63
- # Mailee::Quick.import('"Wittgenstein" <witt@cambridge.uk>,
64
- # "Rorty" <dick@princeton.edu.us>')
65
- class Quick < Config
66
- self.collection_name = "quick"
67
- def self.import contacts
68
- create :contacts => contacts
69
- end
70
- end
71
-
72
- # The Message class is where the fun happens.
73
- #
74
- # USAGE:
75
- #
76
- # # Creating a message (still a draft):
77
- # message = Mailee::Message.create :title => "TITLE", :subject => "SUBJ", :from_name => "NAME", :from_email => "your@email.com", :html => "<h1>Hello</h1>", :list_id => 666
78
- # # Sending tests. 33, 44 and 55 are contact's ids.
79
- # message.test([33,44,55]).should_not be nil
80
- # # Sending the message now ...
81
- # message.ready
82
- # # ... or sending the message 10 days from now
83
- # message.ready(10.days.from_now)
84
- class Message < Config
85
- def test contacts
86
- put(:test, :contacts => contacts)
87
- end
88
- def ready date=nil, hour=0
89
- if date && date.is_a?(Date) && date > Time.now
90
- put(:ready, :when => 'after', :after => {:date => date.strftime("%d/%m/%Y"), :hour => date.strftime('%H')})
91
- else
92
- put(:ready, :when => 'now')
93
- end
94
- end
95
- end
96
-
97
- # The Report class is still beta. It can return the results of a
98
- # message - total deliveries, accesses and returns. There are also
99
- # methods for getting accesses, unsubscribes and returns in "real time".
100
- class Report < Config
101
- end
102
-
103
- # The Mailer class is responsible for making the mailee gem ActionMailer
104
- # compatible.
105
- #
106
- # USAGE:
107
- #
108
- # If you want to use Mailee to send all your systems emails, simply
109
- # configure the environment (dev or prod) like this:
110
- #
111
- # config.action_mailer.delivery_method = Mailee::Mailer
112
- #
113
- # But if you wanna send just a certain mailer with Mailee, add
114
- # "send_with_mailee" on a per mailer basis
115
- #
116
- # class Notifications < ActionMailer::Base
117
- # send_with_mailee
118
- # end
119
- #
120
- # One important thing, is to add the sender's name to the default "from" in
121
- # your mailer, this way:
122
- #
123
- # default :from => "Your name <your@email.com.br>"
124
- #
125
- # And don't forget to config your domain SPF!
126
- class Mailer
127
-
128
- def initialize config
129
- end
130
- def deliver! mail
131
- from_name = mail.header['from'].to_s.scan(/(.+?) <.+?>$/).to_s
132
- message = Mailee::Message.create :title => mail.subject, :subject => mail.subject, :from_name => from_name, :from_email => mail.from.first, :emails => mail.to.join(' '), :html => mail.body.to_s
133
- message.ready(mail.date)
134
- self
135
- end
136
- end
137
-
138
- module Send
139
-
140
- def self.included(base) # :nodoc:
141
- base.extend ClassMethods
142
- end
143
-
144
- module ClassMethods
145
- def send_with_mailee
146
- puts "1"
147
- self.delivery_method = Mailee::Mailer
148
- end
149
- end
150
-
151
- end
152
-
153
- module Sync
154
-
155
- def self.included(base) # :nodoc:
156
- base.extend ClassMethods
157
- end
158
-
159
- module ClassMethods
160
- def sync_with_mailee(options = {})
161
- unless syncd? # don't let AR call this twice
162
- cattr_accessor :sync_options
163
- after_create :create_in_mailee
164
- after_update :update_in_mailee
165
- after_destroy :destroy_in_mailee
166
- self.sync_options = {:email => :email, :name => :name, :news => :news}.merge(options) #options[:with] || :deleted_at
167
- unless self.column_names.include?(self.sync_options[:email].to_s)
168
- raise "Campo #{sync_options[:email]} não existe em #{new.class}."
169
- end
170
- unless self.column_names.include?(self.sync_options[:name].to_s)
171
- self.sync_options[:name] = nil
172
- end
173
- unless self.column_names.include?(self.sync_options[:news].to_s)
174
- self.sync_options[:news] = nil
175
- end
176
- end
177
- include InstanceMethods
178
- end
179
-
180
- def syncd?
181
- self.included_modules.include?(InstanceMethods)
182
- end
183
-
184
- end
185
-
186
- module InstanceMethods #:nodoc:
187
-
188
- def self.included(base) # :nodoc:
189
- base.extend ClassMethods
190
- end
191
-
192
- def create_in_mailee
193
- return if( sync_options[:news] and ! send(sync_options[:news])) # Não cria se houver o campo booleano e ele for falso
194
- self.class.benchmark "Criando contato no Mailee" do
195
- contact = Mailee::Contact.new
196
- contact.internal_id = id
197
- contact.email = send(sync_options[:email])
198
- contact.name = send(sync_options[:name]) if sync_options[:name]
199
- contact.save
200
- end
201
- rescue
202
- logger.warn "MAILEE-API: Falhou ao criar o contato #{id} no Mailee"
203
- end
204
-
205
- def update_in_mailee
206
- self.class.benchmark "Atualizando contato no Mailee" do
207
- contact = Mailee::Contact.find_by_internal_id id
208
- if contact
209
- #Se o contato existe e o booleano foi desmarcado, realiza um UNSUBSCRIBE
210
- if sync_options[:news] and (! send(sync_options[:news]))
211
- unsubscribe_in_mailee(contact)
212
- else
213
- contact.email = send(sync_options[:email])
214
- contact.name = send(sync_options[:name]) if sync_options[:name]
215
- contact.save
216
- end
217
- else
218
- create_in_mailee # Se não achou o contato tem q inserir.
219
- end
220
- end
221
- rescue
222
- logger.warn "MAILEE-API: Falhou ao atualizar o contato #{id} no Mailee"
223
- end
224
-
225
- def destroy_in_mailee contact=nil
226
- self.class.benchmark "Excluindo contato no Mailee" do
227
- contact ||= Mailee::Contact.find_by_internal_id id
228
- contact.destroy
229
- end
230
- rescue
231
- logger.warn "MAILEE-API: Falhou ao excluir o contato #{id} no Mailee"
232
- end
233
-
234
- def unsubscribe_in_mailee contact=nil
235
- self.class.benchmark "Descadastrando contato no Mailee" do
236
- contact ||= Mailee::Contact.find_by_internal_id id
237
- contact.unsubscribe
238
- end
239
- rescue
240
- logger.warn "MAILEE-API: Falhou ao descadastrar o contato #{id} no Mailee"
241
- end
242
-
243
- module ClassMethods
244
- # Sincroniza todos os itens do modelo com Mailee.
245
- # Permite que se passe um datetime para enviar apenas os contatos atualizados depois desta data
246
- # Permite o uso de um bloco, que receberá o item do modelo e o item do Mailee associado a este.
247
- # Ex: Contact.send_all_to_mailee{|i,im| im.address = i.endereco; im.save }
248
- # Importante: este método apenas envia os contatos, mas não recebe.
249
- # Para receber contatos, o ideal é fazer uma exportação no Mailee e realizar uma importação deste arquivo CSV no seu sistema.
250
-
251
- def send_all_to_mailee(after=nil)
252
- items = after ? all(:conditions => ["updated_at >= ?", after]) : all
253
- for item in items
254
- begin
255
- contact = Mailee::Contact.find_by_internal_id item.id
256
- if contact and sync_options[:news] and ! item.send(sync_options[:news])
257
- contact.unsubscribe
258
- yield item, contact if block_given?
259
- next
260
- end
261
- unless contact
262
- next if sync_options[:news] and ! item.send(sync_options[:news])
263
- contact = Mailee::Contact.new
264
- contact.internal_id = item.id
265
- end
266
- contact.email = item.send(sync_options[:email])
267
- contact.name = item.send(sync_options[:name]) if sync_options[:name]
268
- contact.save
269
- yield item, contact if block_given?
270
- rescue
271
- logger.warn "MAILEE-API: Falhou ao enviar o contato #{id} ao Mailee"
272
- end
273
- end
274
- end
275
- end
276
- end
277
- end
278
- end
279
- ActiveRecord::Base.send(:include, Mailee::Sync) if defined?(ActiveRecord)
280
- ActionMailer::Base.send(:include, Mailee::Send) if defined?(ActionMailer)
5
+ require 'mailee/active_resource'
6
+ require 'mailee/railties' if defined?(Rails)
7
+ require 'mailee/active_record' if defined?(ActiveRecord)
8
+ require 'mailee/action_mailer' if defined?(ActionMailer)
@@ -0,0 +1,52 @@
1
+ module Mailee
2
+ # The Mailer class is responsible for making the mailee gem ActionMailer
3
+ # compatible.
4
+ #
5
+ # USAGE:
6
+ #
7
+ # If you want to use Mailee to send all your systems emails, simply
8
+ # configure the environment (dev or prod) like this:
9
+ #
10
+ # config.action_mailer.delivery_method = Mailee::Mailer
11
+ #
12
+ # But if you wanna send just a certain mailer with Mailee, add
13
+ # "send_with_mailee" on a per mailer basis
14
+ #
15
+ # class Notifications < ActionMailer::Base
16
+ # send_with_mailee
17
+ # end
18
+ #
19
+ # One important thing, is to add the sender's name to the default "from" in
20
+ # your mailer, this way:
21
+ #
22
+ # default :from => "Your name <your@email.com.br>"
23
+ #
24
+ # And don't forget to config your domain SPF!
25
+ class Mailer
26
+
27
+ def initialize config
28
+ end
29
+ def deliver! mail
30
+ from_name = mail.header['from'].to_s.scan(/(.+?) <.+?>$/).to_s
31
+ message = Mailee::Message.create :title => mail.subject, :subject => mail.subject, :from_name => from_name, :from_email => mail.from.first, :emails => mail.to.join(' '), :html => mail.body.to_s
32
+ result = message.ready(mail.date)
33
+ mail.instance_eval{ self.class.send('attr_accessor', :mailee_message); self.mailee_message = result }
34
+ self
35
+ end
36
+ end
37
+
38
+ module Send
39
+
40
+ def self.included(base) # :nodoc:
41
+ base.extend ClassMethods
42
+ end
43
+
44
+ module ClassMethods
45
+ def send_with_mailee
46
+ self.delivery_method = Mailee::Mailer
47
+ end
48
+ end
49
+
50
+ end
51
+ end
52
+ ActionMailer::Base.send(:include, Mailee::Send)
@@ -0,0 +1,153 @@
1
+ # The Sync module is responsible for keeping a model syncd with Mailee.
2
+ # It's behaviour is still too rails-twooish. But soon I'll make it more
3
+ # treeish using Railties and stuff. But it works.
4
+ #
5
+ # All you need in your model are two fields, one for the email and one
6
+ # for the optin, wich is by default called "news". The name field is
7
+ # optional but encouraged.
8
+ #
9
+ # USAGE
10
+ #
11
+ # # Simple example
12
+ # class Client < ActiveRecord::Base
13
+ # sync_with_mailee
14
+ # end
15
+ #
16
+ # # Super hyper brainfuck complex example
17
+ # class Client < ActiveRecord::Base
18
+ # sync_with_mailee :email => :email_field, :name => :name_field, :news => :news_field
19
+ # end
20
+
21
+ module Mailee
22
+ module Sync
23
+
24
+ def self.included(base) # :nodoc:
25
+ base.extend ClassMethods
26
+ end
27
+
28
+ module ClassMethods
29
+ def sync_with_mailee(options = {})
30
+ unless syncd? # don't let AR call this twice
31
+ cattr_accessor :sync_options
32
+ after_create :create_in_mailee
33
+ after_update :update_in_mailee
34
+ after_destroy :destroy_in_mailee
35
+ self.sync_options = {:email => :email, :name => :name, :news => :news}.merge(options)
36
+ unless self.column_names.include?(self.sync_options[:email].to_s)
37
+ raise "Campo #{sync_options[:email]} não existe em #{new.class}."
38
+ end
39
+ unless self.column_names.include?(self.sync_options[:name].to_s)
40
+ self.sync_options[:name] = nil
41
+ end
42
+ unless self.column_names.include?(self.sync_options[:news].to_s)
43
+ self.sync_options[:news] = nil
44
+ end
45
+ end
46
+ include InstanceMethods
47
+ end
48
+
49
+ def syncd?
50
+ self.included_modules.include?(InstanceMethods)
51
+ end
52
+
53
+ end
54
+
55
+ module InstanceMethods #:nodoc:
56
+
57
+ def self.included(base) # :nodoc:
58
+ base.extend ClassMethods
59
+ end
60
+
61
+ def create_in_mailee
62
+ return if( sync_options[:news] and ! send(sync_options[:news])) # Não cria se houver o campo booleano e ele for falso
63
+ self.class.benchmark "Criando contato no Mailee" do
64
+ contact = Mailee::Contact.new
65
+ contact.internal_id = id
66
+ contact.email = send(sync_options[:email])
67
+ contact.name = send(sync_options[:name]) if sync_options[:name]
68
+ contact.save
69
+ end
70
+ rescue
71
+ logger.warn "MAILEE-API: Falhou ao criar o contato #{id} no Mailee"
72
+ end
73
+
74
+ def update_in_mailee
75
+ self.class.benchmark "Atualizando contato no Mailee" do
76
+ contact = Mailee::Contact.find_by_internal_id id
77
+ if contact
78
+ #Se o contato existe e o booleano foi desmarcado, realiza um UNSUBSCRIBE
79
+ if sync_options[:news] and (! send(sync_options[:news]))
80
+ unsubscribe_in_mailee(contact)
81
+ else
82
+ contact.email = send(sync_options[:email])
83
+ contact.name = send(sync_options[:name]) if sync_options[:name]
84
+ contact.save
85
+ end
86
+ else
87
+ create_in_mailee # Se não achou o contato tem q inserir.
88
+ end
89
+ end
90
+ rescue
91
+ logger.warn "MAILEE-API: Falhou ao atualizar o contato #{id} no Mailee"
92
+ end
93
+
94
+ def destroy_in_mailee contact=nil
95
+ self.class.benchmark "Excluindo contato no Mailee" do
96
+ contact ||= Mailee::Contact.find_by_internal_id id
97
+ contact.destroy
98
+ end
99
+ rescue
100
+ logger.warn "MAILEE-API: Falhou ao excluir o contato #{id} no Mailee"
101
+ end
102
+
103
+ def unsubscribe_in_mailee contact=nil
104
+ self.class.benchmark "Descadastrando contato no Mailee" do
105
+ contact ||= Mailee::Contact.find_by_internal_id id
106
+ contact.unsubscribe
107
+ end
108
+ rescue
109
+ logger.warn "MAILEE-API: Falhou ao descadastrar o contato #{id} no Mailee"
110
+ end
111
+
112
+ module ClassMethods
113
+
114
+ # Sends all items from the model to Mailee.
115
+ # Allows passing a datetime to send only contacts updated after.
116
+ # Also allows the use of a block, wich will receive the record of
117
+ # the model and the record from Mailee:
118
+ #
119
+ # Contact.send_all_to_mailee{|i,im| im.address = i.endereco; im.save }
120
+ #
121
+ # IMPORTANT:
122
+ # This method only _sends_ contacts. It does not receives 'em.
123
+ # If you need to receive contacts, for now the best way is to export in
124
+ # Mailee's web interface and import in your app.
125
+ def send_all_to_mailee(after=nil)
126
+ items = after ? all(:conditions => ["updated_at >= ?", after]) : all
127
+ for item in items
128
+ begin
129
+ contact = Mailee::Contact.find_by_internal_id item.id
130
+ if contact and sync_options[:news] and ! item.send(sync_options[:news])
131
+ contact.unsubscribe
132
+ yield item, contact if block_given?
133
+ next
134
+ end
135
+ unless contact
136
+ next if sync_options[:news] and ! item.send(sync_options[:news])
137
+ contact = Mailee::Contact.new
138
+ contact.internal_id = item.id
139
+ end
140
+ contact.email = item.send(sync_options[:email])
141
+ contact.name = item.send(sync_options[:name]) if sync_options[:name]
142
+ contact.save
143
+ yield item, contact if block_given?
144
+ rescue
145
+ logger.warn "MAILEE-API: Falhou ao enviar o contato #{id} ao Mailee"
146
+ end
147
+ end
148
+ end
149
+ end
150
+ end
151
+ end
152
+ end
153
+ ActiveRecord::Base.send(:include, Mailee::Sync) if defined?(ActiveRecord)
@@ -0,0 +1,102 @@
1
+ module Mailee
2
+
3
+ # The Config class is used to set your api url.
4
+ # You can do it in your applications.rb or in a initializer.
5
+ # It's simple:
6
+ #
7
+ # Mailee::Config.site = "http://your.mailee.api.url"
8
+ class Config < ActiveResource::Base
9
+ end
10
+
11
+ # The Contact class gives you default access to your contacts (all,
12
+ # first, create, update, destroy) plus some facilities, like searching
13
+ # contacts by email, keyword (a smart search), signature (name & email)
14
+ # and internal id.
15
+ #
16
+ # Also, you can subscribe contacts to lists and unsubscribe. In Mailee
17
+ # unsubscribing a contact is radical: it will be unsubscribed from ALL
18
+ # lists FOREVER. House rules.
19
+ #
20
+ # If you use mailee gem to sync a model, it will always set the internal_id
21
+ # to your "local" model id and then search based on it to update de remote
22
+ # record.
23
+ class Contact < Config
24
+ def self.find_by_internal_id iid
25
+ find(:first, :params => {:internal_id => iid})
26
+ end
27
+ def self.find_by_email email
28
+ find(:first, :params => {:email => email})
29
+ end
30
+ def self.search keyword, page=1
31
+ find(:all, :params => {:page => page, :by_keyword => keyword })
32
+ end
33
+ def unsubscribe(data={})
34
+ #E.g. data --> {:reason => 'Trip to nowhere', :spam => false}
35
+ put(:unsubscribe, :unsubscribe => {:reason => 'Motivo não especificado'}.merge(data))
36
+ end
37
+ def subscribe(list)
38
+ put(:subscribe, :list => {:name => list})
39
+ end
40
+ end
41
+
42
+ # The List class gives you default access to your lists (all, first, create, update, destroy)
43
+ class List < Config
44
+ end
45
+
46
+ # The Template class gives you default access to your templates (all, first, create, update, destroy)
47
+ class Template < Config
48
+ end
49
+
50
+ # The Quick class allows you to import contacts to mailee just like
51
+ # in the interface
52
+ #
53
+ # USAGE:
54
+ #
55
+ # # Emails only
56
+ # Mailee::Quick.import("witt@cambridge.uk dick@princeton.edu")
57
+ #
58
+ # # Names and emails (needs line breaks)
59
+ # Mailee::Quick.import("witt@cambridge.uk, Wittgenstein\ndick@princeton.edu, Rorty")
60
+ #
61
+ # # Signatures (gmail style)
62
+ # Mailee::Quick.import('"Wittgenstein" <witt@cambridge.uk>,
63
+ # "Rorty" <dick@princeton.edu.us>')
64
+ class Quick < Config
65
+ self.collection_name = "quick"
66
+ def self.import contacts
67
+ create :contacts => contacts
68
+ end
69
+ end
70
+
71
+ # The Message class is where the fun happens.
72
+ #
73
+ # USAGE:
74
+ #
75
+ # # Creating a message (still a draft):
76
+ # message = Mailee::Message.create :title => "TITLE", :subject => "SUBJ", :from_name => "NAME", :from_email => "your@email.com", :html => "<h1>Hello</h1>", :list_id => 666
77
+ # # Sending tests. 33, 44 and 55 are contact's ids.
78
+ # message.test([33,44,55]).should_not be nil
79
+ # # Sending the message now ...
80
+ # message.ready
81
+ # # ... or sending the message 10 days from now
82
+ # message.ready(10.days.from_now)
83
+ class Message < Config
84
+ def test contacts
85
+ put(:test, :contacts => contacts)
86
+ end
87
+ def ready date=nil, hour=0
88
+ if date && date.is_a?(Date) && date > Time.now
89
+ put(:ready, :when => 'after', :after => {:date => date.strftime("%d/%m/%Y"), :hour => date.strftime('%H')})
90
+ else
91
+ put(:ready, :when => 'now')
92
+ end
93
+ end
94
+ end
95
+
96
+ # The Report class is still beta. It can return the results of a
97
+ # message - total deliveries, accesses and returns. There are also
98
+ # methods for getting accesses, unsubscribes and returns in "real time".
99
+ class Report < Config
100
+ end
101
+
102
+ end
@@ -0,0 +1,36 @@
1
+ require 'rails/generators'
2
+ require 'rails/generators/actions'
3
+
4
+ # = Mailee Railtie
5
+ #
6
+ # Creates a new railtie in order to add the mailee_rails:setup generator.
7
+ class MaileeRails < Rails::Railtie
8
+
9
+ # Creates the mailee:rails:setup generator. This generator creates an initializer
10
+ # called "mailee.rb" by asking the user his api URL, and defining it to
11
+ # Mailee::Config.site attribute wich makes all that ActiveResource stuff works.
12
+ class Setup < Rails::Generators::Base
13
+ include Rails::Generators::Actions
14
+ def create
15
+ puts "Please enter your api URL:"
16
+ attempts = 0
17
+ url = readline.gsub(/\n/,'').gsub(/\s+/, '')
18
+ while url !~ /^http:\/\/api\.[a-f0-9]{13}\.[a-z\-]+?\.mailee\.me$/
19
+ attempts += 1
20
+ if attempts < 3
21
+ puts "Invalid URL. Please try again:"
22
+ url = readline.gsub(/\n/,'').gsub(/\s+/, '')
23
+ else
24
+ puts "I think need support. Please talk to us on IRC (#maileeme) or send an email to suporte@mailee.me"
25
+ exit
26
+ end
27
+ end
28
+ initializer("mailee.rb") do
29
+ "Mailee::Config.site = '#{url}'"
30
+ end
31
+ puts "*** Keep your key top secret, ok?"
32
+ puts "*** If anything goes wrong, reach us on IRC (#mailee) or by email on suporte@mailee.me"
33
+ puts "*** Thanks for using Mailee.me"
34
+ end
35
+ end
36
+ end
@@ -5,16 +5,17 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{mailee}
8
- s.version = "0.3.0"
8
+ s.version = "0.4.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Juan Maiz"]
12
- s.date = %q{2010-10-07}
12
+ s.date = %q{2010-10-08}
13
13
  s.description = %q{Permite sincronizar automaticamente seus modelos com o Mailee.me, inclusive com gerenciamento de optin.}
14
14
  s.email = %q{suporte@mailee.me}
15
15
  s.extra_rdoc_files = [
16
16
  "LICENSE",
17
17
  "README.markdown",
18
+ "README.markdown.pt",
18
19
  "README.rdoc"
19
20
  ]
20
21
  s.files = [
@@ -77,11 +78,17 @@ Gem::Specification.new do |s|
77
78
  "init.rb",
78
79
  "install.rb",
79
80
  "lib/mailee.rb",
81
+ "lib/mailee/action_mailer.rb",
82
+ "lib/mailee/active_record.rb",
83
+ "lib/mailee/active_resource.rb",
84
+ "lib/mailee/railties.rb",
80
85
  "mailee.gemspec",
81
86
  "pkg/mailee-0.1.0.gem",
82
87
  "pkg/mailee-0.1.1.gem",
83
88
  "pkg/mailee-0.1.2.gem",
89
+ "spec/am_spec_helper.rb",
84
90
  "spec/ar_spec_helper.rb",
91
+ "spec/mailee-api-am.rb",
85
92
  "spec/mailee-api-ar.rb",
86
93
  "spec/mailee-api.rb",
87
94
  "spec/spec.opts",
@@ -94,7 +101,9 @@ Gem::Specification.new do |s|
94
101
  s.rubygems_version = %q{1.3.7}
95
102
  s.summary = %q{Gem de integração do Mailee.me}
96
103
  s.test_files = [
97
- "spec/ar_spec_helper.rb",
104
+ "spec/am_spec_helper.rb",
105
+ "spec/ar_spec_helper.rb",
106
+ "spec/mailee-api-am.rb",
98
107
  "spec/mailee-api-ar.rb",
99
108
  "spec/mailee-api.rb",
100
109
  "spec/spec_helper.rb"
@@ -0,0 +1,23 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+
4
+ require 'action_mailer'
5
+ require 'mailee'
6
+ require 'spec'
7
+ require 'spec/autorun'
8
+
9
+ Spec::Runner.configure do |config|
10
+ end
11
+
12
+ class Foo < ActionMailer::Base
13
+
14
+ send_with_mailee
15
+
16
+ default :from => "Maiz <maiz@softa.com.br>"
17
+
18
+ def bar(date=Time.now)
19
+ @greeting = "Hi"
20
+ mail :date => date, :to => ["juanmaiz@gmail.com"]
21
+ end
22
+
23
+ end
@@ -0,0 +1,31 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/am_spec_helper')
2
+
3
+ describe "Mailee" do
4
+
5
+ before(:each) do
6
+ Mailee::Config.site = "http://api.bdb28c0a0a4a3.softa.server:3000"
7
+ end
8
+
9
+ it "should respond to send_with_mailee" do
10
+ ActionMailer::Base.should respond_to(:send_with_mailee)
11
+ end
12
+
13
+ it "should use Mailee::Mailer as the delivery method" do
14
+ Foo.delivery_method.should be(Mailee::Mailer)
15
+ end
16
+
17
+ it "should deliver" do
18
+ result = Foo.bar.deliver
19
+ result.should_not be(false)
20
+ result.class.should be(Mail::Message)
21
+ result.delivery_method.class.should be(Mailee::Mailer)
22
+ result.mailee_message.class.should be(Mailee::Message)
23
+ result.mailee_message.id.should_not be(nil)
24
+ result.mailee_message.status.should_not be(4)
25
+ result.mailee_message.title.should_not be('Foo')
26
+ result.mailee_message.subject.should_not be('Foo')
27
+ result.mailee_message.from_name.should_not be('Maiz')
28
+ result.mailee_message.from_email.should_not be('maiz@softa.com.br')
29
+ end
30
+
31
+ end
@@ -6,7 +6,12 @@ describe "Mailee" do
6
6
  Mailee::Config.site = "http://api.bdb28c0a0a4a3.softa.server:3000"
7
7
  @moment = Time.now.strftime('%Y%m%d%H%M%S')
8
8
  end
9
-
9
+
10
+ it "should respond to sync_with_mailee" do
11
+ ActiveRecord::Base.should respond_to(:sync_with_mailee)
12
+ end
13
+
14
+
10
15
  it "should create if news is checked" do
11
16
  foo = Foo.create :name => "rest_test_foo_#{@moment}", :email => "rest_test_foo_#{@moment}@test.com", :news => true
12
17
  found = Mailee::Contact.find_by_email("rest_test_foo_#{@moment}@test.com")
@@ -1,5 +1,3 @@
1
- #INSERT INTO "unsubscribes" ("created_at", "contact_id", "reason", "spam", "message_id") VALUES('2010-10-05 22:52:25.657597', 2082562, default, 'f', default) RETURNING "id"
2
-
3
1
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
4
2
 
5
3
  describe "Mailee" do
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mailee
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
4
+ hash: 11
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 3
9
- - 0
10
- version: 0.3.0
8
+ - 4
9
+ - 2
10
+ version: 0.4.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Juan Maiz
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-10-07 00:00:00 -04:00
18
+ date: 2010-10-08 00:00:00 -04:00
19
19
  default_executable:
20
20
  dependencies: []
21
21
 
@@ -28,6 +28,7 @@ extensions: []
28
28
  extra_rdoc_files:
29
29
  - LICENSE
30
30
  - README.markdown
31
+ - README.markdown.pt
31
32
  - README.rdoc
32
33
  files:
33
34
  - LICENSE
@@ -89,16 +90,23 @@ files:
89
90
  - init.rb
90
91
  - install.rb
91
92
  - lib/mailee.rb
93
+ - lib/mailee/action_mailer.rb
94
+ - lib/mailee/active_record.rb
95
+ - lib/mailee/active_resource.rb
96
+ - lib/mailee/railties.rb
92
97
  - mailee.gemspec
93
98
  - pkg/mailee-0.1.0.gem
94
99
  - pkg/mailee-0.1.1.gem
95
100
  - pkg/mailee-0.1.2.gem
101
+ - spec/am_spec_helper.rb
96
102
  - spec/ar_spec_helper.rb
103
+ - spec/mailee-api-am.rb
97
104
  - spec/mailee-api-ar.rb
98
105
  - spec/mailee-api.rb
99
106
  - spec/spec.opts
100
107
  - spec/spec_helper.rb
101
108
  - tasks/mailee_tasks.rake
109
+ - README.markdown.pt
102
110
  has_rdoc: true
103
111
  homepage: http://help.mailee.me/integration_rails.html
104
112
  licenses: []
@@ -134,7 +142,9 @@ signing_key:
134
142
  specification_version: 3
135
143
  summary: "Gem de integra\xC3\xA7\xC3\xA3o do Mailee.me"
136
144
  test_files:
145
+ - spec/am_spec_helper.rb
137
146
  - spec/ar_spec_helper.rb
147
+ - spec/mailee-api-am.rb
138
148
  - spec/mailee-api-ar.rb
139
149
  - spec/mailee-api.rb
140
150
  - spec/spec_helper.rb