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を使用して読んでいます。画像(jpegなど)を送信するときは、まったく問題はありません。私が見る限り、すべてがOKバイトごとにデコードされているようです。 。プレーンテキストだけでdocxタイプのファイルを送信しているときは、すべて問題ないようです。しかし、画像が挿入されたdocxファイルを送信すると、ファイルが破損します。

メールの送信と添付の専門家ではないので、少し途方に暮れています。電子メールに添付するためにdocxファイルをどのようにエンコードする必要がありますか?どんな助けでもいただければ幸いです!

また、言及するのを忘れて、それに応じてコンテンツタイプを設定しようとしました:コンテンツタイプ:application / vnd.openxmlformats-officedocument.wordprocessingml.document

4

2 に答える 2

1

私はこれが以前に起こったことを見たことがあり、通常は間違ったmimeタイプまたはmime構造に帰着します。mimeタイプを追加しようとしたとのことですが、これはmime構造が少しずれている可能性があることを示している可能性があります。私はこれをxslxファイルとcsvファイルで見ました。デコーダーはテキストを想定しているため、CSVが検出されますが、バイナリデータに適切なMimeがない場合は、常にASCIIに変換しようとします。これはxslxと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

私はこの問題を発見しましたが、「content-type」が違いを生むように見えます。私が見つけたものによると、Base64でエンコードされたデータを含むすべてのContent-type呼び出しを次のように置き換えました。

Content-type: application/octet-stream;

これは、Outlook 2010と2003のどちらにも問題がなく、問題なく送信されたようです。バイナリファイル、プレーンテキストなどに対してテストしましたが、現在の環境ではすべて問題なく動作しているようです。

乾杯

于 2012-10-11T22:09:04.693 に答える