[perl] Attachment uit mail in file stoppen

Pagina: 1
Acties:

  • BKJ
  • Registratie: April 2000
  • Laatst online: 08-08 11:07
Ik wil graag uit een verzonden email de attachment halen en die in file stoppen zodat deze gelijk op het web staat. (bv het versturen van een word document naar een speciaal emailadres zodat het document direct op een pagina van een website staat).

Ik heb het volgende al geprobeerd:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/perl

use Mail::POP3Client;

$pop = new Mail::POP3Client( USER     => "bla",
            PASSWORD => "bla",
            HOST     => "localhost" );


$email = $pop->Body(1); 
$email =~ s/\n\s+/ /g;
($rommel,$rest) = split(/Content-Transfer-Encoding: BASE64/, $email, 2);
$rest =~ s/\n\s+/ /g;
($data,$rest) = split(/----_MULTIPART_BOUNDARY_/, $rest, 2);


Oke niet netjes...maar het moest ff snel... :)

Nu stop ik $data in een file...Als ik deze file open is hij corrupt..wat doe ik fout?

[ Voor 9% gewijzigd door BKJ op 16-07-2003 03:24 ]

Kamer huren


Verwijderd

toevallig heb ik nog zulke code liggen. parsed een msg met munpack (zoek ff op google), saved de attachments en dumpt de filename + content type in een tabelletje. $msg is de volledige msg zoals je 'm uit de pop box trekt, $id is de id van de headers in een andere table

code:
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
###
# Get body and write attachs to dir

sub getBody($msg, $id)
{
        my (@bodyPart);
        my ($i, $j, $k, $attachments) = 0;

        $dir = "$HOME/attachments/$id";

        mkdir ($dir);

        open (FH, ">$dir/original.msg") || die ("Can't write to output dir\n");
        print FH $msg;
        close FH;


        open (VAR, "/usr/local/bin/munpack -C $dir -t $dir/original.msg|") ||
                     die ("Can't open munpack\n");

        while (<VAR>)
        {
                $out[$i++] = $_;
        }

        close FH;

        ###
        # Get the right part unlink html body parts
        
        for ($j = 0;
             $j < $i;
             $j++)
        {
                $part = $out[$j];
                chomp($part);

                if ($part  =~ /^part\d*/)
                {
                        chomp($part);

                        if ($part =~ /text\/plain/)
                        {
                                $part =~ s/ .*$//;
                                $bodyPart[$k++] = $part;
                        }
                        else
                        {
                                $part =~ s/ .*$//;
                                unlink "$dir/$part";
                        }
                }
                elsif (!($part =~ /anything to unpack/))
                {       
                        $filename = $part;
                        $filename =~ s/ .*$//;

                        $contentType = $part;
                        $contentType =~ s/^.* //;
                        $contentType =~ s/\(//;
                        $contentType =~ s/\)//;


                        $sb = stat("$dir/$filename") || die;

                        $size = $sb->size;

                        $filename = $dbh->quote($filename);
                
                        $sql = qq{INSERT INTO mailAttachments (messageID, filename,
                                  contentType, filesize)
                                  VALUES($id, $filename, '$contentType', $size)};
                        $dbh->do($sql) || warn ($DBI::errstr);
                        
                        $attachments++;
                }
        }

        ###
        # Read the decoded body back

        undef($content);

        for ($i = 0;
             $i < $k;
             $i++)
        {
                open (MSG, "$dir/$bodyPart[$i]") || warn ("Cant read");

                while (<MSG>)
                {
                        $content .= $_;
                }

                close MSG;

                unlink "$dir/$bodyPart[$i]";
        }

        unlink "$dir/original.msg";

        if ($attachments == 0)
        {
                rmdir $dir;
        }

        return $content;

}

  • BKJ
  • Registratie: April 2000
  • Laatst online: 08-08 11:07
Het lijkt maar niet te lukken....heeft perl niet een standaard module hiervoor? Lijkt me sterk van niet. Dit is toch een standaard probleem?

Munpack installeert om een of andere reden niet. Erg vaag...

Kamer huren


  • BKJ
  • Registratie: April 2000
  • Laatst online: 08-08 11:07
Ik zie, na wat zoekwerk, dat moblog.nl de mogelijheid heeft om een foto naar een email-adres te sturen en vervolgens die foto eruit te halen en op het web te zetten. Dit is hetzelfde principe wat ik wil...Hoe doet hij dat?

Kamer huren


  • BKJ
  • Registratie: April 2000
  • Laatst online: 08-08 11:07
het heeft iets te maken met Mime econding/decoding...alleen snap ik de module niet van perl: Mime::Lite of Mime::Tools...

Ik heb al heel wat geprobeerd met deze modules maar ik kom geen stap verder...Weet iemand een andere manier? Desnoods in PHP ofzow!

Kamer huren


Verwijderd

hmm, die modules heb je inderdaad nodig, boven in je source:

use File::stat;
use MIME::WordDecoder;

je kan ze installen met cpan: perl -MCPAN -e shell
en dan install MIME::WordDecoder

  • BKJ
  • Registratie: April 2000
  • Laatst online: 08-08 11:07
hehe...ik heb hem....:

code:
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/perl

#module die je nodig hebt....
use MIME::Base64;

#$data is data uit email
$decoded = decode_base64($data);

#geeft het resultaat: schrijf naar file of op scherm oid...
print $decoded;

#klaar!


TE makkelijk gewoon....Maar goed..de meest briljante dingen zijn het simpelst! ;)

Kamer huren

Pagina: 1