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



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

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 "--$boundaryn";
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 "--$boundaryn";
}
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;nn";
print $fh "--$boundaryn";
}
$fh->close or LOGDIE "couldn't send email: $!n"; 

主要缺陷是,在检查$data时,在编写MIME标头后没有添加$data,例如,在缺少最终边界之前添加"print$fh$data"。但还有更多的缺陷:

  • 最后一个MIME部分必须以--$boundary结尾,而不仅仅是以--$border结尾
  • 内容传输编码:8位可能有效,但不适用于所有邮件服务器。最好使用Content-Transfer-Encoding:base64,然后使用MIME::base64对二进制文件进行编码
  • MIME标头末尾的分号是错误的。分号仅用于分隔MIME标头中的各个部分
  • 只有当类型为text/plain时才需要指定字符集,但在其他情况下不应该造成危害。但是,如果您的文本/纯文本部分不是用latin1编码,而是用utf-8或其他编码,则会造成危害

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

最新更新