Thread Perl Script PGP Email entschlüsseln und weiterleiten (18 answers)
Opened by Chris at 2017-02-17 21:26

Gast Chris
 2017-02-18 11:27
#186115 #186115
Hallo nochmal,

langsam kommt die Ernüchterung :(
Habe das ganze Script ein wenig abgeändert und zum Versand das Perl Modul genommen.
Wie auch zuvor funktioniert das ganze prima, solange ich es in der Shell aufrufe. Allerdings wenn ich das über eine Procmail-Rule mache, erhalte eine Mail mit richtigem Absender, Empfänger und Betreff (wie im Script angegeben) allerdings ist der Inhalt leer. Daher dachte ich mir ich "verschiebe"
Zeile 20
Code: (dl )
#mail_it( $$unencrypted_body );
nach Zeile 120 und übernehme so den entschlüsselten body
Code: (dl )
mail_it( $$decoded_body_sref );
Hat auch nicht geklappt. Wieder eine Mail wie oben beschrieben. Da ich allerdings keinerlei Fehlermeldungen bekomme, bin ich gerade ziemlich ratlos. Ist das jetzt ein Problem mit dem Perl Script oder eins von Procmail?
Das ganze schaut jetzt so aus:
Code (perl): (dl )
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#!/usr/bin/perl -w

use Mail::GPG;
use MIME::Parser;
use Email::Sender::Simple qw(sendmail);
use Email::Simple;
use Email::Simple::Creator;
use strict;
#no strict 'refs';
my $passphrase = 'XXX';
my @lines;
my $tmpdir = '/tmp';

########
# Main #
########

my $stdin = &stdin();
my $unencrypted_body = &parse_email($stdin);
#mail_it( $$unencrypted_body );
if ($unencrypted_body) {

    foreach ($$unencrypted_body) {
        chomp $_;
        push( @lines, $_ );
        print "$_\n"; ## Debugging
    }
}


###############
# Subroutines #
###############

sub stdin {
    #Process stdin
    my $stdin = '';

   while(<ARGV>){
   $stdin .= $_;
   }

   if ($stdin eq '') {
        die ("Error: stdin appears to have no content.");
   }

    return $stdin;
}

sub parse_email {

    my $stdin = shift @_;
    my $decoded_body_sref;
    my $entity;

    #Create new MIME Parser obj
    my $parser = MIME::Parser->new;

    #Configure MIME Parser
    $parser->decode_bodies(0);
    $parser->output_under($tmpdir);

    #Parse the email from stdin
    eval { $entity = $parser->parse_data($stdin) };

    # See Mail::GPG for reasoning
    # http://search.cpan.org/~jred/Mail-GPG-1.0.7/lib/Mail/GPG.pm#METHODS_FOR_PARSING,_DECRYPTION_AND_VERIFICATION
    if ( $entity->effective_type ne 'multipart/signed' and
         $entity->effective_type ne 'multipart/encrypted' ) {

            #delete tmp files
            $parser->filer->purge;

            #enable docode_bodies
            $parser->decode_bodies(1);

            #Parse the email from stdin
            eval { $entity = $parser->parse_data($stdin) };

            #decrypt
            eval { $decoded_body_sref = &decode($entity) };
            if ($@) {
                warn ("Error: $@");
            }

            #delete tmp files
            $parser->filer->purge;
    }
    else {

        #decrypt
        eval { $decoded_body_sref = &decode($entity) };
        if ($@) {
            warn ("Error $@");
        }

        #delete tmp files
        $parser->filer->purge;

    }

    return $decoded_body_sref;
}

sub decode {

    my $entity = shift @_;

    #Create new Mail GPG obj
    my $mg = Mail::GPG->new;

    #Decrypt the email from stdin
    my ($decrypted_entity, $result) = $mg->decrypt (
        entity     => $entity,
        passphrase => $passphrase
    );

    #Get a reference to the decoded message body
    my $decoded_body_sref = $result->get_gpg_stdout;
mail_it( $$decoded_body_sref );
    return $decoded_body_sref;
}
# ***NEW*** own subroutine for mail sending
sub mail_it {
    my $mailtext = shift;
    my $to      = 'chris';
    my $from    = 'root';
    my $subject = 'Test Email';

    open( my $mailer, "|-", "/usr/sbin/sendmail -t" )
      or die "Could not open sendmail: $!";

    # one print to print it all
    print $mailer <<"END_OF_MESSAGE";
To: $to
From: $from
Subject: $subject

$mailtext

END_OF_MESSAGE

    close( $mailer ) or die "Close sendmail failed: $!";

    print "Email Sent Successfully\n";
}


Procmail Rule (entsprechend angepasst):
Code: (dl )
1
2
3
4
    # Example procmailrc rule
:0
* ^To: <username>@<domain>.<tld>
| /home/<username>/bin/decrypt.pl

Last edited: 2017-02-18 12:18:06 +0100 (CET)

View full thread Perl Script PGP Email entschlüsseln und weiterleiten