0

( 1.926 Email::MIMEs)walk_partsbody_set.

変更はありますが、メールを送信すると、古い/変更されていないメール テキストが送信されます。問題は、変更を「有効にする」ために何をしなければならないかということです。

見る:

use Email::MIME;

my $raw_message_text = q!Date: Wed, 26 Feb 2014 08:02:39 +0100
From: Me <me@example.com>
To: You <you@example.com>
Subject: test
MIME-Version: 1.0
Content-Type: multipart/mixed;
 boundary="------------010309070301040606000908"

This is a multi-part message in MIME format.
--------------010309070301040606000908
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit

this is a test

--------------010309070301040606000908
Content-Type: text/plain;
 name="file-to-attach.txt"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="file-to-attach.txt"

dGV4dCBpbnNpZGUgYXR0YWNobWVudAoK
--------------010309070301040606000908--
!;


my $parsed_email = Email::MIME->new($raw_message_text);

$parsed_email->walk_parts(sub {
    my ($part) = @_;
    return if $part->subparts; # multipart
    return unless ($part->content_type =~ /text\/plain.*charset=utf-8/i);
    $part->body_set("new body text");
});

print "As you see the change is there:\n";
$parsed_email->walk_parts(sub {
    my ($part) = @_;
    return if $part->subparts; # multipart
    my $body = $part->body;
    print "Body:$body\n";
});

print "But the email object itself doesn't notice that:\n\n";

print $parsed_email->as_string;

これにより、最初に変更された本文テキストが表示されるので、そこにあることがわかります。しかし、メール全体が表示されると、古い本文テキストが使用されます。を使用してメールを送信するだけでも同じことが起こりますEmail::Sender。だから私はの正しい使い方は何だろうbody_set...

4

2 に答える 2

0

古い古典的な方法を使用する必要がありました.新しいバージョンで何か壊れているかどうかはわかりませんが、このwalk_parts方法ではうまくいきます.コードを何らかの方法で置き換える必要があります.

このソリューションはまったく効率的ではなく、メモリが重いことはわかっていますが、怠け者です。このモデルで別のライブラリを探す必要があると思います。

my @parts = $parsed->subparts;
my @new_parts;
if (@parts) {
  foreach (@parts)
  {
    my $part = $_;
    print $part->content_type."\r\n";    
    if ($part->content_type =~ /text\/plain.*charset=utf-8/i) {
     $part->body_set("new body text");
     push @new_parts, $part;
    } else {
     push @new_parts, $part;
    }
   }
} else {
 print 'single part';#to replace for single mime
}
$parsed->parts_set(\@new_parts);
于 2014-10-07T10:16:22.573 に答える