class AWS::SES::Base

AWS::SES::Base is the abstract super class of all classes who make requests against SES

Attributes

port[R]
proxy_server[R]
server[R]
settings[RW]
use_ssl[R]

Public Class Methods

new( options = {} ) click to toggle source

@option options [String] :access_key_id (“”) The user's AWS Access Key ID @option options [String] :secret_access_key (“”) The user's AWS Secret Access Key @option options [Boolean] :use_ssl (true) Connect using SSL? @option options [String] :server (“email.us-east-1.amazonaws.com”) The server API endpoint host @option options [String] :proxy_server (nil) An HTTP proxy server FQDN @option options [String] :user_agent (“github-aws-ses-ruby-gem”) The HTTP User-Agent header value @return [Object] the object.

# File lib/aws/ses/base.rb, line 86
def initialize( options = {} )

  options = { :access_key_id => "",
              :secret_access_key => "",
              :use_ssl => true,
              :server => DEFAULT_HOST,
              :path => "/",
              :user_agent => USER_AGENT,
              :proxy_server => nil
              }.merge(options)

  @server = options[:server]
  @proxy_server = options[:proxy_server]
  @use_ssl = options[:use_ssl]
  @path = options[:path]
  @user_agent = options[:user_agent]
  @settings = {}

  raise ArgumentError, "No :access_key_id provided" if options[:access_key_id].nil? || options[:access_key_id].empty?
  raise ArgumentError, "No :secret_access_key provided" if options[:secret_access_key].nil? || options[:secret_access_key].empty?
  raise ArgumentError, "No :use_ssl value provided" if options[:use_ssl].nil?
  raise ArgumentError, "Invalid :use_ssl value provided, only 'true' or 'false' allowed" unless options[:use_ssl] == true || options[:use_ssl] == false
  raise ArgumentError, "No :server provided" if options[:server].nil? || options[:server].empty?

  if options[:port]
    # user-specified port
    @port = options[:port]
  elsif @use_ssl
    # https
    @port = 443
  else
    # http
    @port = 80
  end

  @access_key_id = options[:access_key_id]
  @secret_access_key = options[:secret_access_key]

  # Use proxy server if defined
  # Based on patch by Mathias Dalheimer.  20070217
  proxy = @proxy_server ? URI.parse(@proxy_server) : OpenStruct.new
  @http = Net::HTTP::Proxy( proxy.host,
                            proxy.port,
                            proxy.user,
                            proxy.password).new(options[:server], @port)

  @http.use_ssl = @use_ssl

  # Don't verify the SSL certificates.  Avoids SSL Cert warning in log on every GET.
  @http.verify_mode = OpenSSL::SSL::VERIFY_NONE

end

Public Instance Methods

addresses() click to toggle source
# File lib/aws/ses/addresses.rb, line 69
def addresses
  @addresses ||= Addresses.new(self)
end
connection() click to toggle source
# File lib/aws/ses/base.rb, line 139
def connection
  @http
end
get_aws_auth_param(timestamp, secret_access_key) click to toggle source

Set the Authorization header using AWS signed header authentication

# File lib/aws/ses/base.rb, line 182
def get_aws_auth_param(timestamp, secret_access_key)
  encoded_canonical = SES.encode(secret_access_key, timestamp, false)
  SES.authorization_header(@access_key_id, 'HmacSHA256', encoded_canonical)
end
request(action, params = {}) click to toggle source

Make the connection to AWS passing in our request.

allow us to have a one line call in each method which will do all of the work in making the actual request to AWS.

# File lib/aws/ses/base.rb, line 146
def request(action, params = {})
  # Use a copy so that we don't modify the caller's Hash, remove any keys that have nil or empty values
  params = params.reject { |key, value| value.nil? or value.empty?}
  
  timestamp = Time.now.getutc

  params.merge!( {"Action" => action,
                  "SignatureVersion" => "2",
                  "SignatureMethod" => 'HmacSHA256',
                  "AWSAccessKeyId" => @access_key_id,
                  "Version" => API_VERSION,
                  "Timestamp" => timestamp.iso8601 } )

  query = params.sort.collect do |param|
    CGI::escape(param[0]) + "=" + CGI::escape(param[1])
  end.join("&")

  req = {}

  req['X-Amzn-Authorization'] = get_aws_auth_param(timestamp.httpdate, @secret_access_key)
  req['Date'] = timestamp.httpdate
  req['User-Agent'] = @user_agent 

  response = connection.post(@path, query, req)
  
  response_class = AWS::SES.const_get( "#{action}Response" )
  result = response_class.new(action, response)
  
  if result.error?
    raise ResponseError.new(result)
  end
  
  result
end