aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Youri/Upload/Action/Mail.pm
blob: 92aa87e1b23b0d164a424289bddf3e5bb8e554ff (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# $Id$
package Youri::Upload::Action::Mail;

=head1 NAME

Youri::Upload::Action::Mail - Mail notification

=head1 DESCRIPTION

This action plugin ensures mail notification of new package revisions.

=cut

use warnings;
use strict;
use MIME::Entity;
use Encode qw/from_to/;
use Carp;
use Youri::Package;
use base qw/Youri::Upload::Action/;

sub _init {
    my $self   = shift;
    my %options = (
        mta      => '/usr/sbin/sendmail',
        to       => '',
        from     => '',
        cc       => '',
        prefix   => '',
        encoding => 'quoted-printable',
        charset  => 'iso-8859-1',
        @_
    );

    croak "undefined mail MTA" unless $options{mta};
    croak "invalid mail MTA $options{mta}" unless -x $options{mta};
    croak "undefined to" unless $options{to};
    if ($options{cc}) {
        croak "cc should be an hashref" unless ref $options{cc} eq 'HASH';
    }
    croak "invalid charset $options{charset}"
        unless Encode::resolve_alias($options{charset});

    $self->{_mta}      = $options{mta};
    $self->{_to}       = $options{to};
    $self->{_from}     = $options{from};
    $self->{_cc}       = $options{cc};
    $self->{_prefix}   = $options{prefix};
    $self->{_encoding} = $options{encoding};
    $self->{_charset}  = $options{charset};
}

sub run {
    my ($self, $package, $repository, $target, $define) = @_;
    croak "Not a class method" unless ref $self;

    return unless $package->is_source();

    my $from = $package->get_packager();
    my $section = $repository->_get_section($package, $target, $define);

    # force from adress if defined
    $from =~ s/<.*>/<$self->{_from}>/ if $self->{_from};

    my $subject =
        ($self->{_prefix} ?  '[' . $self->{_prefix} . '] ' : '' ) . ($section ? "$section " : '') .
        $package->get_revision_name();
    my $information = $package->get_information();
    my $last_change = $package->get_last_change();
    my $content =
        $information . "\n" .
        $last_change->[Youri::Package::CHANGE_AUTHOR] . ":\n" .
        join(
            '', map { "- $_\n" } @{$last_change->[Youri::Package::CHANGE_TEXT]}
        );

    # ensure proper codeset conversion
    # for informations coming from package
    my $charset = $repository->get_package_charset();
    from_to($content, $charset, $self->{_charset});
    from_to($subject, $charset, $self->{_charset});

    my $mail = MIME::Entity->build(
        Type     => 'text/plain',
        Charset  => $self->{_charset},
        Encoding => $self->{_encoding},
        From     => $from,
        To       => $self->{_to},
        Subject  => $subject,
        Data     => $content,
    );

    if ($self->{_cc}) {
        my $cc = $self->{_cc}->{$package->get_name()};
        $mail->head()->add('cc', $cc) if $cc;
    }

    if ($self->{_test}) {
        $mail->print(\*STDOUT);
    } else {
        open(MAIL, "| $self->{_mta} -t -oi -oem") or die "Can't open MTA program: $!";
        $mail->print(\*MAIL);
        close MAIL;
    }

}

=head1 COPYRIGHT AND LICENSE

Copyright (C) 2002-2006, YOURI project

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

=cut

1;