メインメニュー
Valid XHTML 1.0 Transitional Valid CSS!
投稿者 : root 投稿日時: 2010/01/19 (7849 ヒット)

特定の文字が正しく処理されず、文字列中に「\」が入ってしまう場合があります。
例えば、「ソムリエ」→「ソ\ムリエ」が、これにあたります。
今回は、この文字化けを回避する方法をご紹介します。

magic_quotes_gpc を設定する

回避方法は簡単です。
PHP設定(PHP.ini)で、magic_quotes_gpc を off にするだけです。

    magic_quotes_gpc = off

.htaccessでも設定可能です。

    php_flag magic_quotes_gpc off


magic_quotes_gpcは、文字列中に「'(シングル・クォテーション)」や「"(ダブル・クォテーション)」、「\」を自動でエスケープする機能です。

「ソムリエ」→「ソ\ムリエ」となってしまうのは、「ソ」の2バイト目の文字コードが「\」と一緒なため、magic_quotes_gpcでエスケープされていました。
「ソ」以外にも、「表」「予」「能」「申」などで同様の現象が発生します。


投稿者 : root 投稿日時: 2010/01/11 (59126 ヒット)

携帯サイトでは、ブログの投稿にメールを使用しているサイトが多いようです。
受信メールから、件名、本文、添付ファイル(画像)を取得する方法をご紹介します。

受信メールを解析する

PEARのMail_mimeDecodeを使用して、受信メールを解析します。
受信メールからのPHPスクリプトの呼び出しは「さくらインターネットで、メール自動返信をする」を参照してください。

  1. #!/usr/local/bin/php -q
  2. <?php
  3. //PEARのパスを設定
  4. $path = '/home/{さくらアカウント名}/pear/PEAR/';
  5. set_include_path(get_include_path() . PATH_SEPARATOR . $path);
  6. require_once 'Mail/mimeDecode.php';

  7. //受信メールから読み込み
  8. $params['include_bodies'] = true;
  9. $params['decode_bodies'] = true;
  10. $params['decode_headers'] = true;
  11. $params['input'] = file_get_contents("php://stdin");
  12. $params['crlf'] = "\r\n";
  13. if (!$params['input']) {
  14.     // 読み込み失敗
  15.     exit();
  16. }
  17. $structure = Mail_mimeDecode::decode($params);

  18. //送信者のメールアドレスを抽出
  19. $mail = $structure->headers['from'];
  20. $mail = addslashes($mail);
  21. $mail = str_replace('"','',$mail);
  22. $mail = preg_replace('/(^.*<|>$)/', '', $mail);

  23. // 件名を取得
  24. $subject = $structure->headers['subject'];

  25. // 本文、添付ファイル(画像)を抽出
  26. switch (strtolower($structure->ctype_primary)) {
  27.     case "text":
  28.         // シングルパート(テキストのみ)
  29.         $body = $structure->body;
  30.         break;
  31.     case "multipart":
  32.         // マルチパート(画像付き)
  33.         foreach ($structure->parts as $part) {
  34.             switch (strtolower($part->ctype_primary)) {
  35.                 case "text":
  36.                     $body = $part->body;
  37.                     break;
  38.                 case "image":
  39.                     // 画像の拡張子を取得する
  40.                     $type = strtolower($part->ctype_secondary);
  41.                     // 添付ファイル保存
  42.                     $tmpName = '{保存ディレクトリ}/image.' . $type;
  43.                     if ($fp = fopen($tmpName, "w")) {
  44.                         $length = strlen($part->body);
  45.                         fwrite($fp, $part->body, $length);
  46.                         fclose($fp);
  47.                     }
  48.                     break;
  49.             }
  50.         }
  51.         break;
  52.     default:
  53.         $body = "";
  54. }

  55. // 取得した情報を、データベースへ保存等の処理を行う


投稿者 : root 投稿日時: 2010/01/11 (39292 ヒット)

