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:
parent
7aa7939d3b
commit
284430f526
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
Loading…
Reference in New Issue