1 package Newslash::Plugin::Sendmail;
2 use Mojo::Base 'Mojolicious::Plugin';
5 use Email::Sender::Simple;
6 use Email::Sender::Transport::SMTP;
14 my ($self, $app, $conf) = @_;
16 $app->helper(sendmail => sub { shift; $self->sendmail(@_); });
18 # default config values
19 my $cnf = $app->config->{Sendmail} ||= {};
21 $cnf->{default_from} ||= 'admin@example.com';
22 $cnf->{smtp_host} ||= 'example.com';
23 $cnf->{smtp_port} ||= '25';
27 my ($self, $text) = @_;
28 my $encoded = encode('MIME-Header-ISO_2022_JP', $text);
34 my ($self, $from, $to, $title, $body) = @_;
36 # create header and body
38 From => $self->_encode_header($from),
39 To => $self->_encode_header($to),
40 Subject => $self->_encode_header($title),
41 'Content-Type' => 'text/plain; charset=ISO-2022-JP',
42 'Content-Transfer-Encoding' => '7bit',
45 my $encoded_body = encode('iso-2022-jp', $body);
48 my $email = Email::Simple->create(header => $header,
49 body => $encoded_body);
52 my $smtp_host = $self->app->config->{Sendmail}->{smtp_host};
53 my $smtp_port = $self->app->config->{Sendmail}->{smtp_port};
54 my $smtp_timeout = $self->app->config->{Sendmail}->{smtp_timeout};
55 my $transport = Email::Sender::Transport::SMTP->new({ host => $smtp_host,
57 timeout => $smtp_timeout,
61 my $rs = eval { Email::Sender::Simple->send($email, {transport => $transport}) };
63 my ($msg, $code) = ($@->message, $@->code);
64 $self->app->log->error("Sendmail: sendmail error. $msg ($code)");
71 my ($self, $template_name, $vars, $opts) = @_;
74 my $renderer = $self->app->tt2renderer;
75 my $rs = $renderer->render($template_name, $vars);
77 my ($title, $body) = split(/\n/, $rs, 2);
79 return ($title, $body);
86 if (!defined $args->{to}) {
87 $self->app->log->error("Sendmail: no recipient given!");
95 if (ref($args->{to}) eq "HASH") {
96 $recipient_user = $args->{to};
98 elsif (ref($args->{to}) eq "ARRAY") {
101 elsif (ref($args->{to}) eq "") {
102 if ($args->{to} =~ m/^\d+$/) {
104 $recipient_user = $self->app->model('users')->select(uid => $args->{to});
107 my $encoded_to = encode('MIME-Header-ISO_2022_JP', $args->{to});
108 if (Email::Valid->address($encoded_to)) {
109 $to_address = $args->{to};
114 if ($recipient_user) {
115 $to_address = $recipient_user->{realemail};
119 $self->app->log->error("Sendmail: invalid recipient: $args->{to}");
125 my $from_address = $args->{from} || $self->app->config->{Sendmail}->{default_from};
127 # create title and body
128 my $title = $args->{title};
129 my $body = $args->{body};
131 if ($args->{template}) {
133 ($title, $body) = eval { $self->_render($args->{template},
136 $self->app->log->error("Sendmail: template error: $@");
142 $self->app->log->error("Sendmail: no title given. to: $to_address");
147 $self->app->log->error("Sendmail: no body given. title: $title, to: $to_address");
151 # if render only mode, return items.
152 if ($args->{render_only}) {
153 return wantarray ? ($from_address, $to_address, $title, $body) : { from => $from_address,
160 my $rs = $self->_send($from_address, $to_address, $title, $body);
163 $self->app->log->error("Sendmail: fail to send mail. title: $title, to: $to_address");
176 Newslash::Plugin::Sendmail - Newslash sendmail plugin
181 $app->plugin('Newslash::Plugin::Sendmail');
185 L<Newslash::Plugin::Sendmail> implements mail related tasks.
190 L<Mojolicious::Plugin::Sendmail> implements the following helpers.
194 [% helpers.boxes() %]
196 Fetch box contents for current user and returns them.
198 =head2 format_timestamp
200 $c->format_timestamp(user => $user, epoch => $epoch, format => "user")
201 $c->format_timestamp(datetime => $dt, format => "simple")
203 Return formated string.
209 $plugin->register(Mojolicious->new);
211 Register helpers in L<Mojolicious> application.
215 $app->sendmail(to => $user,
216 template => "message/initial_password",
217 params => $render_params);
219 Render template with params and send mail.
223 L<Mojolicious>, L<Mojolicious::Guides>, L<http://mojolicious.org>.