mirror of
https://github.com/fog/fog.git
synced 2022-11-09 13:51:43 -05:00
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
15 changed files with 578 additions and 0 deletions
24
lib/fog/aws/parsers/ses/delete_verified_email_address.rb
Normal file
24
lib/fog/aws/parsers/ses/delete_verified_email_address.rb
Normal 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
|
26
lib/fog/aws/parsers/ses/get_send_quota.rb
Normal file
26
lib/fog/aws/parsers/ses/get_send_quota.rb
Normal 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
|
29
lib/fog/aws/parsers/ses/get_send_statistics.rb
Normal file
29
lib/fog/aws/parsers/ses/get_send_statistics.rb
Normal 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
|
25
lib/fog/aws/parsers/ses/list_verified_email_addresses.rb
Normal file
25
lib/fog/aws/parsers/ses/list_verified_email_addresses.rb
Normal 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
|
26
lib/fog/aws/parsers/ses/send_email.rb
Normal file
26
lib/fog/aws/parsers/ses/send_email.rb
Normal 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
|
26
lib/fog/aws/parsers/ses/send_raw_email.rb
Normal file
26
lib/fog/aws/parsers/ses/send_raw_email.rb
Normal 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
|
24
lib/fog/aws/parsers/ses/verify_email_address.rb
Normal file
24
lib/fog/aws/parsers/ses/verify_email_address.rb
Normal 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
|
38
lib/fog/aws/requests/ses/delete_verified_email_address.rb
Normal file
38
lib/fog/aws/requests/ses/delete_verified_email_address.rb
Normal 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
|
40
lib/fog/aws/requests/ses/get_send_quota.rb
Normal file
40
lib/fog/aws/requests/ses/get_send_quota.rb
Normal 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
|
43
lib/fog/aws/requests/ses/get_send_statistics.rb
Normal file
43
lib/fog/aws/requests/ses/get_send_statistics.rb
Normal 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
|
38
lib/fog/aws/requests/ses/list_verified_email_addresses.rb
Normal file
38
lib/fog/aws/requests/ses/list_verified_email_addresses.rb
Normal 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
|
58
lib/fog/aws/requests/ses/send_email.rb
Normal file
58
lib/fog/aws/requests/ses/send_email.rb
Normal 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
|
44
lib/fog/aws/requests/ses/send_raw_email.rb
Normal file
44
lib/fog/aws/requests/ses/send_raw_email.rb
Normal 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
|
38
lib/fog/aws/requests/ses/verify_email_address.rb
Normal file
38
lib/fog/aws/requests/ses/verify_email_address.rb
Normal 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
99
lib/fog/aws/ses.rb
Normal 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
|
Loading…
Add table
Reference in a new issue