Upload files to 'lib/postman'
This commit is contained in:
parent
276ce41784
commit
0bfd0c04e0
156
lib/postman/message.rb
Normal file
156
lib/postman/message.rb
Normal file
@ -0,0 +1,156 @@
|
||||
require 'postman/error'
|
||||
require 'postman/header_set'
|
||||
require 'postman/attachment'
|
||||
|
||||
module Postman
|
||||
class Message
|
||||
|
||||
#
|
||||
# Find a specific messsage with the given scope
|
||||
#
|
||||
def self.find_with_scope(scope, id)
|
||||
api = scope.client.moonrope.messages.message(:id => id.to_i, :_expansions => scope.expansions)
|
||||
if api.success?
|
||||
Message.new(scope.client, api.data)
|
||||
elsif api.status == 'error' && api.data['code'] == 'MessageNotFound'
|
||||
raise MessageNotFound.new(id)
|
||||
else
|
||||
raise Error, "Couldn't load message from API (#{api.data})"
|
||||
end
|
||||
end
|
||||
|
||||
#
|
||||
# If methods are called directly on the Message class, we likely want to see if we can
|
||||
# run them through the global client message scope.
|
||||
#
|
||||
def self.method_missing(name, *args, &block)
|
||||
if MessageScope.instance_methods(false).include?(name)
|
||||
Postman::Client.instance.messages.send(name, *args, &block)
|
||||
else
|
||||
super
|
||||
end
|
||||
end
|
||||
|
||||
#
|
||||
# Initialize a new message object with the client and a set of initial attributes.
|
||||
#
|
||||
def initialize(client, attributes)
|
||||
@client = client
|
||||
@attributes = attributes
|
||||
end
|
||||
|
||||
#
|
||||
# Return the message ID
|
||||
#
|
||||
def id
|
||||
@attributes['id']
|
||||
end
|
||||
|
||||
#
|
||||
# Return the message token
|
||||
#
|
||||
def token
|
||||
@attributes['token']
|
||||
end
|
||||
|
||||
#
|
||||
# Set a has of all the attributes from the API that should be exposed through
|
||||
# the Message class.
|
||||
#
|
||||
ATTRIBUTES = {
|
||||
:status => [:status, :status],
|
||||
:last_delivery_attempt => [:status, :last_delivery_attempt, :timestamp],
|
||||
:held? => [:status, :held, :boolean],
|
||||
:hold_expiry => [:status, :hold_expiry, :timestamp],
|
||||
:rcpt_to => [:details, :rcpt_to],
|
||||
:mail_from => [:details, :mail_from],
|
||||
:subject => [:details, :subject],
|
||||
:message_id => [:details, :message_id],
|
||||
:timestamp => [:details, :timestamp, :timestamp],
|
||||
:direction => [:details, :direction],
|
||||
:size => [:details, :size],
|
||||
:bounce? => [:details, :bounce, :boolean],
|
||||
:bounce_for_id => [:details, :bounce],
|
||||
:tag => [:details, :tag],
|
||||
:received_with_ssl? => [:details, :received_with_ssl, :boolean],
|
||||
:inspected? => [:inspection, :inspected, :boolean],
|
||||
:spam? => [:inspection, :spam, :boolean],
|
||||
:spam_score => [:inspection, :spam_score],
|
||||
:threat? => [:inspection, :thret, :boolean],
|
||||
:threat_details => [:inspection, :threat_details],
|
||||
:plain_body => [:plain_body],
|
||||
:html_body => [:html_body],
|
||||
}
|
||||
|
||||
#
|
||||
# Catch calls to any of the default attributes for a message and return the
|
||||
# data however we'd like it
|
||||
#
|
||||
def method_missing(name, *args, &block)
|
||||
if mapping = ATTRIBUTES[name.to_sym]
|
||||
expansion, attribute, type = mapping
|
||||
value = from_expansion(expansion, attribute)
|
||||
case type
|
||||
when :timestamp
|
||||
value ? Time.at(value) : nil
|
||||
when :boolean
|
||||
value == 1
|
||||
else
|
||||
value
|
||||
end
|
||||
else
|
||||
super
|
||||
end
|
||||
end
|
||||
|
||||
#
|
||||
# Return a set of headers which can be queried like a hash however looking up
|
||||
# values using [] will be case-insensitive.
|
||||
#
|
||||
def headers
|
||||
@headers ||= HeaderSet.new(from_expansion(:headers))
|
||||
end
|
||||
|
||||
#
|
||||
# Return an array of attachment objects
|
||||
#
|
||||
def attachments
|
||||
@attachments ||= from_expansion(:attachments).map do |a|
|
||||
Attachment.new(a)
|
||||
end
|
||||
end
|
||||
|
||||
#
|
||||
# Return the full raw message
|
||||
#
|
||||
def raw_message
|
||||
@raw_message ||= Base64.decode64(from_expansion(:raw_message))
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def from_expansion(expansion, attribute = nil, loaded = false)
|
||||
if @attributes.has_key?(expansion.to_s) || loaded
|
||||
attribute ? @attributes[expansion.to_s][attribute.to_s] : @attributes[expansion.to_s]
|
||||
else
|
||||
load_expansions(expansion)
|
||||
from_expansion(expansion, attribute, true)
|
||||
end
|
||||
end
|
||||
|
||||
def load_expansions(*names)
|
||||
puts "\e[31mLoading expansion #{names}\e[0m"
|
||||
api = @client.moonrope.messages.message(:id => self.id, :_expansions => names)
|
||||
if api.success?
|
||||
names.each do |expansion_name|
|
||||
if api.data.has_key?(expansion_name.to_s)
|
||||
@attributes[expansion_name.to_s] = api.data[expansion_name.to_s]
|
||||
end
|
||||
end
|
||||
else
|
||||
raise Postman::Error, "Couldn't load expansion data (#{names.join(', ')}) for message ID '#{self.id}'"
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
81
lib/postman/send_message.rb
Normal file
81
lib/postman/send_message.rb
Normal file
@ -0,0 +1,81 @@
|
||||
require 'base64'
|
||||
require 'postman/send_result'
|
||||
|
||||
module Postman
|
||||
class SendMessage
|
||||
|
||||
def initialize(client)
|
||||
@client = client
|
||||
@attributes = {}
|
||||
end
|
||||
|
||||
def send!
|
||||
api = @client.moonrope.request(:send, :message, @attributes)
|
||||
if api.success?
|
||||
SendResult.new(@client, api.data)
|
||||
elsif api.status == 'error'
|
||||
raise SendError.new(api.data['code'], api.data['message'])
|
||||
else
|
||||
raise Error, "Couldn't send message"
|
||||
end
|
||||
end
|
||||
|
||||
def from(address)
|
||||
@attributes[:from] = address
|
||||
end
|
||||
|
||||
def sender(address)
|
||||
@attributes[:sender] = address
|
||||
end
|
||||
|
||||
def to(*addresses)
|
||||
@attributes[:to] ||= []
|
||||
@attributes[:to] += addresses
|
||||
end
|
||||
|
||||
def cc(*addresses)
|
||||
@attributes[:cc] ||= []
|
||||
@attributes[:cc] += addresses
|
||||
end
|
||||
|
||||
def bcc(*addresses)
|
||||
@attributes[:bcc] ||= []
|
||||
@attributes[:bcc] += addresses
|
||||
end
|
||||
|
||||
def subject(subject)
|
||||
@attributes[:subject] = subject
|
||||
end
|
||||
|
||||
def tag(tag)
|
||||
@attributes[:tag] = tag
|
||||
end
|
||||
|
||||
def reply_to(reply_to)
|
||||
@attributes[:reply_to] = reply_to
|
||||
end
|
||||
|
||||
def plain_body(content)
|
||||
@attributes[:plain_body] = content
|
||||
end
|
||||
|
||||
def html_body(content)
|
||||
@attributes[:html_body] = content
|
||||
end
|
||||
|
||||
def header(key, value)
|
||||
@attributes[:headers] ||= {}
|
||||
@attributes[:headers][key.to_s] = value
|
||||
end
|
||||
|
||||
def attach(filename, content_type, data)
|
||||
@attributes[:attachments] ||= []
|
||||
@attributes[:attachments] << {
|
||||
:name => filename,
|
||||
:content_type => content_type,
|
||||
:data => Base64.encode64(data)
|
||||
}
|
||||
end
|
||||
|
||||
end
|
||||
end
|
37
lib/postman/send_raw_message.rb
Normal file
37
lib/postman/send_raw_message.rb
Normal file
@ -0,0 +1,37 @@
|
||||
require 'base64'
|
||||
require 'postman/send_result'
|
||||
|
||||
module Postman
|
||||
class SendRawMessage
|
||||
|
||||
def initialize(client)
|
||||
@client = client
|
||||
@attributes = {}
|
||||
end
|
||||
|
||||
def send!
|
||||
api = @client.moonrope.request(:send, :raw, @attributes)
|
||||
if api.success?
|
||||
SendResult.new(@client, api.data)
|
||||
elsif api.status == 'error'
|
||||
raise SendError.new(api.data['code'], api.data['message'])
|
||||
else
|
||||
raise Error, "Couldn't send message"
|
||||
end
|
||||
end
|
||||
|
||||
def mail_from(address)
|
||||
@attributes[:mail_from] = address
|
||||
end
|
||||
|
||||
def rcpt_to(*addresses)
|
||||
@attributes[:rcpt_to] ||= []
|
||||
@attributes[:rcpt_to] += addresses
|
||||
end
|
||||
|
||||
def data(data)
|
||||
@attributes[:data] = Base64.encode64(data)
|
||||
end
|
||||
|
||||
end
|
||||
end
|
30
lib/postman/send_result.rb
Normal file
30
lib/postman/send_result.rb
Normal file
@ -0,0 +1,30 @@
|
||||
module Postman
|
||||
class SendResult
|
||||
|
||||
def initialize(client, result)
|
||||
@client = client
|
||||
@result = result
|
||||
end
|
||||
|
||||
def message_id
|
||||
@result['message_id']
|
||||
end
|
||||
|
||||
def recipients
|
||||
@recipients ||= begin
|
||||
@result['messages'].each_with_object({}) do |(recipient, message_details), hash|
|
||||
hash[recipient.to_s.downcase] = Message.new(@client, message_details)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def [](recipient)
|
||||
recipients[recipient.to_s.downcase]
|
||||
end
|
||||
|
||||
def size
|
||||
recipients.size
|
||||
end
|
||||
|
||||
end
|
||||
end
|
3
lib/postman/version.rb
Normal file
3
lib/postman/version.rb
Normal file
@ -0,0 +1,3 @@
|
||||
module Postman
|
||||
VERSION = '1.0.1'
|
||||
end
|
Loading…
x
Reference in New Issue
Block a user