package WWW::Mailgun; use strict; use warnings; use JSON; use MIME::Base64; require LWP::UserAgent; BEGIN { our $VERSION = 0.4; } sub new { my ($class, $param) = @_; my $Key = $param->{key} // die "You must specify an API Key"; my $Domain = $param->{domain} // die "You need to specify a domain (IE: samples.mailgun.org)"; my $Url = $param->{url} // "https://api.mailgun.net/v2"; my $From = $param->{from} // ""; my $self = { ua => LWP::UserAgent->new, url => $Url . '/' . $Domain . '/', from => $From, }; $self->{get} = sub { my ($self, $type, $data) = @_; return my $r = $self->{ua}->get(_get_route($self,[$type, $data])); }; $self->{del} = sub { my ($self, $type, $data) = @_; return my $r = $self->{ua}->delete(_get_route($self,[$type,$data])); }; $self->{post} = sub { my ($self, $type, $data) = @_; return my $r = $self->{ua}->post(_get_route($self,$type), Content => $data); }; $self->{ua}->default_header('Authorization' => 'Basic ' . encode_base64('api:' . $Key)); return bless $self, $class; } sub _handle_response { my ($response) = shift; my $rc = $response->code; return 1 if $rc == 200; die "Bad Request - Often missing a required parameter" if $rc == 400; die "Unauthorized - No valid API key provided" if $rc == 401; die "Request Failed - Parameters were valid but request failed" if $rc == 402; die "Not Found - The requested item doesn’t exist" if $rc == 404; die "Server Errors - something is wrong on Mailgun’s end" if $rc >= 500; } sub send { my ($self, $msg) = @_; $msg->{from} = $msg->{from} // $self->{from}; $msg->{to} = $msg->{to} // die "You must specify an email address to send to"; if (ref $msg->{to} eq 'ARRAY') { $msg->{to} = join(',',@{$msg->{to}}); } $msg->{subject} = $msg->{subject} // ""; $msg->{text} = $msg->{text} // ""; my $r = $self->{ua}->post($self->{url}.'messages',Content_Type => 'multipart/form-data', Content => $msg); _handle_response($r); return from_json($r->decoded_content); } sub _get_route { my ($self, $path) = @_; if (ref $path eq 'ARRAY'){ my @clean = grep {defined} @$path; $path = join('/',@clean); } return $self->{url} . $path; } sub unsubscribes { my ($self, $method, $data) = @_; $method = $method // 'get'; my $r = $self->{lc($method)}->($self,'unsubscribes',$data); _handle_response($r); return from_json($r->decoded_content); } sub complaints { my ($self, $method, $data) = @_; $method = $method // 'get'; my $r = $self->{lc($method)}->($self,'complaints',$data); _handle_response($r); return from_json($r->decoded_content); } sub bounces { my ($self, $method, $data) = @_; $method = $method // 'get'; my $r = $self->{lc($method)}->($self,'bounces',$data); _handle_response($r); return from_json($r->decoded_content); } sub stats { my $self = shift; my $r = $self->{ua}->get($self->{url}.'stats'); _handle_response($r); return from_json($r->decoded_content); } sub logs { my $self = shift; my $r = $self->{ua}->get($self->{url}.'log'); _handle_response($r); return from_json($r->decoded_content); } sub mailboxes { my $self = shift; my $r = $self->{ua}->get($self->{url}.'mailboxes'); _handle_response($r); return from_json($r->decoded_content); } =pod =head1 NAME WWW::Mailgun - Perl wrapper for Mailgun (L) =head1 SYNOPSIS use WWW::Mailgun; my $mg = WWW::Mailgun->new({ key => 'key-yOuRapiKeY', domain => 'YourDomain.mailgun.org', from => 'elb0w ' # Optionally set here, you can set it when you send }); #sending examples below # Get stats http://documentation.mailgun.net/api-stats.html my $obj = $mg->stats; # Get logs http://documentation.mailgun.net/api-logs.html my $obj = $mg->logs; =head1 DESCRIPTION Mailgun is a email service which provides email over a http restful API. These bindings goal is to create a perl interface which allows you to easily leverage it. =head1 USAGE =head2 new({key => 'mailgun key', domain => 'your mailgun domain', from => 'optional from') Creates your mailgun object from => the only optional field, it can be set in the message. =head2 send($data) Send takes in a hash of settings Takes all specificed here L 'from' is optionally set here, otherwise you can set it in the constructor and it can be used for everything =item Send a HTML message with optional array of attachments $mg->send({ to => 'some_email@gmail.com', subject => 'hello', html => '

hello

world', attachment => ['/Users/elb0w/GIT/Personal/Mailgun/test.pl'] }); =item Send a text message $mg->send({ to => 'some_email@gmail.com', subject => 'hello', text => 'Hello there', }); =head2 unsubscribes, bounces, spam Helper methods all take a method argument (del, post, get) L 'post' optionally takes a hash of properties =item Unsubscribes # View all unsubscribes L my $all = $mg->unsubscribes; # Unsubscribe user from all $mg->unsubscribes('post',{address => 'user@website.com', tag => '*'}); # Delete a user from unsubscriptions $mg->unsubscribes('del','user@website.com'); # Get a user from unsubscriptions $mg->unsubscribes('get','user@website.com'); =item Complaints # View all spam complaints L my $all = $mg->complaints; # Add a spam complaint for a address $mg->complaints('post',{address => 'user@website.com'}); # Remove a complaint $mg->complaints('del','user@website.com'); # Get a complaint for a adress $mg->complaints('get','user@website.com'); =item Bounces # View the list of bounces L my $all = $mg->bounces; # Add a permanent bounce $mg->bounces('post',{ address => 'user@website.com', code => 550, #This is default error => 'Error Description' #Empty by default }); # Remove a bounce $mg->bounces('del','user@website.com'); # Get a bounce for a specific address $mg->bounces('get','user@website.com'); =head1 TODO =item Mailboxes =item Campaigns =item Mailing Lists =item Routes =head1 Author George Tsafas =head1 Support elb0w on irc.freenode.net #perl L =head1 Resources L