1

我正在编写一个小的 Perl 应用程序来在我工作的内部发送电子邮件,但是我遇到了附件问题。现在,我可以听到你们所有人都在尖叫“使用 MIME::Lite”,但这并不是那么容易——管理规则告诉我,我无法使用 cpan 中的任何东西......

无论如何,我正在使用 MIME::Base64 对我发送的任何附件进行编码。我将 Net::SMTP 用于电子邮件方面。

编码是这样完成的(直接从 Perldoc 页面出来):

my $encoded = "";
use MIME::Base64 qw(encode_base64);
open (FILE, "7857084216_9816ae9bec_b.jpg") or die "$!\n";
while (read(FILE, $buf, 60*57)) {
$encoded .= encode_base64($buf);
}

相关的 Net::SMTP 代码如下:

use Net::SMTP;
$smtp = Net::SMTP->new("mailserver",
                Hello => 'somedomain.com.au',
                Timeout => 60,
                Debug => 0,
                );
$smtp->mail(<services\@somedomain.com.au>);
$smtp->to(<me\@somedomain.com.au>);
$smtp->cc(<another\@somedomain.com.au>);
$smtp->data();
$smtp->datasend("Subject: testing 123\n");
$smtp->datasend("To: me\@somedomain.com.au\n");
$smtp->datasend("CC: another\@somedomain.com.au\n");
$smtp->datasend("MIME-Version: 1.0\n");
$smtp->datasend("Content-type: multipart/mixed;\n\tboundary=\"$boundary\"\n");
$smtp->datasend("--$boundary\n");
$smtp->datasend("Content-type: text/html; charset=utf-8\n");
$smtp->datasend("\n");
$smtp->datasend("<p> Test Email!</p>\n");
$smtp->datasend("\n");
$smtp->datasend("--$boundary\n");
$smtp->datasend("Content-type: image/jpeg; name=\"7857084216_9816ae9bec_b.jpg\"\n");
$smtp->datasend("Content-ID: \n");
$smtp->datasend("Content-Disposition: attachment; filename=\"7857084216_9816ae9bec_b.jpg\"\n");
$smtp->datasend("Content-transfer-encoding: base64\n");
$smtp->datasend("\n");
$smtp->datasend("$encoded");
$smtp->datasend("\n");
$smtp->datasend("--$boundary--\n");
$smtp->dataend;
$smtp->quit;

此刻,我将这些电子邮件发送给自己并使用 Outlook 2010 阅读它们发送图像(例如 jpegs)时,我根本没有任何问题 - 据我所知,一切似乎都在逐字节解码. 当我发送纯文本的 docx 类型文件时,一切似乎都很好。但是,当我发送插入图像的 docx 文件时,文件已损坏。

不是邮件发送和附件方面的专家,我有点茫然。我应该如何编码 docx 文件以附加到电子邮件?任何帮助,将不胜感激!

还忘了提及,我已尝试相应地设置内容类型: 内容类型:application/vnd.openxmlformats-officedocument.wordprocessingml.document

4

2 回答 2

1

我以前见过这种情况,通常归结为不正确的 mime 类型或 mime 结构。您提到您尝试添加 mime 类型,因此这可能表明 mime 结构可能有点偏离。我已经在 xslx 和 csv 文件中看到了这一点。由于解码器假定文本,因此 CSV 会出现,但如果您没有正确的二进制数据 Mime,它将始终尝试转换为 ascii。我在 xslx vs docx 中意识到这一点,但我认为同样的原则也适用。

这是我正在生成的示例电子邮件的片段(使用 Mime:Lite),但可能会有所帮助。

    From: me@example.com
To: example@example.com
Subject: Example
Content-Transfer-Encoding: binary
Content-Type: multipart/mixed; boundary="_----------=_13433203262384120"


--_----------=_13433203262384120
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html
Content-Disposition: inline

<body>Hello,<br>
<p>EMAIL BODY</p>
<p>Thanks,<br>&nbsp;&nbsp;Blah</body>

--_----------=_13433203262384120
Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; name="sample.xlsx"
Content-Disposition: attachment; filename="sample.xlsx"
Content-Transfer-Encoding: base64

