mailee 0.3.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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