将DOCX编码为通过电子邮件发送

时间:2012-10-11 02:57:48

标签: perl attachment mime docx

我正在编写一个小的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)时,我根本没有任何问题 - 就我所见,一切似乎都在解码OK字节。 当我发送纯文本的docx类型文件时,一切似乎都很好。 但是,当我发送插入图像的docx文件时,文件正在破坏。

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

也忘了提一下,我试图相应地设置内容类型:Content-type:application / vnd.openxmlformats-officedocument.wordprocessingml.document

2 个答案:

答案 0 :(得分: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--

答案 1 :(得分:0)

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

Content-type: application/octet-stream;

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

干杯