Initial work on AWS SES (Simple Email Service)

* All parsers filled out
* Requests mostly filled out
* SendEmail and SendRawEmail still need to be implemented
This commit is contained in:
Andy Delcambre 2011-01-26 02:20:33 +08:00 committed by Wesley Beary
parent 7aa7939d3b
commit 284430f526
15 changed files with 578 additions and 0 deletions

View File

@ -0,0 +1,24 @@
module Fog
module Parsers
module AWS
module SES
class DeleteVerifiedEmailAddress < Fog::Parsers::Base
def reset
@response = { 'DeleteVerfiedEmailAddressResult' => nil, 'ResponseMetadata' => {} }
end
def end_element(name)
case name
when 'RequestId'
@response['ResponseMetadata'][name] = @value
end
end
end
end
end
end
end

View File

@ -0,0 +1,26 @@
module Fog
module Parsers
module AWS
module SES
class GetSendQuota < Fog::Parsers::Base
def reset
@response = { 'GetSendQuotaResult' => {}, 'ResponseMetadata' => {} }
end
def end_element(name)
case name
when "Max24HourSend", "MaxSendRate", "SentLast24Hours"
@response['GetSendQuotaResult'][name] = @value
when 'RequestId'
@response['ResponseMetadata'][name] = @value
end
end
end
end
end
end
end

View File

@ -0,0 +1,29 @@
module Fog
module Parsers
module AWS
module SES
class GetSendStatistics < Fog::Parsers::Base
def reset
@response = { 'GetSendStatisticsResult' => { 'SendDataPoints' => [] }, 'ResponseMetadata' => {} }
@send_data_point = {}
end
def end_element(name)
case name
when "Bounces", "Complaints", "DeliveryAttempts", "Rejects", "Timestamp"
@send_data_point[name] = @value
when 'member'
@response['GetSendStatisticsResult']['SendDataPoints'] << @send_data_point
@instance_state = {}
when 'RequestId'
@response['ResponseMetadata'][name] = @value
end
end
end
end
end
end
end

View File

@ -0,0 +1,25 @@
module Fog
module Parsers
module AWS
module SES
class ListVerifiedEmailAddresses < Fog::Parsers::Base
def reset
@response = { 'ListVerifiedEmailAddressesResult' => { 'VerifiedEmailAddresses' => [] }, 'ResponseMetadata' => {} }
end
def end_element(name)
case name
when 'member'
@response['ListVerifiedEmailAddressesResult']['VerifiedEmailAddresses'] << @value
when 'RequestId'
@response['ResponseMetadata'][name] = @value
end
end
end
end
end
end
end

View File

@ -0,0 +1,26 @@
module Fog
module Parsers
module AWS
module SES
class SendEmail < Fog::Parsers::Base
def reset
@response = { 'SendEmailResult' => {}, 'ResponseMetadata' => {} }
end
def end_element(name)
case name
when 'MessageId'
@response['SendEmailResult'][name] = @value
when 'RequestId'
@response['ResponseMetadata'][name] = @value
end
end
end
end
end
end
end

View File

@ -0,0 +1,26 @@
module Fog
module Parsers
module AWS
module SES
class SendRawEmail < Fog::Parsers::Base
def reset
@response = { 'SendRawEmailResult' => {}, 'ResponseMetadata' => {} }
end
def end_element(name)
case name
when 'MessageId'
@response['SendRawEmailResult'][name] = @value
when 'RequestId'
@response['ResponseMetadata'][name] = @value
end
end
end
end
end
end
end

View File

@ -0,0 +1,24 @@
module Fog
module Parsers
module AWS
module SES
class VerifyEmailAddress < Fog::Parsers::Base
def reset
@response = { 'VerifyEmailAddressResult' => nil, 'ResponseMetadata' => {} }
end
def end_element(name)
case name
when 'RequestId'
@response['ResponseMetadata'][name] = @value
end
end
end
end
end
end
end

View File

@ -0,0 +1,38 @@
module Fog
module AWS
class SES
class Real
require 'fog/aws/parsers/ses/delete_verified_email'
# Delete an existing verified email address
#
# ==== Parameters
# * email_address<~String> - Email Address to be removed
# ==== Returns
# * response<~Excon::Response>:
# * body<~Hash>:
# * 'DeleteVerfiedEmailAddressResponse'<~nil>
# * 'ResponseMetadata'<~Hash>:
# * 'RequestId'<~String> - Id of request
def delete_verified_email_address(email_address)
request({
'Action' => 'DeleteVerifiedEmailAddress',
'EmailAddress' => email_address,
:parser => Fog::Parsers::AWS::SES::DeleteVerifiedEmailAddress.new
})
end
end
class Mock
def delete_verified_email_address(email_address)
Fog::Mock.not_implemented
end
end
end
end
end

