File Coverage

blib/lib/Email/Sender/Simple.pm
Criterion Covered Total %
statement 75 86 87.2
branch 15 24 62.5
condition 3 7 42.8
subroutine 16 18 88.8
pod 0 6 0.0
total 109 141 77.3


line stmt bran cond sub pod time code
1             package Email::Sender::Simple 2.600;
2             # ABSTRACT: the simple interface for sending mail with Sender
3              
4 3     3   133285 use Moo;
  3         25535  
  3         13  
5             with 'Email::Sender::Role::CommonSending';
6              
7             #pod =head1 SEE INSTEAD
8             #pod
9             #pod For now, the best documentation of this class is in
10             #pod L.
11             #pod
12             #pod =cut
13              
14 3     3   5334 use Sub::Exporter::Util ();
  3         40945  
  3         125  
15 3         10 use Sub::Exporter -setup => {
16             exports => {
17             sendmail => Sub::Exporter::Util::curry_class('send'),
18             try_to_sendmail => Sub::Exporter::Util::curry_class('try_to_send'),
19             },
20 3     3   20 };
  3         7  
21              
22 3     3   2331 use Email::Address::XS;
  3         26225  
  3         162  
23 3     3   1175 use Email::Sender::Transport;
  3         10  
  3         85  
24 3     3   1026 use Email::Sender::Util;
  3         7  
  3         72  
25 3     3   15 use Try::Tiny;
  3         6  
  3         2256  
26              
27             {
28             my $DEFAULT_TRANSPORT;
29             my $DEFAULT_FROM_ENV;
30              
31             sub _default_was_from_env {
32 1     1   3 my ($class) = @_;
33 1         3 $class->default_transport;
34 1         5 return $DEFAULT_FROM_ENV;
35             }
36              
37             sub transport_from_env {
38 2     2 0 22 my ($class, $env_base) = @_;
39 2   50     11 $env_base ||= 'EMAIL_SENDER_TRANSPORT';
40              
41 2         5 my $transport_class = $ENV{$env_base};
42 2 50 33     11 return unless defined $transport_class and length $transport_class;
43              
44 2         4 my %arg;
45 2         20 for my $key (grep { /^\Q$env_base\E_[_0-9A-Za-z]+$/ } keys %ENV) {
  72         199  
46 2         14 (my $new_key = $key) =~ s/^\Q$env_base\E_//;
47 2         8 $arg{lc $new_key} = $ENV{$key};
48             }
49              
50 2         18 return Email::Sender::Util->easy_transport($transport_class, \%arg);
51             }
52              
53             sub default_transport {
54 9 100   9 0 1904 return $DEFAULT_TRANSPORT if $DEFAULT_TRANSPORT;
55 2         4 my ($class) = @_;
56              
57 2         6 my $transport = $class->transport_from_env;
58              
59 2 50       143 if ($transport) {
60 2         5 $DEFAULT_FROM_ENV = 1;
61 2         4 $DEFAULT_TRANSPORT = $transport;
62             } else {
63 0         0 $DEFAULT_FROM_ENV = 0;
64 0         0 $DEFAULT_TRANSPORT = $class->build_default_transport;
65             }
66              
67 2         5 return $DEFAULT_TRANSPORT;
68             }
69              
70             sub build_default_transport {
71 0     0 0 0 require Email::Sender::Transport::Sendmail;
72 0         0 my $transport = eval { Email::Sender::Transport::Sendmail->new };
  0         0  
73              
74 0 0       0 return $transport if $transport;
75              
76 0         0 require Email::Sender::Transport::SMTP;
77 0         0 Email::Sender::Transport::SMTP->new;
78             }
79              
80             sub reset_default_transport {
81 0     0 0 0 undef $DEFAULT_TRANSPORT;
82 0         0 undef $DEFAULT_FROM_ENV;
83             }
84             }
85              
86             # Maybe this should be an around, but I'm just not excited about figuring out
87             # order at the moment. It just has to work. -- rjbs, 2009-06-05
88             around prepare_envelope => sub {
89             my ($orig, $class, $arg) = @_;
90             $arg ||= {};
91             my $env = $class->$orig($arg);
92              
93             $env = {
94             %$arg,
95             %$env,
96             };
97              
98             return $env;
99             };
100              
101             sub send_email {
102 6     6 0 47 my ($class, $email, $arg) = @_;
103              
104 6         17 my $transport = $class->default_transport;
105              
106 6 100       18 if ($arg->{transport}) {
107 1         4 $arg = { %$arg }; # So we can delete transport without ill effects.
108 1 50       3 $transport = delete $arg->{transport} unless $class->_default_was_from_env;
109             }
110              
111 6 50       25 Carp::confess("transport $transport not safe for use with Email::Sender::Simple")
112             unless $transport->is_simple;
113              
114 6         20 my ($to, $from) = $class->_get_to_from($email, $arg);
115              
116 6 100       35 Email::Sender::Failure::Permanent->throw("no recipients") if ! @$to;
117 4 50       8 Email::Sender::Failure::Permanent->throw("no sender") if ! defined $from;
118              
119 4         26 return $transport->send(
120             $email,
121             {
122             to => $to,
123             from => $from,
124             },
125             );
126             }
127              
128             sub try_to_send {
129 1     1 0 1348 my ($class, $email, $arg) = @_;
130              
131             try {
132 1     1   58 return $class->send($email, $arg);
133             } catch {
134 1   50 1   19 my $error = $_ || 'unknown error';
135 1 50       990 return if try { $error->isa('Email::Sender::Failure') };
  1         24  
136 0         0 die $error;
137 1         10 };
138             }
139              
140             sub _get_to_from {
141 6     6   12 my ($class, $email, $arg) = @_;
142              
143 6         11 my $to = $arg->{to};
144 6 100       11 unless (@$to) {
145             my @to_addrs =
146 3         101 map { $_->address }
147 3         127 map { Email::Address::XS->parse($_) }
148 5         11 map { $email->get_header($_) }
  10         347  
149             qw(to cc);
150 5         219 $to = \@to_addrs;
151             }
152              
153 6         13 my $from = $arg->{from};
154 6 50       16 unless (defined $from) {
155             ($from) =
156 4         87 map { $_->address }
157 4         189 map { Email::Address::XS->parse($_) }
158 6         10 map { $email->get_header($_) }
  6         26  
159             qw(from);
160             }
161              
162 6         152 return ($to, $from);
163             }
164              
165 3     3   20 no Moo;
  3         5  
  3         20  
166             "220 OK";
167              
168             __END__