Amazon-SES

 view release on metacpan or  search on metacpan

lib/Amazon/SES.pm  view on Meta::CPAN

use Moops;

# ABSTRACT: Interfaces with AWS's SES service.

class Amazon::SES  {
    use strict;
    use warnings;
    use Carp ('croak');
    use MIME::Base64;
    use Time::Piece;
    use HTTP::Headers;
    use LWP::UserAgent;
    use AWS::Signature4;
    use Amazon::SES::Response;
    use VM::EC2::Security::CredentialCache;
    use HTTP::Request::Common;
    use Kavorka qw( multi method );



    has 'ua' => (is => 'ro', default => sub { return LWP::UserAgent->new() } );
    has 'use_iam_role' => ( is => 'ro', default => 0 );
    has 'access_key'   => ( is => 'ro' );
    has 'secret_key'   => ( is => 'ro' );
    has 'region'       => ( is => 'ro', default => 'us-east-1' );
    has 'response'       => ( is => 'rw' );
    

    method call(Str $action, HashRef $args? = {}) {
        $args->{AWSAccessKeyId} = $self->access_key;
        $args->{Action}         = $action;
        
        my $request = POST("https://email." . $self->region . ".amazonaws.com", $args);
        
        if ($self->{use_iam_role}) {
            my $creds = VM::EC2::Security::CredentialCache->get();
            defined($creds) || die("Unable to retrieve IAM role credentials");
            $self->{access_key} = $creds->accessKeyId;
            $self->{secret_key} = $creds->secretAccessKey;
            $request->header('x-amz-security-token' => $creds->sessionToken);
        }
        
        
        # Add the signature.
        my $signer = AWS::Signature4->new(-access_key => $self->access_key,
                                          -secret_key => $self->secret_key);
        $signer->sign($request);
        
        my $response = $self->ua->request($request);
        return Amazon::SES::Response->new(response => $response, 
                                          action => $action );
    }

    multi method send(MIME::Entity $message) {
        $self->send_mime($message);
    }

    multi method send(Str :$from,
                      Str :$body?,
                      Str :$body_html?,
                      Str :$to,
                      Str :$subject?,
                      Str :$charset = "UTF-8",
                      Str :$return_path?,
                  ) {
        $to = [$to] unless ref($to);
        defined($body) || defined($body_html) || die("No body specified");
        my %call_args = (
            'Message.Subject.Data'    => $subject,
            'Message.Subject.Charset' => $charset,
            'Source'                  => $from
        );
        
        if (defined($body)) {
            $call_args{'Message.Body.Text.Data'} = $body;
            $call_args{'Message.Body.Text.Charset'} = $charset;



( run in 0.930 second using v1.01-cache-2.11-cpan-437f7b0c052 )