如何使用Mail :: send将文件与body一起附加?

时间:2013-12-27 13:14:28

标签: perl email

这是我用谷歌搜索后从不同来源尝试的代码。我无法在邮件中添加正文或缺少附件。我不能同时拥有它们。

my $boundary = '==' . time . '==';
my $msg = new Mail::Send;
$msg->to($to);
$msg->add('From',$from);
$msg->subject($subject);
$msg->add('Content-Type', qq(multipart/mixed; boundary="$boundary";));

my $fh = $msg->open;
print $fh "--$boundary\n";

if(defined($body)) {

    print $fh "Content-Type: text/plain; charset=iso-8859-1;\n";
    print $fh "Content-Transfer-Encoding: quoted-printable;\n";
    print $fh "This is the body content : ".$body;
    print $fh $body;
    print $fh "--$boundary\n";
}
if(defined($filename) && defined($type) && defined($data)) {

    print $fh "Content-Disposition: attachment; filename=$filename;\n";
    print $fh "Content-Type: $type; name=$filename; charset=iso-8859-1;\n";
    print $fh "Content-Transfer-Encoding: 8bit;\n\n";
    print $fh "--$boundary\n";
}
    $fh->close or LOGDIE "couldn't send email: $!\n"; 

1 个答案:

答案 0 :(得分:1)

主要的缺陷是,当您检查$ data时,在编写MIME-Header后不会添加$ data,例如在最终边界丢失之前的“打印$ fh $ data”。但是还有更多的缺陷:

  • 最后一个MIME部分必须以 - $ boundary--结尾,而不仅仅是 - $ boundary
  • Content-Transfer-Encoding:8位可能有效,但不适用于所有邮件服务器。最好使用Content-Transfer-Encoding:base64,然后使用MIME :: Base64对二进制文件进行编码
  • MIME-Headers末尾的分号是错误的。分号仅用于分隔MIME标头内的部分。
  • 仅当type为text / plain时才需要charset的规范,但在其他情况下不应该有害。但是如果你的text / plain部分没有用latin1编码,而是用utf-8或其他编码编码,那将会有害。

除非你真的知道MIME是如何工作的(似乎并非如此),否则使用MIME :: Lite或MIME :: Tools来处理所有这些细节要容易得多。