我使用MIME :: Parse解析多部分MIME。我想拥有完整的部分,不仅仅是头部或身体。到目前为止,我看到它将CRLF更改为LF。这是一个问题。
use MIME::Parser;
my $parser = new MIME::Parser ();
$parser->decode_headers (0);
$parser->decode_bodies (0);
$parser->output_to_core (1);
open (F, "myfile.txt");
my $mime = $parser->parse (\*F);
close (F);
my $mp = $mime->parts (0); // get the 1st part
my $ct = $mp->as_string ();
my $h = unpack ("H*", $ct);
$h = join (' ', $h =~ /(..)/g);
print "\n$h\n"; // inspect and compare with myfile.txt in a hex-editor
如果我使用十六进制编辑器查看myfile.txt行 - 分隔符是CRLF(0x0d 0x0a)。 如果我检查打印输出,则它们会更改为LF(0x0a)。
为什么?我怎样才能获得原始内容?
谢谢! 克里斯
答案 0 :(得分:-1)
您的问题是缺少有关您解码数据的重要信息。但我会假设它们要么具有明确给定的内容类型text/plain
,要么隐式具有此内容类型(即没有给出内容类型标题)。 text/plain
表示ASCII数据(除非定义了charset
标头),并且将使用特定于提取数据的环境的行结束:这意味着Windows上的CRLF和Linux,MacOS和其他UNIX上的LF或类UNIX系统。邮件内部的原始行是什么并不重要,所有重要的是目标环境中使用的行结尾。
如果你真的想让原始行结束,那么内容应该被声明为二进制(即内容类型application/octet-stream
或类似,但绝对没有text/*
)并且数据需要被编码使用适合二进制数据的内容传输编码,即base64。