View File

@ -0,0 +1,40 @@
module Fog
module AWS
class SES
class Real
require 'fog/aws/parsers/ses/get_send_quota'
# Returns the user's current activity limits.
#
# ==== Parameters
#
# ==== Returns
# * response<~Excon::Response>:
# * body<~Hash>:
# * 'GetSendQuotaResult'<~Hash>
# * 'Max24HourSend' <~String>
# * 'MaxSendRate' <~String>
# * 'SentLast24Hours' <~String>
# * 'ResponseMetadata'<~Hash>:
# * 'RequestId'<~String> - Id of request
def get_send_quota
request({
'Action' => 'GetSendQuota',
:parser => Fog::Parsers::AWS::SES::GetSendQuota.new
})
end
end
class Mock
def get_send_quota
Fog::Mock.not_implemented
end
end
end
end
end

View File

@ -0,0 +1,43 @@
module Fog
module AWS
class SES
class Real
require 'fog/aws/parsers/ses/get_send_statistics'
# Returns the user's current activity limits.
#
# ==== Parameters
#
# ==== Returns
# * response<~Excon::Response>:
# * body<~Hash>:
# * 'GetSendStatisticsResult'<~Hash>
# * 'SendDataPoints' <~Array>
# * 'Bounces' <~String>
# * 'Complaints' <~String>
# * 'DeliveryAttempts' <~String>
# * 'Rejects' <~String>
# * 'Timestamp' <~String>
# * 'ResponseMetadata'<~Hash>:
# * 'RequestId'<~String> - Id of request
def get_send_statistics
request({
'Action' => 'GetSendStatistics',
:parser => Fog::Parsers::AWS::SES::GetSendStatistics.new
})
end
end
class Mock
def get_send_statistics
Fog::Mock.not_implemented
end
end
end
end
end

View File

@ -0,0 +1,38 @@
module Fog
module AWS
class SES
class Real
require 'fog/aws/parsers/ses/list_verified_email_addresses'
# Returns a list containing all of the email addresses that have been verified
#
# ==== Parameters
#
# ==== Returns
# * response<~Excon::Response>:
# * body<~Hash>:
# * 'ListVerifiedEmailAddressesResult'<~Hash>
# * 'VerifiedEmailAddresses' <~Array>
# * 'ResponseMetadata'<~Hash>:
# * 'RequestId'<~String> - Id of request
def list_verified_email_addresses
request({
'Action' => 'ListVerifiedEmailAddresses',
:parser => Fog::Parsers::AWS::SES::ListVerifiedEmailAddresses.new
})
end
end
class Mock
def list_verified_email_addresses
Fog::Mock.not_implemented
end
end
end
end
end

View File

@ -0,0 +1,58 @@
module Fog
module AWS
class SES
class Real
require 'fog/aws/parsers/ses/send_email'
# Delete an existing verified email address
#
# ==== Parameters
# * Destination <~Hash> - The destination for this email, composed of To:, From:, and CC: fields.
# * BccAddresses <~Array> - The BCC: field(s) of the message.
# * CcAddresses <~Array> - The CC: field(s) of the message.
# * ToAddresses <~Array> - The To: field(s) of the message.
# * Message <~Hash> - The message to be sent.
# * Body <~Hash>
# * Html <~Hash>
# * Charset <~String>
# * Data <~String>
# * Text <~Hash>
# * Charset <~String>
# * Data <~String>
# * Subject <~Hash>
# * Charset <~String>
# * Data <~String>
# * ReplyToAddresses <~Array> - The reply-to email address(es) for the message. If the recipient replies to the message, each reply-to address will receive the reply.
# * ReturnPath <~String> - The email address to which bounce notifications are to be forwarded. If the message cannot be delivered to the recipient, then an error message will be returned from the recipient's ISP; this message will then be forwarded to the email address specified by the ReturnPath parameter.
# * Source <~String> - The sender's email address
#
# ==== Returns
# * response<~Excon::Response>:
# * body<~Hash>:
# * 'DeleteVerfiedEmailAddressResponse'<~nil>
# * 'ResponseMetadata'<~Hash>:
# * 'RequestId'<~String> - Id of request
def send_email()
params = AWS.indexed_param('ReplyToAddresses.member', [*reply_to_addresses])
request({
'Action' => 'DeleteVerifiedEmailAddress',
'EmailAddress' => email_address,
:parser => Fog::Parsers::AWS::SES::DeleteVerifiedEmailAddress.new
}.merge(params))
end
end
class Mock
def delete_verified_email_address(email_address)
Fog::Mock.not_implemented
end
end
end
end
end

