簡體   English   中英

如何使用Email :: MIME更改零件的主體? 或者:bodyset是誰工作的?

[英]How to change the body of one part using Email::MIME? Or: Who does body_set work?

我試圖使用Email::MIMEswalk_partswalk_partsbody_set更改多部分MIME-Email中的一部分的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的正確用法是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."\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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM