如何使用电子邮件::MIME更改一个部分的主体?或者:谁body_set工作



我正在尝试使用 Email::MIMEs (1.926) walk_partsbody_set更改多部分 MIME 电子邮件中部分的正文文本。

更改

是存在的,但是在发送邮件时,正在发送旧的/未更改的邮件文本。问题是:我必须做什么才能"激活"我的更改?

看:

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:$bodyn";
});
print "But the email object itself doesn't notice that:nn";
print $parsed_email->as_string;

这将首先显示更改的正文文本,以便您看到它在那里!但是当显示整个邮件时,将使用旧的正文文本。如果我只是使用 Email::Sender 发送电子邮件,也会发生同样的情况。所以我想知道body_set的正确用法是什么......

我也偶然

发现了这个问题。 最终我意识到原始海报中缺少的只是以下内容:

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."rn";    
    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);

相关内容

  • 没有找到相关文章

最新更新