我有一个PHP脚本,用于分隔电子邮件的标题和文本。我想把它转换成Perl脚本,这样它就可以把用户的电子邮件作为输入文件。以下是PHP脚本:
#!/usr/bin/php
<?php
//debug
#ini_set ("display_errors", "1");
#error_reporting(E_ALL);
//include email parser
require_once('/path/to/class/rfc822_addresses.php');
require_once('/path/to/class/mime_parser.php');
// read email in from stdin
$fd = fopen(ARGV[0], "r");
$email = "";
while (!feof($fd)) {
$email .= fread($fd, 1024);
}
fclose($fd);
//create the email parser class
$mime=new mime_parser_class;
$mime->ignore_syntax_errors = 1;
$parameters=array(
'Data'=>$email,
);
$mime->Decode($parameters, $decoded);
//---------------------- GET EMAIL HEADER INFO -----------------------//
//get the name and email of the sender
$fromName = $decoded[0]['ExtractedAddresses']['from:'][0]['name'];
$fromEmail = $decoded[0]['ExtractedAddresses']['from:'][0]['address'];
//get the name and email of the recipient
$toEmail = $decoded[0]['ExtractedAddresses']['to:'][0]['address'];
$toName = $decoded[0]['ExtractedAddresses']['to:'][0]['name'];
//get the subject
$subject = $decoded[0]['Headers']['subject:'];
$removeChars = array('<','>');
//get the message id
$messageID = str_replace($removeChars,'',$decoded[0]['Headers']['message-id:']);
//get the reply id
$replyToID = str_replace($removeChars,'',$decoded[0]['Headers']['in-reply-to:']);
//---------------------- FIND THE BODY -----------------------//
//get the message body
if(substr($decoded[0]['Headers']['content-type:'],0,strlen('text/plain')) == 'text/plain' && isset($decoded[0]['Body'])){
$body = $decoded[0]['Body'];
} elseif(substr($decoded[0]['Parts'][0]['Headers']['content-type:'],0,strlen('text/plain')) == 'text/plain' && isset($decoded[0]['Parts'][0]['Body'])) {
$body = $decoded[0]['Parts'][0]['Body'];
} elseif(substr($decoded[0]['Parts'][0]['Parts'][0]['Headers']['content-type:'],0,strlen('text/plain')) == 'text/plain' && isset($decoded[0]['Parts'][0]['Parts'][0]['Body'])) {
$body = $decoded[0]['Parts'][0]['Parts'][0]['Body'];
}
//print out our data
echo "
Message ID: $messageID
Reply ID: $replyToID
Subject: $subject
To: $toName $toEmail
From: $fromName $fromEmail
Body: $body
";
//show all the decoded email info
print_r($decoded);
我只需要知道我应该做什么更改才能使它作为Perl脚本运行?
对于几乎所有涉及电子邮件和Perl的内容,您可能需要电子邮件::Simple。我认为这接近于PHP脚本的功能(尽管在PHP中一定有更好的方法)。一旦你创建了电子邮件::简单对象,你只需要询问你想要的部分,而不需要考虑它是如何提取它们的:
use Email::Simple;
my $text = ...;
my $email = Email::Simple->new( $text );
my( $body ) = $email->body;
my( $messageID, $replyToID, $subject, $to, $from ) =
map { scalar $email->header($_) || undef } qw(
message-id
reply-to
subject
to
from
);
print <<"HERE";
Message ID: $messageID
Reply ID: $replyToID
Subject: $subject
To: $to
From: $from
Body: $body
HERE
对于MIME部分,还有电子邮件::MIME。您应该能够从文档中的示例中了解到这一点。我不知道你为什么要打印它,因为它可能是图像、电影、二进制PDF和其他会破坏你的终端的东西。
祝你好运,:)