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);

PHP マルチスレッド処理(並行処理)を実行する方法

PHPで複数の処理を実行したい場合、どうしても逐次処理となってしまいます。
例えば、5秒かかる処理が10個あった場合、5×10=50秒必要です。
それを、マルチスレッド(並列処理)で行えば5秒ですみます。
その方法を紹介します。情報元はこちらです。

PHPでマルチスレッド(バックグラウンド処理)を実現する方法 – EC studio 技術ブログ

続きを読む

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側の処理に変更したのですがどうもPHP側にすると遅いという状況でした。
この遅くなるという部分の処理ですが、チェック用の配列Arrayの中にデータベースから取り出した値が存在するかチェックを行ってTRUEならば、チェック用の配列に値を格納。これを繰り返すという内容なのですが、このチェック用の配列が1000件近くになると極端に遅くなるんです。

では、どうすればいいか。
方法としては、二つあります。

  • 1つは、この配列がある程度、例えば100件程度になれば別の配列に格納する。ただ、この方法だと配列の全件チェックはできないのでNG.
  • 2つ目は、配列ではなくデータベースに格納する。
    この方法だと、処理件数が少ないと遅くなるのですが、処理件数が多くなると全件チェックはSELECT文一つで完結するので、早くなる。
    データベースはMySQLなので、ストレージエンジンはHEAPを選択しようと思ったのですが、HEAPはメモリ上にデータを格納する性質上、MySQL終了時にクリアされる。
    しかし、クリアされるのはレコードのみで、テーブルは残ってしまう。
    将来的に、件数が肥大してメモリ圧迫も困るので結局MyISAMを選択しました。

さてさて、結果はまず150秒ほどかかっていた処理が30秒ほどになりました。
そして、タイムアウトになっていた処理も200秒程度で処理が完了します。

今回のことで、データが多く大きくなると格納する変数、配列も考慮しておかないといけないのだなと実感しました。
たぶん、Cを経験されている方はメモリの管理も含めて開発しているのでしょうから、今回のようなトラブルは開発時点で分かっていることなんでしょう。
まだまだ、未熟だと実感しましたOTL

「自宅で業務メール」は残業? 時間外手当をめぐり論争

「自宅で業務メール」は残業? 時間外手当をめぐり論争という記事が目にとまったので少し触れてみました。
あくまで、個人的な意見です。

労働時間の問題は、便利になった現代に切っては切り離せない問題だと思います。
24時間営業しているコンビニ、365日休み無く営業しているショッピングセンター。
銀行のオンラインシステムもそれぞれの店舗に導入されてきています。
そのシステムを支える技術者は、サポート体制を整えるべく待機するということも。
しかし、サポート体制を整えるもネットワークが普及するにしたがって、安価になります。
安価になってしまうと、システム会社・サポート会社側は少ない人員での運用を求められ
必然的に、労働時間の超過となってしまいます。

しかし、ネットワークの普及に伴って会社以外の場所でも仕事ができてしまう。これは便利になっているようで
社員を拘束しているという状況に陥っているのだと思います。
携帯電話が普及した今日、取引先から時間・休日関係なくコールがあります。
会社から携帯電話が支給されていない場合は、個人の携帯での対応が求められます。
これでは、プライベートなんてあってないようなものです。
私もそういう生活を、5,6年続けています。

以前に「残業ゼロの仕事力」という本のことを書きましたが、実際のところ職種によっては可能ではあるが
不可能な職種もあると思います。
本では、不可能ならばそれを問題として提議して解決に向かわないといけないとありましたが、
解決するには、会社ならびに取引先(顧客)の協力が不可欠になってくると思います。
社内での会議だけでは、とてもじゃないですが解決できない問題だと思います。

私も技術者のはしくれですが、ITの発展はとても喜ばしいことだとは思っています。
ITの発展によって、私の仕事が成り立っているわけですから。

しかしながら、最近は「昔のころが、不便であったがよかった」とも思えます。
正月にはどこのお店も休みで、家族で過ごすのが当たり前だったあのころが。
過去を振り返っても、今という現実は変わらないのですが、文明の発展の行き着く先、それは
人類の繁栄を妨げるものかもしれませんね。

javascript 複数のチェックボックスに一括でチェックを入力する

複数のチェックボックスに対して、一括でチェックを入力するチェックボックス


//一括チェックボックス
<input type=”checkbox” name=”allchk_0″ value=”1″ onclick=”allChk0(this.form.allchk_0)” >
//個別チェックボックス
<input type=”checkbox” name=”check1[1]” value=”1″ >
<input type=”checkbox” name=”check1[2]” value=”1″ >
<input type=”checkbox” name=”check1[3]” value=”1″ >
<input type=”checkbox” name=”check1[4]” value=”1″ >
<input type=”checkbox” name=”check1[5]” value=”1″ >
<input type=”checkbox” name=”check1[6]” value=”1″ >
<input type=”checkbox” name=”check1[7]” value=”1″ >
<input type=”checkbox” name=”check1[8]” value=”1″ >
<input type=”checkbox” name=”check1[9]” value=”1″ >
<input type=”checkbox” name=”check1[10]” value=”1″ >
<input type=”checkbox” name=”check1[11]” value=”1″ >
<input type=”checkbox” name=”check1[12]” value=”1″ >
<input type=”checkbox” name=”check1[13]” value=”1″ >
<input type=”checkbox” name=”check1[14]” value=”1″ >
<input type=”checkbox” name=”check1[15]” value=”1″ >
//一括チェック入力script
<script type=”text/javascript”><!–
function allChk0( Obj ) {
flg = Obj.checked;
document.form.elements[‘check1[1]’].checked = flg;
document.form.elements[‘check1[2]’].checked = flg;
document.form.elements[‘check1[3]’].checked = flg;
document.form.elements[‘check1[4]’].checked = flg;
document.form.elements[‘check1[5]’].checked = flg;
document.form.elements[‘check1[6]’].checked = flg;
document.form.elements[‘check1[7]’].checked = flg;
document.form.elements[‘check1[8]’].checked = flg;
document.form.elements[‘check1[9]’].checked = flg;
document.form.elements[‘check1[10]’].checked = flg;
document.form.elements[‘check1[11]’].checked = flg;
document.form.elements[‘check1[12]’].checked = flg;
document.form.elements[‘check1[13]’].checked = flg;
document.form.elements[‘check1[14]’].checked = flg;
document.form.elements[‘check1[15]’].checked = flg;
}
// –></script>