サイトでの会員登録などで、空メールを受信すると自動で登録用URLなどを返信したい場合があるかと思います。
さくらインターネットで、自動メール返信するスクリプトを使用する方法をご紹介します。

.mailfilterでPHPへメールを転送する

以下の場所に.mailfilterファイルを作成します。
/home/{さくらアカウント名}/MailBox/{メールアカウント名}/.mailfilter

  1. to "| /usr/local/bin/php -q /home/{さくらアカウント名}/www/reply.php"
  2. exit
これで、受信メールをreply.phpで受け取ります。

サーバーに受信メールを残したい場合は、先頭の「to」を「cc」に変えます。
  1. cc "| /usr/local/bin/php -q /home/{さくらアカウント名}/www/reply.php"
  2. exit

受信メールを解析し、自動返信メールを送信する

PEARのMail_mimeDecodeを使用して、受信メールを解析します。

  1. #!/usr/local/bin/php -q
  2. <?php
  3. //PEARのパスを設定
  4. $path = '/home/{さくらアカウント名}/pear/PEAR/';
  5. set_include_path(get_include_path() . PATH_SEPARATOR . $path);
  6. require_once 'Mail/mimeDecode.php';

  7. //受信メールから読み込み
  8. $params['include_bodies'] = true;
  9. $params['decode_bodies'] = true;
  10. $params['decode_headers'] = true;
  11. $params['input'] = file_get_contents("php://stdin");
  12. $params['crlf'] = "\r\n";
  13. if (!$params['input']) {
  14.     // 読み込み失敗
  15.     exit();
  16. }
  17. $structure = Mail_mimeDecode::decode($params);

  18. //送信者のメールアドレスを抽出
  19. $mail = $structure->headers['from'];
  20. $mail = addslashes($mail);
  21. $mail = str_replace('"','',$mail);
  22. $mail = preg_replace('/(^.*<|>$)/', '', $mail);

  23. // メール作成
  24. $from = {メールアドレス};
  25. $head = "From: $from\n";
  26. $subject = 'メール件名';
  27. $body = 'メール本文';

  28. // メール送信
  29. mb_language('japanese');
  30. mb_internal_encoding('EUC-JP');
  31. mb_send_mail($mail, $subject, $body, $head, $from);
  32. ?>


投稿者 : root 投稿日時: 2010/01/09 (57297 ヒット)

DoCoMoで個体識別情報を取得する場合、「utn」属性を付与する方法とURLに「guid=ON」パラメータを付与する方法があります。
「utn」属性は送信する度に確認画面が出てしまいますので、「guid=ON」パラメータを付与して「iモードID」で識別する方法が主流になっています。
ここでは、この「guid=ON」パラメータをURLに自動付与する方法をご紹介します。

output_add_rewrite_var関数を使う

HTMLの前にoutput_add_rewrite_var関数を追加します。

  1. <?php
  2. if (DoCoMo端末の判定) {
  3.     output_add_rewrite_var('guid', 'ON');
  4. }
  5. ?>
  6. <a href="index.php">トップページ</a>
  7. <form action="index.php">
  8. </form>
出力結果:
  1. <a href="index.php?guid=ON">トップページ</a>
  2. <form action="index.php">
  3. <input type="hidden" name="guid" value="ON" />
  4. </form>
一見、問題無さそうに見えますが、「guid」をhiddenで渡すと無視されます。
そこで、formタグのactionに「guid」を付与する方法です。

url_rewriter.tagsに「form=action」を定義する

php.iniまたはini_set関数でurl_rewriter.tagsを設定します。

  • php.iniで設定する場合
    url_rewriter.tags="a=href,area=href,frame=src,form=action,fieldset="
  • ini_set関数で設定する場合
    ini_set("url_rewriter.tags", "a=href,area=href,frame=src,form=action,fieldset=");
出力結果:
  1. <a href="index.php?guid=ON">トップページ</a>
  2. <form action="index.php?guid=ON">
  3. <input type="hidden" name="guid" value="ON" />
  4. </form>