1 package SL::Mailer::SMTP;
5 use parent qw(Rose::Object);
7 use Rose::Object::MakeMethods::Generic
9 scalar => [ qw(myconfig mailer form status extended_status) ]
12 my %security_config = (
13 none => { require_module => 'Net::SMTP', package => 'Net::SMTP', port => 25 },
14 tls => { require_module => 'Net::SSLGlue::SMTP', package => 'Net::SMTP', port => 25 },
15 ssl => { require_module => 'Net::SMTP::SSL', package => 'Net::SMTP::SSL', port => 465 },
24 extended_status => 'no send attempt made',
27 my $cfg = $::lx_office_conf{mail_delivery} || {};
28 $self->{security} = exists $security_config{lc $cfg->{security}} ? lc $cfg->{security} : 'none';
29 my $sec_cfg = $security_config{ $self->{security} };
31 eval "require $sec_cfg->{require_module}" or do {
32 $self->extended_status("$@");
33 die $self->extended_status;
36 $self->{smtp} = $sec_cfg->{package}->new($cfg->{host} || 'localhost', Port => $cfg->{port} || $sec_cfg->{port});
38 $self->extended_status('SMTP connection could not be initialized');
39 die $self->extended_status;
42 if ($self->{security} eq 'tls') {
43 $self->{smtp}->starttls(SSL_verify_mode => 0) or do {
44 $self->extended_status("$@");
45 die $self->extended_status;
49 # Backwards compatibility: older Versions used 'user' instead of the
50 # intended 'login'. Support both.
51 my $login = $cfg->{login} || $cfg->{user};
53 return 1 unless $login;
55 if (!$self->{smtp}->auth($login, $cfg->{password})) {
56 $self->extended_status('SMTP authentication failed');
57 die $self->extended_status;
62 my ($self, %params) = @_;
64 $self->{smtp}->mail($params{from}) or do { $self->extended_status($self->{smtp}->message); die $self->extended_status; };
65 $self->{smtp}->recipient(@{ $params{to} }) or do { $self->extended_status($self->{smtp}->message); die $self->extended_status; };
66 $self->{smtp}->data or do { $self->extended_status($self->{smtp}->message); die $self->extended_status; };
72 # SMTP requires at most 1000 characters per line. Each line must be
73 # terminated with <CRLF>, meaning \r\n in Perl.
75 # First, normalize the string by removing all \r in order to fix
76 # possible wrong combinations like \n\r.
77 my $str = join '', @_;
80 # Now remove the very last newline so that we don't create a
81 # superfluous empty line at the very end.
84 # Split the string on newlines keeping trailing empty parts. This is
85 # requires so that input like "Content-Disposition: ..... \n\n" is
86 # treated correctly. That's also why we had to remove the very last
87 # \n in the prior step.
88 my @lines = split /\n/, $str, -1;
90 # Send each line terminating it with \r\n.
91 $self->{smtp}->datasend("$_\r\n") for @lines;
97 my $ok = $self->{smtp}->dataend;
98 $self->extended_status($self->{smtp}->message);
99 $self->status('ok') if $ok;
103 delete $self->{smtp};
106 sub keep_from_header {
107 my ($self, $item) = @_;
108 return lc($item) eq 'bcc';