Class: AWS::SES::Base

Inherits:
Object
  • Object
show all
Includes:
Info, SendEmail
Defined in:
lib/aws/ses/base.rb,
lib/aws/ses/addresses.rb

Overview

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

Direct Known Subclasses

Addresses

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Info

#quota, #statistics

Methods included from SendEmail

#send_email, #send_raw_email

Constructor Details

#initialize(options = {}) ⇒ Object

Returns the object.

Parameters:

  • options (Hash) (defaults to: {})

    a customizable set of options

Options Hash (options):

  • :access_key_id (String) — default: ""

    The user’s AWS Access Key ID

  • :secret_access_key (String) — default: ""

    The user’s AWS Secret Access Key

  • :use_ssl (Boolean) — default: true

    Connect using SSL?

  • :server (String) — default: "email.us-east-1.amazonaws.com"

    The server API endpoint host

  • :proxy_server (String) — default: nil

    An HTTP proxy server FQDN

  • :user_agent (String) — default: "github-aws-ses-ruby-gem"

    The HTTP User-Agent header value

  • :region (String) — default: "us-east-1"

    The server API endpoint host

  • :message_id_domain (String) — default: "us-east-1.amazonses.com"

    Domain used to build message_id header

Raises:

  • (ArgumentError)


103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# File 'lib/aws/ses/base.rb', line 103

def initialize( options = {} )

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

  @signature_version = options[:signature_version]
  @server = options[:server]
  @message_id_domain = options[:message_id_domain]
  @proxy_server = options[:proxy_server]
  @use_ssl = options[:use_ssl]
  @path = options[:path]
  @user_agent = options[:user_agent]
  @region = options[:region]
  @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?
  raise ArgumentError, ":signature_version must be 2 or 4" unless [2, 4].include?(options[:signature_version])

  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
end

Instance Attribute Details

#actionObject (readonly)

Returns the value of attribute action.



90
91
92
# File 'lib/aws/ses/base.rb', line 90

def action
  @action
end

#action_timeObject (readonly)

Returns the value of attribute action_time.



90
91
92
# File 'lib/aws/ses/base.rb', line 90

def action_time
  @action_time
end

#message_id_domainObject (readonly)

Returns the value of attribute message_id_domain.



90
91
92
# File 'lib/aws/ses/base.rb', line 90

def message_id_domain
  @message_id_domain
end

#portObject (readonly)

Returns the value of attribute port.



90
91
92
# File 'lib/aws/ses/base.rb', line 90

def port
  @port
end

#proxy_serverObject (readonly)

Returns the value of attribute proxy_server.



90
91
92
# File 'lib/aws/ses/base.rb', line 90

def proxy_server
  @proxy_server
end

#queryObject (readonly)

Returns the value of attribute query.



90
91
92
# File 'lib/aws/ses/base.rb', line 90

def query
  @query
end

#regionObject (readonly)

Returns the value of attribute region.



90
91
92
# File 'lib/aws/ses/base.rb', line 90

def region
  @region
end

#serverObject (readonly)

Returns the value of attribute server.



90
91
92
# File 'lib/aws/ses/base.rb', line 90

def server
  @server
end

#settingsObject

Returns the value of attribute settings.



92
93
94
# File 'lib/aws/ses/base.rb', line 92

def settings
  @settings
end

#signature_versionObject (readonly)

Returns the value of attribute signature_version.



90
91
92
# File 'lib/aws/ses/base.rb', line 90

def signature_version
  @signature_version
end

#use_sslObject (readonly)

Returns the value of attribute use_ssl.



90
91
92
# File 'lib/aws/ses/base.rb', line 90

def use_ssl
  @use_ssl
end

Instance Method Details

#addressesObject



69
70
71
# File 'lib/aws/ses/addresses.rb', line 69

def addresses
  @addresses ||= Addresses.new(self)
end

#connectionObject



159
160
161
# File 'lib/aws/ses/base.rb', line 159

def connection
  @http
end

#get_aws_auth_header_v2Object

Set the Authorization header using AWS signed header authentication



211
212
213
214
# File 'lib/aws/ses/base.rb', line 211

def get_aws_auth_header_v2
  encoded_canonical = SES.encode(@secret_access_key, httpdate, false)
  SES.authorization_header(@access_key_id, 'HmacSHA256', encoded_canonical)
end

#get_aws_auth_header_v4Object



216
217
218
# File 'lib/aws/ses/base.rb', line 216

def get_aws_auth_header_v4
  SES.authorization_header_v4(sig_v4_auth_credential, sig_v4_auth_signed_headers, sig_v4_auth_signature)
end

#get_req_headersObject



195
196
197
198
199
200
201
202
203
204
205
206
207
208
# File 'lib/aws/ses/base.rb', line 195

def get_req_headers
  headers = {}
  if signature_version == 4
    headers['host'] = @server
    headers['authorization'] = get_aws_auth_header_v4
    headers['x-amz-date'] = amzdate
    headers['user-agent'] = @user_agent
  else
    headers['x-amzn-authorization'] = get_aws_auth_header_v2
    headers['date'] = action_time.httpdate
    headers['user-agent'] = @user_agent
  end
  headers
end

#request(action, params = {}) ⇒ Object

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.



166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
# File 'lib/aws/ses/base.rb', line 166

def request(action, params = {})
  @action = action
  # 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 { |_, value| value.nil? or value.empty?}

  @action_time = Time.now.getutc

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

  @query = params.sort.collect do |param|
    CGI::escape(param[0]) + "=" + CGI::escape(param[1])
  end.join("&")
  response = connection.post(@path, query, get_req_headers)

  response_class = AWS::SES.const_get( "#{action}Response" )
  result = response_class.new(action, response)

  if result.error?
    raise ResponseError.new(result)
  end

  result
end