Как изменить тело одной части, используя Email::MIME? Или: кто работает body_set?
Я пытаюсь изменить основной текст части внутри MIME-Email из нескольких частей, используя Email::MIMEs
(1,926) walk_parts
а также body_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
является...
2 ответа
Я тоже наткнулся на эту проблему. В конце концов я понял, что все, чего не хватает в оригинальном постере, это просто следующее:
my @new_parts = $parsed_email->parts;
$parsed_email->parts_set( \@new_parts );
добавьте выше перед финальным вызовом as_string, и все хорошо.
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);