UEsDBBQAAAAIAAFk+kDm/EEvVgEAACQFAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbMVUS28CIRC+
N+l/IFybXdRD0zSuHvo4tia1P4DC6BJZIAxa/fed3a32EesjmvQCgfleQ8j0h8vKsgVENN4VvJt3
OAOnvDZuWvDX8WN2wxkm6bS03kHBV4B8OLi86I9XAZAR22HBy5TCrRCoSqgk5j6Ao8rEx0omOsap
CFLN5BREr9O5Fsq7BC5lqdbgg/49TOTcJvawpOs2SQSLnN21wNqr4DIEa5RMVBcLp3+5ZJ8OOTEb
DJYm4BUBOBNbLZrSnw5r4jM9TjQa2EjG9CQrggnt1Sj6gIII+W6ZLUH9ZGIUkMa8IkoOdSINOgsk
CTEZ+Eq901z5CMe7r5+pZh9qubQC08oCntwshghSYwmQKpu3ovusE30qaNfuyQEamX2O7z7O3ryf
....  <Snipped>
ZRQyppbEwDToT079O3NfFSgofVlmcbvM34PqkQQdCmrLiWYxleokviz25OPYvpRw/s64avTwn+uh
SSg4ctedMMaTkj47g3IXX1BLAQIUAxQAAAAIAAFk+kDm/EEvVgEAACQFAAATAAAAAAAAAAEAAAC2
gQAAAABbQ29udGVudF9UeXBlc10ueG1sUEsBAhQDFAAAAAgAAWT6QPWzn3yRAQAAQAMAABAAAAAA
AAAAAQAAALaBhwEAAGRvY1Byb3BzL2FwcC54bWxQSwECFAMUAAAACAABZPpAkg6xSFoBAAC2AgAA
EQAAAAAAAAABAAAAtoFGAwAAZG9jUHJvcHMvY29yZS54bWxQSwECFAMUAAAACAABZPpAyfySzFpy
BAAcqRgAFAAAAAAAAAABAAAAtoHPBAAAeGwvc2hhcmVkU3RyaW5ncy54bWxQSwECFAMUAAAACAAB
ZPpARQtWMQgCAABaBQAADQAAAAAAAAABAAAAtoFbdwQAeGwvc3R5bGVzLnhtbFBLAQIUAxQAAAAI
AABk+kCVKtbcsAEAAFgDAAAPAAAAAAAAAAEAAAC2gY55BAB4bC93b3JrYm9vay54bWxQSwECFAMU
AAAACAABZPpA8XOrpLUFAABVGwAAEwAAAAAAAAABAAAAtoFrewQAeGwvdGhlbWUvdGhlbWUxLnht
bFBLAQIUAxQAAAAIAO1j+kD+7E73UA8AAM1zAAAYAAAAAAAAAAEAAAC2gVGBBAB4bC93b3Jrc2hl
ZXRzL3NoZWV0MS54bWxQSwECFAMUAAAACAAAZPpA7/olcLO/MgAHxsABGAAAAAAAAAABAAAAtoHX
kAQAeGwvd29ya3NoZWV0cy9zaGVldDIueG1sUEsBAhQDFAAAAAgAAWT6QCFo34b0AAAATgMAABoA
AAAAAAAAAQAAALaBwFA3AHhsL19yZWxzL3dvcmtib29rLnhtbC5yZWxzUEsBAhQDFAAAAAgAAWT6
QIB6g4TsAAAAUQIAAAsAAAAAAAAAAQAAALaB7FE3AF9yZWxzLy5yZWxzUEsFBgAAAAALAAsAxgIA
AAFTNwAAAA==


--_----------=_13433203262384120--
于 2012-10-11T18:42:39.457 回答
0

我发现了这个问题,而且“内容类型”似乎确实有所作为。根据我的发现,我将所有包含 Base64 编码数据的 Content-type 调用替换为以下内容:

Content-type: application/octet-stream;

这似乎直接发送了它,Outlook 2010 和 2003 都没有问题。我已经针对二进制文件、纯文本等进行了测试,在我当前的环境中似乎一切正常。

干杯

于 2012-10-11T22:09:04.693 回答