Bivio::UI::Mail::Widget::Message
# Copyright (c) 2001-2011 bivio Software, Inc. All rights reserved. # $Id$ package Bivio::UI::Mail::Widget::Message; use strict; use Bivio::Base 'Widget.ControlBase'; my($_O) = b_use('Mail.Outgoing'); my($_A) = b_use('Mail.Address'); my($_F) = b_use('IO.File'); sub execute { my($self, $req) = @_; return unless my $msg = _render($self, $req); $msg->enqueue_send($req); my($lf); $_F->write($lf, $msg->as_string) if $self->unsafe_render_attr('log_file', $req, \$lf) && $lf; return; } sub initialize { my($self) = @_; $self->initialize_attr('from'); $self->map_invoke(unsafe_initialize_attr => [qw( body cc bcc headers_object recipients subject to )]); return shift->SUPER::initialize(@_); } sub render { my($self, $source, $buffer) = @_; return unless my $msg = _render($self, $source->req); $$buffer .= $msg->as_string; return; } sub _render { my($self, $req) = @_; return undef unless $self->is_control_on($req); $self->map_invoke(obsolete_attr => [qw(headers want_aol_munge)]); my($msg) = $_O->new; my($from) = $self->render_simple_attr('from', $req); $msg->set_header('From', $from); $self->die('from', $req, 'no email in From: ', $from) unless my $email = ($_A->parse($from))[0]; $msg->set_envelope_from($email); my($recips) = []; # This can cause spam problems for users with dynamic IP addresses on blacklists # $msg->set_header('X-Originating-IP', $req->get('client_addr')) # if $req->has_keys('client_addr'); foreach my $header (qw(to cc bcc subject)) { my($value) = ''; if ($self->unsafe_render_attr($header, $req, \$value) && $value) { $msg->set_header(ucfirst($header), $value); push(@$recips, $value) unless $header eq 'subject'; } } $msg->set_recipients( $self->render_simple_attr('recipients', $req) || $recips, $req, ); # Body must be rendered first in case the widget has mail headers. # However, must resolve to widget first, in case widget is dynamically # created by body attribute. my($b) = $self->unsafe_resolve_widget_value($self->get('body'), $req); my($body) = $self->render_value(body => $b, $req); $msg->map_invoke(set_header => $b->mail_headers($req)) if $b && UNIVERSAL::can($b, 'mail_headers'); # Allow headers_object to override any headers my($o) = $self->unsafe_get('headers_object'); $msg->map_invoke(set_header => $o->mail_headers($req)) if $o and $o = $self->unsafe_resolve_widget_value($o, $req); $msg->set_body($$body); $msg->add_missing_headers($req, $email); return $msg; } 1;