lib/sailthru.rb in sailthru-client-1.15 vs lib/sailthru.rb in sailthru-client-2.0.0
- old
+ new
@@ -7,11 +7,11 @@
require 'digest/md5'
require 'net/http/post/multipart'
module Sailthru
- Version = VERSION = '1.15'
+ Version = VERSION = '2.0.0'
class SailthruClientException < Exception
end
module Helpers
@@ -116,13 +116,31 @@
# email, String
# replacements, Hash
# options, Hash
# replyto: override Reply-To header
# test: send as test email (subject line will be marked, will not count towards stats)
+ # schedule_time, Date
# returns:
# Hash, response data from server
+ #
+ # Send a transactional email, or schedule one for the near future
+ # http://docs.sailthru.com/api/send
def send(template_name, email, vars={}, options = {}, schedule_time = nil)
+ warn "[DEPRECATION] `send` is deprecated. Please use `send_email` instead."
+ send_email(template_name, email, vars={}, options = {}, schedule_time = nil)
+ end
+
+ # params:
+ # template_name, String
+ # email, String
+ # vars, Hash
+ # options, Hash
+ # replyto: override Reply-To header
+ # test: send as test email (subject line will be marked, will not count towards stats)
+ # returns:
+ # Hash, response data from server
+ def send_email(template_name, email, vars={}, options = {}, schedule_time = nil)
post = {}
post[:template] = template_name
post[:email] = email
post[:vars] = vars if vars.length >= 1
post[:options] = options if options.length >= 1
@@ -248,16 +266,18 @@
end
# params:
# blast_id, Fixnum | String
+ # options, hash
# returns:
# Hash, response data from server
#
# Get information on a previously scheduled email blast
- def get_blast(blast_id)
- api_get(:blast, {:blast_id => blast_id.to_s})
+ def get_blast(blast_id, options={})
+ options[:blast_id] = blast_id.to_s
+ api_get(:blast, options)
end
# params:
# blast_id, Fixnum | String
#
@@ -286,23 +306,40 @@
# params:
# email, String
# vars, Hash
# lists, Hash mapping list name => 1 for subscribed, 0 for unsubscribed
+ # options, Hash mapping optional parameters
# returns:
# Hash, response data from server
#
# Set replacement vars and/or list subscriptions for an email address.
- def set_email(email, vars = {}, lists = {}, templates = {})
- data = {:email => email}
+ def set_email(email, vars = {}, lists = {}, templates = {}, options = {})
+ data = options
+ data[:email] = email
data[:vars] = vars unless vars.empty?
data[:lists] = lists unless lists.empty?
data[:templates] = templates unless templates.empty?
self.api_post(:email, data)
end
-
+
# params:
+ # new_email, String
+ # old_email, String
+ # options, Hash mapping optional parameters
+ # returns:
+ # Hash of response data.
+ #
+ # change a user's email address.
+ def change_email(new_email, old_email, options = {})
+ data = options
+ data[:email] = new_email
+ data[:change_email] = old_email
+ self.api_post(:email, data)
+ end
+
+ # params:
# template_name, String
# returns:
# Hash of response data.
#
# Get a template.
@@ -344,12 +381,11 @@
if request.post?
[:action, :email, :send_id, :sig].each { |key| return false unless params.has_key?(key) }
return false unless params[:action] == :verify
- sig = params[:sig]
- params.delete(:sig)
+ sig = params.delete(:sig)
return false unless sig == get_signature_hash(params, @secret)
_send = self.get_send(params[:send_id])
return false unless _send.has_key?(:email)
@@ -360,10 +396,48 @@
return false
end
end
# params:
+ # params, Hash
+ # request, String
+ # returns:
+ # TrueClass or FalseClass, Returns true if the incoming request is an authenticated optout post.
+ def receive_optout_post(params, request)
+ if request.post?
+ [:action, :email, :sig].each { |key| return false unless params.has_key?(key) }
+
+ return false unless params[:action] == 'optout'
+
+ sig = params.delete(:sig)
+ return false unless sig == get_signature_hash(params, @secret)
+ return true
+ else
+ return false
+ end
+ end
+
+ # params:
+ # params, Hash
+ # request, String
+ # returns:
+ # TrueClass or FalseClass, Returns true if the incoming request is an authenticated hardbounce post.
+ def receive_hardbounce_post(params, request)
+ if request.post?
+ [:action, :email, :sig].each { |key| return false unless params.has_key?(key) }
+
+ return false unless params[:action] == 'hardbounce'
+
+ sig = params.delete(:sig)
+ return false unless sig == get_signature_hash(params, @secret)
+ return true
+ else
+ return false
+ end
+ end
+
+ # params:
# email, String
# items, String
# incomplete, Integer
# message_id, String
# options, Hash
@@ -414,11 +488,10 @@
end
if date != nil
data[:date] = date
end
data[:stat] = 'list'
-
stats(data)
end
# params
@@ -443,22 +516,47 @@
end
data[:stat] = 'blast'
stats(data)
end
+ # params
+ # template, String
+ # start_date, String
+ # end_date, String
+ # options, Hash
+ #
+ # returns:
+ # hash, response from server
+ # Retrieve information about a particular blast or aggregated information from all of blasts over a specified date range
+ def stats_send(template = nil, start_date = nil, end_date = nil, options = {})
+ data = options
+ if template != nil
+ data[:template] = template
+ end
+ if start_date != nil
+ data[:start_date] = start_date
+ end
+ if end_date != nil
+ data[:end_date] = end_date
+ end
+ data[:stat] = 'send'
+ stats(data)
+ end
+
# params
# title, String
# url, String
# date, String
# tags, Array or Comma separated string
# vars, Hash
+ # options, Hash
#
# Push a new piece of content to Sailthru, triggering any applicable alerts.
# http://docs.sailthru.com/api/content
- def push_content(title, url, date = nil, tags = nil, vars = {})
- data = {}
+ def push_content(title, url, date = nil, tags = nil, vars = {}, options = {})
+ data = options
data[:title] = title
data[:url] = url
if date != nil
data[:date] = date
end
@@ -507,38 +605,11 @@
api_delete(:list, {:list => list})
end
# params
# email, String
- # hid_only, Boolean
#
- # gets horizon data
- def get_horizon(email, hid_only = false)
- data = {}
- data[:email] = email
- if hid_only == true
- data[:hid_only] = 1
- end
- api_get(:horizon, data)
- end
-
-
- # params
- # email, String
- # tags, String | Array
- #
- # sets horizon data
- def set_horizon(email, tags)
- data = {}
- data[:email] = email
- data[:tags] = (tags.class == Array) ? tags.join(',') : tags
- api_post(:horizon, data)
- end
-
- # params
- # email, String
- #
# get user alert data
def get_alert(email)
api_get(:alert, {:email => email})
end
@@ -656,23 +727,87 @@
'fields' => fields
}
api_get(:user, data)
end
- # Creates new user
- def create_new_user(options = {})
- options.delete('id')
- api_post(:user, options)
- end
-
- # Save existing user
+ # Create new user, or update existing user
def save_user(id, options = {})
data = options
data['id'] = id
api_post(:user, data)
end
+ # params
+ # Get an existing trigger
+ def get_triggers()
+ api_get(:trigger, {})
+ end
+
+ # params
+ # template, String
+ # trigger_id, String
+ # Get an existing trigger
+ def get_trigger_by_template(template, trigger_id = nil)
+ data = {}
+ data['template'] = template
+ if trigger_id != nil then data['trigger_id'] = trigger_id end
+ api_get(:trigger, data)
+ end
+
+ # params
+ # event, String
+ # Get an existing trigger
+ def get_trigger_by_event(event)
+ data = {}
+ data['event'] = event
+ api_get(:trigger, data)
+ end
+
+ # params
+ # template, String
+ # time, String
+ # time_unit, String
+ # event, String
+ # zephyr, String
+ # Create or update a trigger
+ def post_template_trigger(template, time, time_unit, event, zephyr)
+ data = {}
+ data['template'] = template
+ data['time'] = time
+ data['time_unit'] = time_unit
+ data['event'] = event
+ data['zephyr'] = zephyr
+ api_post(:trigger, data)
+ end
+
+ # params
+ # template, String
+ # time, String
+ # time_unit, String
+ # zephyr, String
+ # Create or update a trigger
+ def post_event_trigger(event, time, time_unit, zephyr)
+ data = {}
+ data['time'] = time
+ data['time_unit'] = time_unit
+ data['event'] = event
+ data['zephyr'] = zephyr
+ api_post(:trigger, data)
+ end
+
+ # params
+ # id, String
+ # event, String
+ # options, Hash (Can contain vars, Hash and/or key)
+ # Notify Sailthru of an Event
+ def post_event(id, event, options = {})
+ data = options
+ data['id'] = id
+ data['event'] = event
+ api_post(:event, data)
+ end
+
# Perform API GET request
def api_get(action, data)
api_request(action, data, 'GET')
end
@@ -726,11 +861,33 @@
end
end
return _result
end
+ # set up our post request
+ def set_up_post_request(uri, data, headers, binary_key = nil)
+ if (!binary_key.nil?)
+ binary_data = data[binary_key]
+ if binary_data.is_a?(StringIO)
+ data[binary_key] = UploadIO.new(
+ binary_data, "text/plain"
+ )
+ else
+ data[binary_key] = UploadIO.new(
+ File.open(binary_data), "text/plain"
+ )
+ end
+
+ req = Net::HTTP::Post::Multipart.new(uri.path, data)
+ else
+ req = Net::HTTP::Post.new(uri.path, headers)
+ req.set_form_data(data)
+ end
+ req
+ end
+
# params:
# uri, String
# data, Hash
# method, String "GET" or "POST"
# returns:
@@ -746,18 +903,13 @@
headers = {"User-Agent" => "Sailthru API Ruby Client #{VERSION}"}
_uri = URI.parse(uri)
if method == 'POST'
- if (!binary_key.nil?)
- binary_data = data[binary_key]
- data[binary_key] = UploadIO.new(File.open(binary_data), "text/plain")
- req = Net::HTTP::Post::Multipart.new(_uri.path, data)
- else
- req = Net::HTTP::Post.new(_uri.path, headers)
- req.set_form_data(data)
- end
+ req = self.set_up_post_request(
+ _uri, data, headers, binary_key
+ )
else
request_uri = "#{_uri.path}?#{_uri.query}"
if method == 'DELETE'
req = Net::HTTP::Delete.new(request_uri, headers)
@@ -777,10 +929,10 @@
response = http.start {
http.request(req)
}
rescue Exception => e
- raise SailthruClientException.new("Unable to open stream: #{_uri}\n#{e}");
+ raise SailthruClientException.new(["Unable to open stream: #{_uri}", e.inspect, e.backtrace].join("\n"));
end
if response.body
return response.body
else