[prev] [thread] [next] [lurker] [Date index for 2005/02/06]
Author: simon
Date: 2005-02-06 21:47:47 +0000 (Sun, 06 Feb 2005)
New Revision: 1828
Modified:
trunk/Email-Store/lib/Email/Store/Attachment.pm
Log:
Use MIME::Parser instead of Email::MIME::Attachment::Stripper
Modified: trunk/Email-Store/lib/Email/Store/Attachment.pm
===================================================================
--- trunk/Email-Store/lib/Email/Store/Attachment.pm 2005-02-06 21:46:45 UTC (rev 1827)
+++ trunk/Email-Store/lib/Email/Store/Attachment.pm 2005-02-06 21:47:47 UTC (rev 1828)
@@ -1,31 +1,64 @@
package Email::Store::Attachment;
use base "Email::Store::DBI";
use strict;
-use Email::MIME::Attachment::Stripper; # Until we write our own
-use Email::Abstract;
-use Email::MIME;
+use MIME::Parser;
__PACKAGE__->table("attachment");
__PACKAGE__->columns(All => qw[id mail filename content_type payload ]);
__PACKAGE__->has_a(mail => "Email::Store::Mail");
Email::Store::Mail->has_many(attachments => "Email::Store::Attachment");
+
sub on_store {
my ($class, $mail) = @_;
- my $mm;
- { local $SIG{__WARN__} = sub { "Shut *UP*, Mail::Box!" };
- my $mail_message = Email::Abstract->cast($mail->message, "Email::MIME");
- $mm = Email::MIME::Attachment::Stripper->new( $mail_message );
+
+ my $id = $mail->message_id;
+ my $rfc822 = $mail->message;
+ my $parser = MIME::Parser->new();
+
+ $parser->output_to_core('ALL');
+ $parser->extract_nested_messages(0);
+
+ my $entity = $parser->parse_data($rfc822);
+
+ my @keep;
+ for ($entity->parts) {
+ push (@keep, $_) && next if keep_part($_);
+ my $type = $_->effective_type;
+ my $file = $_->head->recommended_filename() || invent_filename($type);
+ my $payload = $_->body_as_string;
+ $class->create({ mail => $id, payload => $payload, content_type => $type, filename => $file });
}
- $mail->add_to_attachments($_) for $mm->attachments;
- # In case we twiddled it
- $mm->message->header_set("Message-ID", $mail->message_id);
- $mail->message($mm->message->as_string);
+ $entity->parts(\@keep);
+ $entity->make_singlepart;
+
+ $mail->message($entity->as_string);
undef $mail->{simple}; # Invalidate cache
$mail->update;
}
sub on_store_order { 1 }
+my $gname = 0;
+
+sub invent_filename {
+ my ($ct) = @_;
+ require MIME::Types;
+ my $type = MIME::Types->new->type($ct);
+ my $ext = $type && (($type->extensions)[0]);
+ $ext ||= "dat";
+ return "attachment-$$-".$gname++.".$ext";
+}
+
+
+sub keep_part {
+ my $p = shift;
+ my $fn = $_->head->recommended_filename();
+ my $ct = $p->effective_type || 'text/plain';
+ my $dp = $p->head->get('Content-Disposition') || 'inline';
+ return $ct =~ m[text/plain] && $dp =~ /inline/ && (!defined $fn or $fn =~ /^\s*$/);
+}
+
+
1;
=head1 NAME
Generated at 22:00 on 06 Feb 2005 by mariachi 0.52