1 package Newslash::Plugin::Sendmail;
2 use Mojo::Base 'Mojolicious::Plugin';
5 use Email::Sender::Simple;
6 use Email::Sender::Transport::SMTP;
13 my ($self, $app, $conf) = @_;
15 $app->helper(sendmail => sub { shift; $self->sendmail(@_); });
17 # default config values
18 my $cnf = $app->config->{Sendmail} ||= {};
20 $cnf->{default_from} ||= 'admin@example.com';
21 $cnf->{smtp_host} ||= 'example.com';
22 $cnf->{smtp_port} ||= '25';
26 my ($self, $from, $to, $title, $body) = @_;
28 # create header and body
30 From => encode('MIME-Header-ISO_2022_JP', $from),
31 To => encode('MIME-Header-ISO_2022_JP', $to),
32 Subject => encode('MIME-Header-ISO_2022_JP', $title),
33 'Content-Type' => 'text/plain; charset=ISO-2022-JP',
34 'Content-Transfer-Encoding' => '7bit',
37 my $encoded_body = encode('iso-2022-jp', $body);
40 my $email = Email::Simple->create(header => $header,
41 body => $encoded_body);
44 my $smtp_host = $self->app->config->{Sendmail}->{smtp_host};
45 my $smtp_port = $self->app->config->{Sendmail}->{smtp_port};
46 my $smtp_timeout = $self->app->config->{Sendmail}->{smtp_timeout};
47 my $transport = Email::Sender::Transport::SMTP->new({ host => $smtp_host,
49 timeout => $smtp_timeout,
53 my $rs = eval { Email::Sender::Simple->send($email, {transport => $transport}) };
55 my ($msg, $code) = ($@->message, $@->code);
56 $self->app->log->error("Sendmail: sendmail error. $msg ($code)");
63 my ($self, $template_name, $vars, $opts) = @_;
66 my $renderer = $self->app->tt2renderer;
67 my $rs = $renderer->render($template_name, $vars);
69 my ($title, $body) = split(/\n/, $rs, 2);
71 return ($title, $body);
78 if (!defined $args->{to}) {
79 $self->app->log->error("Sendmail: no recipient given!");
87 if (ref($args->{to}) eq "HASH") {
88 $recipient_user = $args->{to};
90 elsif (ref($args->{to}) eq "ARRAY") {
93 elsif (ref($args->{to}) eq "") {
94 if ($args->{to} =~ m/^\d+$/) {
96 $recipient_user = $self->app->model('users')->select(uid => $args->{to});
99 my $encoded_to = encode('MIME-Header-ISO_2022_JP', $args->{to});
100 if (Email::Valid->address($encoded_to)) {
101 $to_address = $args->{to};
106 if ($recipient_user) {
107 $to_address = $recipient_user->{realemail};
111 $self->app->log->error("Sendmail: invalid recipient: $args->{to}");
117 my $from_address = $args->{from} || $self->app->config->{Sendmail}->{default_from};
119 # create title and body
120 my $title = $args->{title};
121 my $body = $args->{body};
123 if ($args->{template}) {
125 ($title, $body) = eval { $self->_render($args->{template},
128 $self->app->log->error("Sendmail: template error: $@");
134 $self->app->log->error("Sendmail: no title given. to: $to_address");
139 $self->app->log->error("Sendmail: no body given. title: $title, to: $to_address");
143 # if render only mode, return items.
144 if ($args->{render_only}) {
145 return wantarray ? ($from_address, $to_address, $title, $body) : { from => $from_address,
152 my $rs = $self->_send($from_address, $to_address, $title, $body);
155 $self->app->log->error("Sendmail: fail to send mail. title: $title, to: $to_address");
168 Newslash::Plugin::Sendmail - Newslash sendmail plugin
173 $app->plugin('Newslash::Plugin::Sendmail');
177 L<Newslash::Plugin::Sendmail> implements mail related tasks.
182 L<Mojolicious::Plugin::Sendmail> implements the following helpers.
186 [% helpers.boxes() %]
188 Fetch box contents for current user and returns them.
190 =head2 format_timestamp
192 $c->format_timestamp(user => $user, epoch => $epoch, format => "user")
193 $c->format_timestamp(datetime => $dt, format => "simple")
195 Return formated string.
201 $plugin->register(Mojolicious->new);
203 Register helpers in L<Mojolicious> application.
207 $app->sendmail(to => $user,
208 template => "message/initial_password",
209 params => $render_params);
211 Render template with params and send mail.
215 L<Mojolicious>, L<Mojolicious::Guides>, L<http://mojolicious.org>.