
【ZendFramework】日本語ファイル名の添付ファイル付きでメール送信する場合は文字数に注意
2017/12/22
タイトルの通り、とあるZend Frameworkを使ったシステムの改修で、メールフォームより添付ファイル有りでメール送信させる際にあるつまらないことでハマったので自戒を込めてメモポストです。
現象と解決策
添付ファイル付きのメール送信すると、添付ファイルが開けない
Zend Frameworkを使ったことはあまりなかったので、ググりながら作成したのですが、サンプルで頂いたエクセルファイル(拡張子は「.xls」でマクロも何も使っていない)が送信できても、開けない、開けても文字化けしているという事態に陥りました。
サンプルは上手くいかないのに、自分で用意したファイルはすんなりと送信できるし、開きもします。
サンプルファイルが壊れているのでは? とも考えましたが、そちらは問題ありませんでした。
ファイルのMIMEタイプの設定がおかしいのか、私が書くルーチンがおかしいのか、色々調べ/試したのですが、全然うまくできません。
ちなみに送信するのは日本語ファイル名のエクセルファイル。
悶々と悩んでいたのですが、同僚に相談すると、「日本語のファイル名は文字数制限があったような・・・」という答えが返ってきました。
そう、答えを書いてしまうと、日本語のファイル名の場合、15文字までは大丈夫なのですが、それを超えてしまうとなぜか正常に送信、ファイルのオープンが出来ないようなのです。
というか自作ファイルは送信できて、サンプルファイルが送れない時点でそのあたりを疑えよな、オレも・・・。
そんな訳で、Zend Frameworkを使って添付ファイルありメールを送信の場合は、ファイル名を良い感じにして送信しましょう。
どうせなのでいつかまた見る日のために送信ルーチンも抜粋して載せておこう。
メール送信部分
[php]
// インスタンス作成
$mailer = new Zend_Mail($encodeTo);
$mailer->addHeader("Mime-Version", "1.0");
$mailer->addHeader("Content-Type", 'text/plain; charset="iso-2022-jp"');
$mailer->addHeader("Content-Transfer-Encoding", "7bit");
$mailer->setFrom($from, $from_name);
$mailer->addTo($to);
// 添付ファイル
if ($fileName != "") {
$fp = fopen($filePath, "r");
$attachFile = fread($fp, filesize($filePath));
fclose($fp);
$attachment = $mailer->createAttachment($attachFile);
$attachment->type = Zend_Mime::TYPE_OCTETSTREAM;
$attachment->disposition = Zend_Mime::DISPOSITION_ATTACHMENT;
$attachment->encoding = Zend_Mime::ENCODING_BASE64;
$attachment->filename = mb_encode_mimeheader(basename($fileName), $encodeTo);
}
// 送信実行
$result = $mailer->send(
new Zend_Mail_Transport_Smtp(
MAIL_SERVER, array(
"auth" => "login",
"username" => MAIL_USER,
"password" => MAIL_PASS,
"port" => MAIL_PORT
)
)
);
[/php]
参考にしたサイト様
http://framework.zend.com/manual/1.7/ja/zend.mail.attachments.html
[tgAmazonItemLookup asin="4774149721" related="1"]