]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/perlmods/lib/OpenILS/Application/Trigger/Reactor/SendEmail.pm
Fix LP#1031335 by escaping some email headers automatically
[Evergreen.git] / Open-ILS / src / perlmods / lib / OpenILS / Application / Trigger / Reactor / SendEmail.pm
1 package OpenILS::Application::Trigger::Reactor::SendEmail;
2 use strict; use warnings;
3 use Error qw/:try/;
4 use Data::Dumper;
5 use Email::Send;
6 use Email::Simple;
7 use OpenSRF::Utils::SettingsClient;
8 use OpenILS::Application::Trigger::Reactor;
9 use OpenSRF::Utils::Logger qw/:logger/;
10 use Encode;
11 $Data::Dumper::Indent = 0;
12
13 use base 'OpenILS::Application::Trigger::Reactor';
14
15 my $log = 'OpenSRF::Utils::Logger';
16
17 sub ABOUT {
18     return <<ABOUT;
19
20 The SendEmail Reactor Module attempts to email out, via Email::Send,
21 whatever is constructed by the template passed in from the Event Definition.
22
23 The SMTP server specified by the /opensrf/default/email_notify/smtp_server
24 setting is used to send the email, and the value at
25 /opensrf/default/email_notify/sender_address is passed into the template as
26 the 'default_sender' variable.
27
28 Email is encoded in UTF-8 and the corresponding MIME-Version, Content-Type,
29 and Content-Transfer-Encoding headers are set to help mail user agents
30 decode the content.
31
32 The From, To, Subject, Bcc, Cc, Reply-To and Sender -fields are
33 automatically MIME-encoded.
34
35 No default template is assumed, and all information other than the
36 default_sender that the system provides is expected to be gathered by the
37 Event Definition through either Environment or Parameter definitions.
38
39 ABOUT
40 }
41
42 sub handler {
43     my $self = shift;
44     my $env = shift;
45
46     my $conf = OpenSRF::Utils::SettingsClient->new;
47     my $smtp = $conf->config_value('email_notify', 'smtp_server');
48     $$env{default_sender} = $conf->config_value('email_notify', 'sender_address');
49
50     my $text = encode_utf8($self->run_TT($env));
51     return 0 if (!$text);
52
53     my $sender = Email::Send->new({mailer => 'SMTP'});
54     $sender->mailer_args([Host => $smtp]);
55
56     my $stat;
57     my $err;
58
59     my $email = Email::Simple->new($text);
60
61     for my $hfield (qw/From To Subject Bcc Cc Reply-To Sender/) {
62         my @headers = $email->header($hfield);
63         $email->header_set($hfield => map { encode("MIME-Header", $_) } @headers) if ($headers[0]);
64     }
65
66     $email->header_set('MIME-Version' => '1.0');
67     $email->header_set('Content-Type' => "text/plain; charset=UTF-8");
68     $email->header_set('Content-Transfer-Encoding' => '8bit');
69
70     try {
71         $stat = $sender->send($email);
72     } catch Error with {
73         $err = $stat = shift;
74         $logger->error("SendEmail Reactor: Email failed with error: $err");
75     };
76
77     if( !$err and $stat and $stat->type eq 'success' ) {
78         $logger->info("SendEmail Reactor: successfully sent email");
79         return 1;
80     } else {
81         $logger->warn("SendEmail Reactor: unable to send email: ".Dumper($stat));
82         $text =~ s/\n//og;
83         $logger->warn("SendEmail Reactor: failed email template: $text");
84         return 0;
85     }
86
87 }
88
89 1;
90