cupid 0.1.2 → 0.2.0
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.
- data/README.md +30 -3
- data/lib/cupid/methods/email.rb +121 -48
- data/lib/cupid/methods/subscriber.rb +44 -25
- data/lib/cupid/version.rb +1 -1
- data/tmp/dancing_with_ET.rb +31 -5
- metadata +3 -3
data/README.md
CHANGED
@@ -28,21 +28,48 @@ folders = et_translator.retrieve_email_folders
|
|
28
28
|
# Retrieving email copies for not default account (your_account_id can be nil - default account on ET)
|
29
29
|
copies = et_translator.retrieve_email_copies(name)
|
30
30
|
|
31
|
+
# Retrieving emails from list for not default account (your_account_id can be nil - default account on ET)
|
32
|
+
copies = et_translator.retrieve_emails_from_list(list_id)
|
33
|
+
|
31
34
|
# Creating new folder
|
32
35
|
# not required fields for folder: description, content_type, is_active, is_editable, allow_children
|
33
36
|
new_folder_id = et_translator.create_folder('title', :parent => parent_directory_id)
|
34
37
|
|
38
|
+
# Creating folders
|
39
|
+
# not required fields for folders: description, content_type, is_active, is_editable, allow_children
|
40
|
+
new_folder_ids = et_translator.create_folders(['title', 'title2'], :parent => parent_directory_id)
|
41
|
+
|
35
42
|
# Creating new email
|
36
43
|
# not required fields for email: email_type, is_html_paste, character_set, name, description, category_id
|
37
44
|
new_email_id = et_translator.create_email('subject', 'body')
|
38
45
|
|
46
|
+
# Creating emails
|
47
|
+
# not required fields for emails: email_type, is_html_paste, character_set, name, description, category_id
|
48
|
+
new_email_ids = et_translator.create_emails({'subject' => 'body', 'subject2' => 'body2'})
|
49
|
+
|
50
|
+
# User object:
|
51
|
+
{
|
52
|
+
:email => 'email@email.com',
|
53
|
+
:lists => [list_id1, list_id2...],
|
54
|
+
:first_name => 'Name',
|
55
|
+
:last_name => 'Lastname'
|
56
|
+
}
|
57
|
+
|
39
58
|
# Creating new subscriber
|
40
59
|
# not required fields for subscriber: first_name, last_name, client_id
|
41
|
-
new_subscriber_id = et_translator.create_subscriber(
|
60
|
+
new_subscriber_id = et_translator.create_subscriber(user_object)
|
61
|
+
|
62
|
+
# Creating subscribers
|
63
|
+
# not required fields for subscriber: first_name, last_name, client_id
|
64
|
+
new_subscriber_ids = et_translator.create_subscribers([user_object1, user_object2...])
|
42
65
|
|
43
66
|
# Send email to list
|
44
67
|
# not required fields for send: account
|
45
68
|
send_tracking_id = et_translator.send_email_to_list(email_id, list_id)
|
69
|
+
|
70
|
+
# Send emails to lists
|
71
|
+
# not required fields for send: account
|
72
|
+
send_tracking_ids = et_translator.send_emails_to_lists({'email_id' => 'list_id','email_id' => 'list_id'...})
|
46
73
|
```
|
47
74
|
|
48
75
|
## Installation
|
@@ -50,13 +77,13 @@ send_tracking_id = et_translator.send_email_to_list(email_id, list_id)
|
|
50
77
|
Puts this line into `Gemfile` then run `$ bundle`:
|
51
78
|
|
52
79
|
``` ruby
|
53
|
-
gem 'cupid', '0.
|
80
|
+
gem 'cupid', '0.2.0'
|
54
81
|
```
|
55
82
|
|
56
83
|
Or if you are old-school Rails 2 developer put this into `config/environment.rb` and run `$ rake gems:install`:
|
57
84
|
|
58
85
|
``` ruby
|
59
|
-
config.gem 'cupid', :version => '0.
|
86
|
+
config.gem 'cupid', :version => '0.2.0'
|
60
87
|
```
|
61
88
|
|
62
89
|
Or manually install cupid gem: `$ gem install cupid`
|
data/lib/cupid/methods/email.rb
CHANGED
@@ -30,19 +30,23 @@ module Cupid
|
|
30
30
|
all_copies = response.css('Results').map{|f| {f.css('Name').to_a.map(&:text).join('/') => f.css('ID')[0].text}}
|
31
31
|
end
|
32
32
|
|
33
|
-
def
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
33
|
+
def retrieve_emails_from_folder(folder, account=nil, properties=nil)
|
34
|
+
account ||= @account
|
35
|
+
properties ||= ['ID', 'Name']
|
36
|
+
filters = '<Filter xsi:type="SimpleFilterPart">' +
|
37
|
+
'<Property>CategoryID</Property>' +
|
38
|
+
'<SimpleOperator>equals</SimpleOperator>' +
|
39
|
+
'<Value>' + folder + '</Value>' +
|
40
|
+
'</Filter>'
|
38
41
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
+
soap_body = build_retrieve(account.to_s, 'Email', properties, filters)
|
43
|
+
response = build_request('Retrieve', 'RetrieveRequestMsg', soap_body)
|
44
|
+
response = Nokogiri::XML(response.http.body).remove_namespaces!
|
45
|
+
all_copies = response.css('Results').map{|f| {f.css('Name').to_a.map(&:text).join('/') => f.css('ID')[0].text}}
|
46
|
+
end
|
42
47
|
|
43
|
-
|
44
|
-
|
45
|
-
'</Objects>'
|
48
|
+
def create_email(subject, body, *args)
|
49
|
+
soap_body = prepare_email(subject, body, args)
|
46
50
|
|
47
51
|
response = build_request('Create', 'CreateRequest', soap_body)
|
48
52
|
response = Nokogiri::XML(response.http.body).remove_namespaces!
|
@@ -50,19 +54,7 @@ module Cupid
|
|
50
54
|
end
|
51
55
|
|
52
56
|
def create_folder(title, *args)
|
53
|
-
|
54
|
-
options[:title] = CGI.escapeHTML title.to_s
|
55
|
-
options[:description] ||= 'description'
|
56
|
-
options[:client_id] ||= @account
|
57
|
-
|
58
|
-
options[:content_type] ||= 'email'
|
59
|
-
options[:is_active] ||= 'true'
|
60
|
-
options[:is_editable] ||= 'true'
|
61
|
-
options[:allow_children] ||= 'true'
|
62
|
-
|
63
|
-
soap_body = '<Objects xsi:type="DataFolder">' +
|
64
|
-
create_folder_object(options) +
|
65
|
-
'</Objects>'
|
57
|
+
soap_body = prepare_folder(title, args)
|
66
58
|
|
67
59
|
response = build_request('Create', 'CreateRequest', soap_body)
|
68
60
|
response = Nokogiri::XML(response.http.body).remove_namespaces!
|
@@ -70,27 +62,72 @@ module Cupid
|
|
70
62
|
end
|
71
63
|
|
72
64
|
def send_email_to_list(email_id, list_id, account=nil)
|
73
|
-
|
74
|
-
soap_body = '<Objects xsi:type="Send">' +
|
75
|
-
create_send_object(email_id, list_id, account) +
|
76
|
-
'</Objects>'
|
65
|
+
soap_body = prepare_send_object(email_id, list_id, account)
|
77
66
|
|
78
67
|
response = build_request('Create', 'CreateRequest', soap_body)
|
79
68
|
response = Nokogiri::XML(response.http.body).remove_namespaces!
|
80
69
|
created_send_id = response.css('NewID').text
|
81
70
|
end
|
82
71
|
|
83
|
-
def
|
84
|
-
|
72
|
+
def create_emails(subject_bodies, *args)
|
73
|
+
soap_body = ''
|
74
|
+
subject_bodies.each{ |subject, body| soap_body += prepare_email(subject, body, args) }
|
75
|
+
|
76
|
+
response = build_request('Create', 'CreateRequest', soap_body)
|
77
|
+
response = Nokogiri::XML(response.http.body).remove_namespaces!
|
78
|
+
response.css('Results').map{ |f| f.css('NewID').text }
|
79
|
+
end
|
80
|
+
|
81
|
+
def create_folders(titles, *args)
|
82
|
+
soap_body = titles.map{ |title| prepare_folder(title, args) }.join('')
|
83
|
+
|
84
|
+
response = build_request('Create', 'CreateRequest', soap_body)
|
85
|
+
response = Nokogiri::XML(response.http.body).remove_namespaces!
|
86
|
+
response.css('Results').map{ |f| f.css('NewID').text }
|
87
|
+
end
|
88
|
+
|
89
|
+
def send_emails_to_lists(emails_lists, account=nil)
|
90
|
+
soap_body = ''
|
91
|
+
emails_lists.each{ |email_id, list_id| soap_body += prepare_send(email_id, list_id, account) }
|
92
|
+
|
93
|
+
response = build_request('Create', 'CreateRequest', soap_body)
|
94
|
+
response = Nokogiri::XML(response.http.body).remove_namespaces!
|
95
|
+
response.css('Results').map{ |f| f.css('NewID').text }
|
96
|
+
end
|
97
|
+
|
98
|
+
def delete_email(email_id, account=nil)
|
99
|
+
soap_body = prepare_delete_email(email_id, account)
|
100
|
+
|
101
|
+
response = build_request('Delete', 'DeleteRequest', soap_body)
|
102
|
+
response = Nokogiri::XML(response.http.body).remove_namespaces!
|
103
|
+
response.css('Results').css('StatusCode').text == 'OK'
|
85
104
|
end
|
86
105
|
|
87
|
-
def
|
88
|
-
|
106
|
+
def delete_emails(emails, account=nil)
|
107
|
+
soap_body = emails.map{ |email_id| prepare_delete_email(email_id, account) }.join('')
|
108
|
+
|
109
|
+
response = build_request('Delete', 'DeleteRequest', soap_body)
|
110
|
+
response = Nokogiri::XML(response.http.body).remove_namespaces!
|
111
|
+
response.css('Results').map{ |f| f.css('StatusCode').text == 'OK' }
|
89
112
|
end
|
90
113
|
|
91
114
|
private
|
115
|
+
|
116
|
+
def prepare_email(subject, body, *args)
|
117
|
+
options = args.extract_options!
|
118
|
+
options[:subject] = CGI.escapeHTML subject.to_s
|
119
|
+
options[:body] = CGI.escapeHTML body.to_s
|
120
|
+
options[:client_id] ||= @account
|
121
|
+
|
122
|
+
options[:email_type] ||= 'HTML'
|
123
|
+
options[:is_html_paste] ||= 'true' # ??
|
124
|
+
options[:character_set] ||= 'utf-8'
|
125
|
+
|
126
|
+
create_email_object(options)
|
127
|
+
end
|
128
|
+
|
92
129
|
def create_email_object(options)
|
93
|
-
email_object = '<ObjectID xsi:nil="true"/>'
|
130
|
+
email_object = '<Objects xsi:type="Email"><ObjectID xsi:nil="true"/>'
|
94
131
|
email_object += '<Client><ID>' + options[:client_id].to_s + '</ID></Client>' if options[:client_id]
|
95
132
|
email_object += '<CategoryID>' + options[:category_id].to_s + '</CategoryID>' if options[:category_id]
|
96
133
|
email_object += '<Name>' + options[:name].to_s + '</Name>' if options[:name]
|
@@ -99,11 +136,25 @@ module Cupid
|
|
99
136
|
'<HTMLBody>' + options[:body] + '</HTMLBody>' +
|
100
137
|
'<EmailType>' + options[:email_type] + '</EmailType>' +
|
101
138
|
'<IsHTMLPaste>' + options[:is_html_paste] + '</IsHTMLPaste>' +
|
102
|
-
'<CharacterSet>' + options[:character_set] + '</CharacterSet>'
|
139
|
+
'<CharacterSet>' + options[:character_set] + '</CharacterSet></Objects>'
|
140
|
+
end
|
141
|
+
|
142
|
+
def prepare_folder(title, *args)
|
143
|
+
options = args.extract_options!
|
144
|
+
options[:title] = CGI.escapeHTML title.to_s
|
145
|
+
options[:description] ||= 'description'
|
146
|
+
options[:client_id] ||= @account
|
147
|
+
|
148
|
+
options[:content_type] ||= 'email'
|
149
|
+
options[:is_active] ||= 'true'
|
150
|
+
options[:is_editable] ||= 'true'
|
151
|
+
options[:allow_children] ||= 'true'
|
152
|
+
|
153
|
+
create_folder_object(options)
|
103
154
|
end
|
104
155
|
|
105
156
|
def create_folder_object(options)
|
106
|
-
folder_object = '<ObjectID xsi:nil="true"/>'
|
157
|
+
folder_object = '<Objects xsi:type="DataFolder"><ObjectID xsi:nil="true"/>'
|
107
158
|
folder_object += '<Client><ID>' + options[:client_id].to_s + '</ID></Client>' if options[:client_id]
|
108
159
|
folder_object += '<CustomerKey>' + options[:title].to_s + '</CustomerKey>' if options[:title]
|
109
160
|
folder_object += '<Name>' + options[:title].to_s + '</Name>' +
|
@@ -121,22 +172,44 @@ module Cupid
|
|
121
172
|
<ObjectID xsi:nil="true"/>
|
122
173
|
</ParentFolder>'
|
123
174
|
end
|
175
|
+
folder_object += '</Objects>'
|
176
|
+
end
|
177
|
+
|
178
|
+
def prepare_send(email_id, list_id, account=nil)
|
179
|
+
account ||= @account
|
180
|
+
create_send_object(email_id, list_id, account)
|
124
181
|
end
|
125
182
|
|
126
183
|
def create_send_object(email_id, list_id, account)
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
184
|
+
'<Objects xsi:type="Send"><PartnerKey xsi:nil="true"/>' +
|
185
|
+
'<ObjectID xsi:nil="true"/>' +
|
186
|
+
'<Client><ID>' + account.to_s + '</ID></Client>' +
|
187
|
+
'<Email>' +
|
188
|
+
'<PartnerKey xsi:nil="true"/>' +
|
189
|
+
'<ID>' + email_id.to_s + '</ID>' +
|
190
|
+
'<ObjectID xsi:nil="true"/>' +
|
191
|
+
'</Email>' +
|
192
|
+
'<List>' +
|
193
|
+
'<PartnerKey xsi:nil="true"/>' +
|
194
|
+
'<ObjectID xsi:nil="true"/>' +
|
195
|
+
'<ID>' + list_id.to_s + '</ID>' +
|
196
|
+
'</List>' +
|
197
|
+
'</Objects>'
|
198
|
+
end
|
199
|
+
|
200
|
+
def prepare_delete_email(email_id, account=nil)
|
201
|
+
account ||= @account
|
202
|
+
create_delete_email_object(email_id, account)
|
203
|
+
end
|
204
|
+
|
205
|
+
def create_delete_email_object(email_id, account)
|
206
|
+
'<Objects xsi:type="Email">' +
|
207
|
+
'<Client>' +
|
208
|
+
'<ID>' + account + '</ID>' +
|
209
|
+
'</Client>' +
|
210
|
+
'<ID>' + email_id + '</ID>' +
|
211
|
+
'<ObjectID xsi:nil="true"/>' +
|
212
|
+
'</Objects>'
|
140
213
|
end
|
141
214
|
end
|
142
215
|
end
|
@@ -1,38 +1,57 @@
|
|
1
1
|
module Cupid
|
2
2
|
class Session
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
# User object:
|
4
|
+
# {
|
5
|
+
# :email => 'email@email.com',
|
6
|
+
# :lists => [list_id1, list_id2...],
|
7
|
+
# :first_name => 'Name',
|
8
|
+
# :last_name => 'Lastname'
|
9
|
+
# }
|
10
|
+
def create_subscriber(user, account=nil)
|
11
|
+
soap_body = prepare_subscriber(user, account)
|
7
12
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
build_request('Create', 'CreateRequest', soap_body)
|
13
|
+
response = build_request('Create', 'CreateRequest', soap_body)
|
14
|
+
response = Nokogiri::XML(response.http.body).remove_namespaces!
|
15
|
+
created_user_id = response.css('NewID').text
|
13
16
|
end
|
14
17
|
|
15
|
-
def create_subscribers(
|
16
|
-
|
18
|
+
def create_subscribers(users, account=nil)
|
19
|
+
soap_body = users.map{ |user| prepare_subscriber(user, account) }
|
20
|
+
|
21
|
+
response = build_request('Create', 'CreateRequest', soap_body)
|
22
|
+
response = Nokogiri::XML(response.http.body).remove_namespaces!
|
23
|
+
created_user_id = response.css('NewID').text
|
17
24
|
end
|
18
25
|
|
19
26
|
private
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
27
|
+
|
28
|
+
def prepare_subscriber(user, account=nil)
|
29
|
+
user[:lists].map!{ |list| list_object(list) }
|
30
|
+
account ||= @account
|
31
|
+
|
32
|
+
create_subscriber_object(user, account)
|
33
|
+
end
|
34
|
+
|
35
|
+
def create_subscriber_object(user, account)
|
36
|
+
subscriber_object = '<Objects xsi:type="Subscriber"><ObjectID xsi:nil="true"/>'
|
37
|
+
subscriber_object += '<PartnerKey xsi:nil="true" />'
|
38
|
+
subscriber_object += '<Client><ID>' + account.to_s + '</ID></Client>' if account
|
39
|
+
subscriber_object += user[:lists].join('') if user[:lists]
|
40
|
+
subscriber_object += '<FirstName>' + user[:first_name].to_s + '</FirstName>' if user[:first_name]
|
41
|
+
subscriber_object += '<LastName>' + user[:last_name].to_s + '</LastName>' if user[:last_name]
|
42
|
+
subscriber_object += '<EmailAddress>' + user[:email] + '</EmailAddress>'
|
43
|
+
end
|
44
|
+
|
45
|
+
def list_object(list_id)
|
46
|
+
'<Lists>
|
47
|
+
<PartnerKey xsi:nil="true">
|
32
48
|
</PartnerKey>
|
33
49
|
<ID>' + list_id.to_s + '</ID>
|
34
50
|
<ObjectID xsi:nil="true">
|
35
|
-
</ObjectID>
|
36
|
-
|
51
|
+
</ObjectID>
|
52
|
+
</Lists>'
|
53
|
+
end
|
54
|
+
|
55
|
+
subscriber_object += '</Objects>'
|
37
56
|
end
|
38
57
|
end
|
data/lib/cupid/version.rb
CHANGED
data/tmp/dancing_with_ET.rb
CHANGED
@@ -38,7 +38,7 @@ body = {
|
|
38
38
|
}
|
39
39
|
|
40
40
|
header = {
|
41
|
-
'a:Action' => '
|
41
|
+
'a:Action' => 'Delete',
|
42
42
|
'a:MessageID' => 'urn:uuid:99e6822c-5436-4fec-a243-3126c14924f6',
|
43
43
|
'a:ReplyTo' => {
|
44
44
|
'a:Address' => 'http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous'
|
@@ -129,7 +129,7 @@ body = '<Objects xsi:type="Send">
|
|
129
129
|
<List>
|
130
130
|
<PartnerKey xsi:nil="true"/>
|
131
131
|
<ObjectID xsi:nil="true"/>
|
132
|
-
<ID>
|
132
|
+
<ID>354</ID>
|
133
133
|
</List>
|
134
134
|
</Objects>'
|
135
135
|
#
|
@@ -170,13 +170,39 @@ body = '<RetrieveRequest>
|
|
170
170
|
</Filter>
|
171
171
|
</RetrieveRequest>'
|
172
172
|
|
173
|
-
|
173
|
+
body = '<RetrieveRequest>
|
174
|
+
<ClientIDs>
|
175
|
+
<ID>1058484</ID>
|
176
|
+
</ClientIDs>
|
177
|
+
<ObjectType>Email</ObjectType>
|
178
|
+
<Properties>ID</Properties>
|
179
|
+
<Properties>Name</Properties>
|
180
|
+
<Properties>Folder</Properties>
|
181
|
+
<Properties>CategoryID</Properties>
|
182
|
+
<Filter xsi:type="SimpleFilterPart">
|
183
|
+
<Property>Name</Property>
|
184
|
+
<SimpleOperator>like</SimpleOperator>
|
185
|
+
<Value>120911_piter_follow_up_side</Value>
|
186
|
+
</Filter>
|
187
|
+
</RetrieveRequest>'
|
174
188
|
|
189
|
+
body = '
|
190
|
+
<Objects xsi:type="Email">
|
191
|
+
<Client>
|
192
|
+
<ID>1058484</ID>
|
193
|
+
</Client>
|
194
|
+
<ID>1724</ID>
|
195
|
+
<ObjectID xsi:nil="true"/>
|
196
|
+
</Objects>
|
197
|
+
'
|
198
|
+
|
199
|
+
html = CGI.escapeHTML('<center><h2>Way Cool Email</h2></center>')
|
200
|
+
#
|
175
201
|
# body = '
|
176
202
|
# <Objects xsi:type="Email">
|
177
203
|
# <ObjectID xsi:nil="true"/>
|
178
204
|
# <Client><ID>1058484</ID></Client>
|
179
|
-
# <CategoryID>
|
205
|
+
# <CategoryID>354</CategoryID>
|
180
206
|
# <HTMLBody>'+html+'</HTMLBody>
|
181
207
|
# <Subject>Test Subject111</Subject>
|
182
208
|
# <EmailType>HTML</EmailType>
|
@@ -193,7 +219,7 @@ namespaces = {
|
|
193
219
|
}
|
194
220
|
#
|
195
221
|
response = client.request :retrieve do |soap|
|
196
|
-
soap.input = ['
|
222
|
+
soap.input = ['DeleteRequest', { 'xmlns'=>"http://exacttarget.com/wsdl/partnerAPI"}]
|
197
223
|
soap.header = header
|
198
224
|
soap.env_namespace = :s
|
199
225
|
soap.namespaces = namespaces
|
metadata
CHANGED