PHPと連携して一括チェックボックスを使う。

<?php
    //配列を定義
    $str_arr = array(1=>’aaa’,2=>’bbb’,3=>’ccc’,4=’ddd’,5=>’eee’);
?>
//一括チェックボックス
<input type=”checkbox” name=”allchk” value=”1″ onclick=”allChk(this.form.allchk)” />
<?php
//個別チェックボックスを配列より生成
foreach($str_arr as $key => $elemet){
    if($elemnt){
        ?>
        <input type=”checkbox” name=”check1[<?=key?>]” value=”1″ />
        <?php
    }
}
?>
<script type=”text/javascript”><!–
    function allChk<?=$index?>( Obj ) {
        flg = Obj.checked;
        <?php
        foreach($str_arr as $key => $element){
            if($element){
                ?>
                document.form.elements[‘check1[<?=$key?>]’].checked = flg; // ON・OFFを切り替え
                <?php
            }
        }
        ?>
    }
// –></script>

2chスレ「ブラック会社に勤めてるんだが、もう俺は限界かもしれない」が書籍に

「2ちゃんねる」上で昨年末、話題になったスレッド「ブラック会社に勤めてるんだが、もう俺は限界かもしれない」が、同名の書籍として発売されるそうです。
ソース
私も内容はよく知らないので、早速過去スレまとめを見てきました。

いや、ひどいですね。でも、実際のところ現場はこれに近いところも多いのではないでしょうか?
こんな本が一般に発売されるとますますプログラマの人材不足に拍車がかかりそうです。

実際にシステム会社に勤めたことがないので、私の意見もあくまで客観的なものですが、プログラマやシステムエンジニアはまさに馬車馬に近いものがあるのではないかと思います。
企画・提案に始まり、設計、構築、そしてサポートまで。まるで「おはようからおやすみまで」ライオンのようです。
そんな案件を2、3個抱えると、当然休みもままならないですし、毎日深夜に帰宅ということも日常茶飯事です。

でも、プログラマになる人は意外に他の職種に移りたがらないのではないかと。

とにもかくにも、世のプログラマになろうとしている人、今一度職種を考えてみて下さい。
そして、プログラマとしてがんばっているみなさん。
あなたの日々のがんばりでIT業界は支えられています。これからも、がんばってください。



スタイルシートで入力モードを切り替える

アンケートやメールの入力フォームを作ることもあるのですが、入力モードを切り替えているサイトをよく見かけるので方法を調べてみました。
意外に簡単な方法で、実現できることが分かったので記載しておきます。

最初は、javascriptで制限と思っていたのですがスタイルシートで簡単にできます。
INPUT タグに【style=”ime-mode:active;”】と追記するだけです。

<input type=”text” name=”text” value=”text” style=”ime-mode:active;” />

こうすると、IMEがONとなり通常の日本語入力となります。
ちなみに、【style=”ime-mode:disable;”】とするとIMEがOFFとなり半角英数字のみの入力となります。
ただ、この方法だとIE5以上であることと、MS-IMEであることが条件となります。

エックスサーバー おすすめレンタルサーバー

PHPやMySQLでwebサイトを構築されている人のほとんどは自宅サーバかレンタルサーバを借りていると思います。
私も使っているオススメなレンタルサーバーを紹介します。
エックスサーバー

エックスサーバーは、低価格ながら容量的には比較的大きいと思います。
専用サーバーと比べると劣りますが、共用サーバーとしては十分な容量だと思います。
そして、一番魅力的なのは、「マルチドメイン」と「メールアドレス無制限」という点ですね。
個人で使う場合はメールアドレス無制限っていらなかも・・。
マルチドメインは、複数ドメインを持つって人には便利だと思います。
通常だったら、1契約につき1ドメインしか設定できないところがほとんどですが、エックスサーバーは1契約につきドメインをいくつも設定できます。
あなたのお持ちの独自ドメイン、全て利用できます!

特に本格的にアフェリエイトをしている人は、複数ドメインを所有して複数のブログ・ホームページを持っているので、マルチドメイン構成は便利ではないかと思います。

信頼性ですが、正直以前のエックスサーバーは結構不安定だったりしていましたが、最近はすっかり安定稼動してくれています。
某レンタルサーバー会社は稼動率99.98%ということをいましたが、結構不安定でした。

今、レンタルサーバーを契約されている人は、見直ししてみてはどうでしょうか?




その他のレンタルサーバーレンタルサーバーの紹介ページに掲載しています。