Perl:将 zip 作为 Base64 编码附件发送会损坏存档

发布于 2024-11-07 13:25:13 字数 656 浏览 4 评论 0原文

我正在使用 perl 组装多部分 MIME 电子邮件,然后在 Windows 环境中使用 sendmail 发送该电子邮件。我知道,这并不理想。

其中一部分是收集文件,将其压缩,然后将 zip 文件编码为 Base64 并将其作为附件写入电子邮件中。我的问题是,每当我发送超过一定大小的文件(我不知道具体大小;在 20 KB 到 2 MB 之间)时,zip 文件最终会在收到时损坏。 (当在 WinRAR 中打开时,它会抱怨“存档意外结束”,并且 CRC 值全部为零,如果这是任何线索的话)。

我怀疑我可能只是将其写入电子邮件,从而导致垃圾或重复内容进入,但我看不到它发生在哪里。这是我用来进行读取/编码/写入的片段;它使用 MIME::Base64,并且显然有一个开放的 Sendmail 句柄。

    open(FILE, "c:\\temp\\$uid.zip") or die "$!";
    while (read(FILE, $buffer, 60*57)) 
    {
        printf SENDMAIL encode_base64($buffer);
    }  

即使我在没有任何缓冲的情况下读入它(我当然应该有足够的内存来容纳微不足道的 2mb 文件),我仍然最终收到一个损坏的 zip 文件。尺寸绝对是一个令人困惑的因素,但我正在努力找出原因或如何补救。

I'm using perl to assemble a multipart-MIME email, which I'm then sending using sendmail, on a Windows environment. Not ideal, I know.

Part of this is collecting files, zipping them up, then encoding the zip file as Base64 and writing it into the email as an attachment. My problem is that whenever I send files over a certain size (I don't know exactly what size that is; somewhere between 20 KB and 2 MB) the zip file ends up corrupted on receipt. (When opened in WinRAR it complains "unexpected end of archive", and the CRC values are all zero-valued, if that's any clue).

I suspect I might just be writing it into the email in such a way that I'm letting garbage or duplication in, but I can't see where it's happening. Here's the snippet I'm using to do the reading/encoding/writing; it's using MIME::Base64, and obviously has an open Sendmail handle.

    open(FILE, "c:\\temp\\$uid.zip") or die "$!";
    while (read(FILE, $buffer, 60*57)) 
    {
        printf SENDMAIL encode_base64($buffer);
    }  

Even when I read it in without any kind of buffering (I should certainly have enough memory for a paltry 2mb file), I still end up receiving a corrupted zip file. Size is definitely the confounding factor, but I'm struggling to figure out why or how to remedy it.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

北座城市 2024-11-14 13:25:13

我认为在 Windows 上您需要 binmode 您的文件

open(FILE, "c:\\temp\\$uid.zip") or die "$!";
binmode FILE;
while (read(FILE, $buffer, 60*57)) 
{
    printf SENDMAIL encode_base64($buffer);
}  

另外,使用 MIME::Lite 用于发送电子邮件。

I think on Windows you need to binmode your file

open(FILE, "c:\\temp\\$uid.zip") or die "$!";
binmode FILE;
while (read(FILE, $buffer, 60*57)) 
{
    printf SENDMAIL encode_base64($buffer);
}  

Also, use MIME::Lite for sending emails.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文