<?php」タグアーカイブ

PHP mail関数を使って日本語ファイル名を添付する

PHPのmail関数を使って、日本語(マルチバイト)のファイル名を添付するしてメールを送信する方法を紹介します。

方法はいたって簡単でした。

普通に日本語ファイル名をそのまま記述すると、拡張子が外れた状態で受信してしまいます。

そこで、一つおまじないをかけます。

日本語ファイル名に対して、mb_encode_mimeheader()関数を使ってエンコードするだけです。

例:$mail_body .= “Content-Disposition: attachment; filename=\””.mb_encode_mimeheader(“ファイル名”).”.【拡張子】\”;\n”;

もしかしたら、間違っているかもしれませんが、私の環境下では正常に送信・受信できました。

PHP mail関数を使って複数のファイルを添付する

PHPのmail関数を使って、複数のファイルを添付してメールを送信する方法を紹介します。

// メールヘッダ部
$header=”From:”.【メール送信元】.”\n”.
       ”MIME-Version: 1.0\n”.
       ”Content-Type: multipart/mixed;”.
       ” boundary=\”__BOUNDARY__\”\n\n”.
       ”Mime-Version: 1.0\n”.
       ”Content-Type: text/plain; charset=ISO-2022-JP\n”.
       ”Content-Transfer-Encoding: 7bit”;

// メール本文部
$mail_body=”メール本文\n”.
“–__BOUNDARY__\n”;

// 添付ファイル部
$temp_file_body =””;

// 添付ファイル1
$file1_name=”【添付ファイルパス】”;
$file = fopen($file1_name,”r”);
$file1_contents=file_get_contents($file1_name);
fclose($file);
// 添付ファイル2
$file2_name=”【添付ファイルパス】”;
$file = fopen($file2_name,”r”);
$file2_contents=file_get_contents($file2_name);
fclose($file);
// 添付ファイル3
$file3_name=”【添付ファイルパス】”;
$file = fopen($file3_name,”r”);
$file3_contents=file_get_contents($file3_name);
fclose($file);

// 添付ファイル1の記述
$temp_file_body .=”Content-Type: application/octet-stream;name=\”【添付ファイル1名】\”;\n”;
$temp_file_body .= “Content-Disposition: attachment; filename=\”【添付ファイル1名】\”;\n”;
$temp_file_body .= “Content-Transfer-Encoding: base64\n\n”;
$temp_file_body .= chunk_split(base64_encode($file1_contents)) . “\n”;

// 区切り
$temp_file_body .= “–__BOUNDARY__\n”;

// 添付ファイル2の記述
$temp_file_body .=”Content-Type: application/octet-stream;name=\”【添付ファイル1名】\”;\n”;
$temp_file_body .= “Content-Disposition: attachment; filename=\”【添付ファイル1名】\”;\n”;
$temp_file_body .= “Content-Transfer-Encoding: base64\n\n”;
$temp_file_body .= chunk_split(base64_encode($file2_contents)) . “\n”;

// 区切り
$temp_file_body .= “–__BOUNDARY__\n”;

// 添付ファイル3の記述
$temp_file_body .=”Content-Type: application/octet-stream;name=\”【添付ファイル1名】\”;\n”;
$temp_file_body .= “Content-Disposition: attachment; filename=\”【添付ファイル1名】\”;\n”;
$temp_file_body .= “Content-Transfer-Encoding: base64\n\n”;
$temp_file_body .= chunk_split(base64_encode($file3_contents)) . “\n”;

// 結合
$send_mail_body=$header.$mail_body.$temp_file_body;

// 文字エンコードをJISに変換
$send_mail_body=mb_convert_encoding($send_mail_body,’JIS’);

// 文字エンコードをJISに変換
$subject=mb_convert_encoding(“メール件名”,’JIS’);

// メール送信
mail(【メール宛先】,$subject,$send_mail_body,$header);

MySQLバージョンアップについて

とある事情でMySQLを4.0.26から5.1.4にバージョンアップするこになったのですが、問題が山積みでこまっています。
同じMySQLだから、互換性はあるだろうとたかをくくっていいたので、出鼻をくじかれっぱなし。

その中の一つを紹介します。
MySQL4.0.26に格納されいるデータを移行しようとしたのですが、エラーが出てどうしても挿入できないということでした。
エラー内容は、Field ‘%s’ doesn’t have a default value というようなエラーで、ググッてみるとすぐに解答は見つかりました。
ただ、根本的な解決になるかは不明ですが。
my.iniの【sql-mode=”STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION”】という項目をコメントアウトすることで解消。

他にも、MySQL5.1系は日付のチェックをしてくれる親切設計なのですが、既存データには2007-02-29などのありえない日付が格納されている。これも丁寧にエラーとしてはじかれます。
ただ、ユーザ側でMySQLのエラーを表示するわけにもいかないので、事前にPHP側で日付の整合性をとることにして解決。

それにしても、速度的には4.0.26のほうが快速だと個人的には思うのですが、テーブル毎のファイル分割をしたいがために、こんなに手間になるなんて。

とある、メーリングリストに4.0.26、4.1系、5.1系の中でどれか軽快で速度が速いですがという質問をしたのですが、「最新版にしなさい」と言われorz
質問に対しての答えではない。
今後のこともあるので、最新版をチョイスして開発をすることに。

あー、バージョンアップなんてめんどくさいって思うことで、SEやってるんだなって実感を覚えました。

PHPで短縮型タグ<?~?>が使えない

PHPを使っている人で<?php~?>のタグを短縮型の<?~?>で書く方って結構いませんか?

本来は、<?php~?>の型で書くのが推奨されているみたいですが、HTML文中に変数だけを表示したい場合に<?=$hensuu?>で書くことがたまにあります。

開発用サーバAでは使用できたのですが、運用サーバBでは使用できなかったことがありました。

結構単純な確認ミスではあるのですが、原因はphp.iniの設定です。

php.ini内の[short_open_tag]の設定がOFFになっていると使えません。

ここをONにして、Apacheを再起動することで<?~?>の短縮型タグが使えるようになります。