2014-02-26 3 views
0

Email::MIMEs (1.926) walk_partsbody_set을 사용하여 멀티 파트 MIME 전자 메일에서 파트의 본문 텍스트를 변경하려고합니다.Email :: MIME을 사용하여 한 부분의 본문을 변경하는 방법? 또는 : body_set은 누가 작동합니까?

변경 사항이 있지만 메일을 보낼 때 이전/변경되지 않은 메일 텍스트가 전송됩니다. 질문 : 변경 사항을 '활성화'하려면 어떻게해야합니까?

참조 :

use Email::MIME; 

my $raw_message_text = q!Date: Wed, 26 Feb 2014 08:02:39 +0100 
From: Me <[email protected]> 
To: You <[email protected]> 
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의 올바른 사용법이 무엇인지 궁금합니다 ...

+0

그것은 나를 위해 1.910 – Sorin

답변

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); 
+0

그 다음 게으른하지 말고 곧 대답을 업데이 트 :) – fedorqui

1

나는이 문제도 우연히 발견했다.

my @new_parts = $parsed_email->parts; 
$parsed_email->parts_set(\@new_parts); 

최종 as_string 호출하기 전에 위의 내용을 추가, 당신은 좋은 : 결국 내가 모든 것을 원래의 포스터에서 실종 실현, 바로 다음입니다.

+0

사실! 데비안 버전 1.910-1에서는'part_set' 없이도 작동했지만 최소한 1.926-1 (Debian Jessie) 이상이 필요합니다. – xebeche