View File

@ -0,0 +1,44 @@
module Fog
module AWS
class SES
class Real
require 'fog/aws/parsers/ses/send_raw_email'
# Delete an existing verified email address
#
# ==== Parameters
# * Destinations <~Array> - The destination for this email, composed of To:, From:, and CC: fields.
# * RawMessage <~Hash> - The message to be sent.
# * Data <~String>
# * Source <~String> - The sender's email address
#
# ==== Returns
# * response<~Excon::Response>:
# * body<~Hash>:
# * 'DeleteVerfiedEmailAddressResponse'<~nil>
# * 'ResponseMetadata'<~Hash>:
# * 'RequestId'<~String> - Id of request
def send_raw_email()
# TODO: Make this work
params = AWS.indexed_param('ReplyToAddresses.member', [*reply_to_addresses])
request({
'Action' => 'SendRawEmail',
:parser => Fog::Parsers::AWS::SES::SendRawEmail.new
}.merge(params))
end
end
class Mock
def send_raw_email()
Fog::Mock.not_implemented
end
end
end
end
end

View File

@ -0,0 +1,38 @@
module Fog
module AWS
class SES
class Real
require 'fog/aws/parsers/ses/verify_email_address'
# Verifies an email address. This action causes a confirmation email message to be sent to the specified address.
#
# ==== Parameters
# * email_address<~String> - The email address to be verified
# ==== Returns
# * response<~Excon::Response>:
# * body<~Hash>:
# * 'VerifyEmailAddressResult'<~nil>
# * 'ResponseMetadata'<~Hash>:
# * 'RequestId'<~String> - Id of request
def verify_email_address(email_address)
request({
'Action' => 'VerifyEmailAddress',
'EmailAddress' => email_address,
:parser => Fog::Parsers::AWS::SES::VerifyEmailAddress.new
})
end
end
class Mock
def verify_email_address(email_address)
Fog::Mock.not_implemented
end
end
end
end
end

99
lib/fog/aws/ses.rb Normal file
View File

@ -0,0 +1,99 @@
module Fog
module AWS
class SES < Fog::Service
requires :aws_access_key_id, :aws_secret_access_key
recognizes :region, :host, :path, :port, :scheme, :persistent
request_path 'fog/aws/requests/ses'
request :delete_verified_email_address
request :verify_email_address
request :get_send_quota
request :get_send_statistics
request :list_verified_email_addresses
request :send_email
request :send_raw_email
class Mock
def initialize(options={})
end
end
class Real
# Initialize connection to SES
#
# ==== Notes
# options parameter must include values for :aws_access_key_id and
# :aws_secret_access_key in order to create a connection
#
# ==== Examples
# ses = SES.new(
# :aws_access_key_id => your_aws_access_key_id,
# :aws_secret_access_key => your_aws_secret_access_key
# )
#
# ==== Parameters
# * options<~Hash> - config arguments for connection. Defaults to {}.
# * region<~String> - optional region to use, in ['eu-west-1', 'us-east-1', 'us-west-1'i, 'ap-southeast-1']
#
# ==== Returns
# * SES object with connection to AWS.
def initialize(options={})
@aws_access_key_id = options[:aws_access_key_id]
@aws_secret_access_key = options[:aws_secret_access_key]
@hmac = Fog::HMAC.new('sha256', @aws_secret_access_key)
options[:region] ||= 'us-east-1'
@host = options[:host] || case options[:region]
when 'us-east-1'
'email.us-east-1.amazonaws.com'
else
raise ArgumentError, "Unknown region: #{options[:region].inspect}"
end
@path = options[:path] || '/'
@port = options[:port] || 443
@scheme = options[:scheme] || 'https'
@connection = Fog::Connection.new("#{@scheme}://#{@host}:#{@port}#{@path}", options[:persistent])
end
def reload
@connection.reset
end
private
def request(params)
idempotent = params.delete(:idempotent)
parser = params.delete(:parser)
body = AWS.signed_params(
params,
{
:aws_access_key_id => @aws_access_key_id,
:hmac => @hmac,
:host => @host,
:path => @path,
:port => @port,
:version => '2009-11-25'
}
)
response = @connection.request({
:body => body,
:expects => 200,
:headers => { 'Content-Type' => 'application/x-www-form-urlencoded' },
:idempotent => idempotent,
:host => @host,
:method => 'POST',
:parser => parser
})
response
end
end
end
end
end