Philipp Hasenfratz: MIME::Entity

Halihallo Forumer

meld mich mal mit einer ganz "dummen" Frage:

<code>
use strict;
use MIME::Entity;

my @lines = ('Content-Type: text/plain',
 '',
 'hello world');

my $mail = new MIME::Entity( [@lines] );
print $mail->as_string;
</code>

Ergibt mir den Fehler: "you cannot use body() to set the encoded contents"...

he? - Warum nicht? - Das _muss_ doch so gehen, oder?

aus der Doku:
"Note: in either case, the body will not be parsed: merely read!"

und was bringt das, wenn der Body nur gelesen wird???

Also irgendwie habe ich so meine Schwierigkeiten (ich glaub, ich muss mal ein eigenes schreiben ;-)) mit diesem Modul (hab ja schon mal was dazu gepostet...)

Viele Grüsse

Philipp

  1. Halihallo Forumer, nochmals

    meld mich mal mit einer ganz "dummen" Frage:

    und steht noch immer im Raum, aber TIMTOWTDI ;)

    Nach ca. 15 Minuten Fehlersuchen und Testen ist mir die Lust vergangen und hab ein eigenes Modul gebastelt:

    package myMIME;

    use strict;
    use base qw(MIME::Entity);

    sub new {
       my ($class, @params) = @_;

    my $self;
       if (ref($params[0]) eq 'ARRAY') {
          $self = $class->build( @params );
       } else {
          $self = $class->SUPER::new( @params );
       }
       bless ($self, $class);

    return $self;
    }

    sub build {
       my ($class, @params) = @_;
       if (ref($params[0]) eq 'ARRAY') {
          my @lines = @{$params[0]};
          my (@head, @body);
          my ($inHead) = 1;
          foreach (@lines) {
             if ($inHead == 1) {
                push @head, $_;
             } else {
                push @body, $_;
             }
             if (($_ eq '') or ($_ =~ /\015|\012|\015\012/)) { $inHead = 0; }
          }

    my $head = new MIME::Head( [@head] );

    my $head_ref = $head->header_hashref;
          my %head = %{$head_ref};
          my %props = (%head, Data=>[@body]);

    my $entity = MIME::Entity->build( %props );
          return $entity;
       } else {
          return $class->SUPER::build( @_ );
       }
    }

    1;

    dazu:

    use strict;
    use Data::Dumper;
    use myMIME;

    my @lines = ('Content-Type: text/html',
      'From: cto@entryon.ch',
      'To: cto@entryon.ch',
      '',
      'hello world :-)');

    my $mail = myMIME->new( [@lines] );

    print $mail->as_string;

    1:0 für mich ;-)

    Viele Grüsse

    Philipp

    1. sub build {
         my ($class, @params) = @_;
         if (ref($params[0]) eq 'ARRAY') {
            my @lines = @{$params[0]};
            my (@head, @body);
            my ($inHead) = 1;
            foreach (@lines) {
               if ($inHead == 1) {
                  push @head, $_;
               } else {
                  push @body, $_;
               }
               if (($_ eq '') or ($_ =~ /\015|\012|\015\012/)) { $inHead = 0; }

      nix da:

      if (($_ eq '') or ($_ =~ /^\015|\012|\015\012$/)) { $inHead = 0; }

      so, muss es sein!

  2. Halihallo Forumer

    MIME::Parser mit in_core würde das selbe machen (für's Archiv meinetwegen ;))...
    Trotzdem frage ich mich noch immer, warum das nicht gleich durch den Konstruktor von MIME::Entity geschehen kann, wo es doch in der Doku geschrieben steht...
    Naja, man kann nicht alles haben...

    Viele Grüsse

    Philipp

    PS: Das Offensichtliche (Parser!!) merkt man erst, wenn man alles schon programmiert hat :-(((