アーカイブ

  • [PHP]file_get_contents で UserAgent を指定

    PHPのfile_get_contents()関数をそのまま使用すると、
    『PHP/x.x.x』という素直なユーザエージェントが相手に通知されます。

    それが気になる時もあって良いじゃないですか。

    ということで、ユーザエージェントを変更できるようにしてみた。
    (ついでにリファラーも。。。)
    stream_context_create()がポイントになるのだけど、考えてみたらPOST版もさっくり出来そうな気が・・・。
    それはさておき、今回はGET版でのテンプレートです。

    function _file_get_contents(
        $url
      , $referer    = ""
      , $useragent  = "Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7"
    ){
      # User-Agentを指定
      $header = "User-Agent: ".$useragent."\r\n";
      # Refererを指定
      if( strlen($referer) > 0 ){
        $header .= "Referer: ".$referer."\r\n";
      }
      $options = array(
                  "http"=> array(
                          "method" => "GET"
                        , "header" => $header
                      )
                  )
                  ;
      return @file_get_contents( $url, FALSE, stream_context_create($options) );
    }
    

    使い方はこんな感じ。

    echo _file_get_contents(
                "http://www.google.com/"
              , "http://jp.msn.com/"
              , "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"
            );
    

    ちなみに、POSTでのcontextの作成例はこんな感じ。

      $context = stream_context_create(array(
        'http' => array(
          'method'  => 'POST',
          'header'  => sprintf("Authorization: Basic %s\r\n", base64_encode($username.':'.$password)).
                       "Content-type: application/x-www-form-urlencoded\r\n",
          'timeout' => 5,
        ),
      ));
    

    当たり前といえばそうだけど、basic認証でも行けちゃうんですね♪
    すばらしい♪

    2010年 2月 26日 | Filed under PHP
    タグ:
  • [PHP]メール受信プログラムのサンプル

    だいぶ固まってきたので、テンプレート化してみた。
    メールの受信サーバーから、パイプライン処理等で、PHPプログラムを直接起動し、標準入力(STDIN)経由でメールデータを受信するサンプルです。
    細かい制御はしてませんが、ほぼこれでさっくり動くはず。

    require_once 'Mail.php';
    require_once 'Mail/mimeDecode.php';
    #--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--
    # 以下、サブ関数の定義
    #--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--
    # デコード済みMIMEヘッダーよりメールアドレスを抽出する。
    function _extractMailAddress(
        $pDecodedMimeHeader
    ){
      $returnValue = FALSE;
      if(
        eregi(
            "[-!#$%&\'*+\\.=/0-9A-Z^_`a-z{|}~]+@[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+"
          , $pDecodedMimeHeader
          , $regs
          ) ){
        # 行頭・行末の空白削除
        $returnValue = mb_ereg_replace("^[  ]*(.*)[  ]*$", "\\1", $regs[0]);
      }
      return $returnValue;
    }
    # 受信メールをパースします。
    function _parseMail(
       &$pDecodedMimeStructure
     , &$pResultSet
    ){
      #--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--
      # message-idを取得する
      $pResultSet["message-id"] = $pDecodedMimeStructure->headers["message-id"];
      $pResultSet["message-id"] = mb_convert_encoding( $pResultSet["message-id"], mb_internal_encoding(), "auto" );
      $pResultSet["message-id"] = str_replace( array("<", ">"), "", $pResultSet["message-id"] );
      #--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--
      # fromを取得する
      $pResultSet["from"] = $pDecodedMimeStructure->headers["from"];
      $pResultSet["from"] = mb_decode_mimeheader( $pResultSet["from"] );
      $pResultSet["from"] = mb_convert_encoding( $pResultSet["from"], mb_internal_encoding(), "auto" );
      $pResultSet["from"] = _extractMailAddress( $pResultSet["from"] );
      #--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--
      # toを取得する
      $pResultSet["to"] = $pDecodedMimeStructure->headers["to"];
      $pResultSet["to"] = mb_decode_mimeheader( $pResultSet["to"] );
      $pResultSet["to"] = mb_convert_encoding( $pResultSet["to"], mb_internal_encoding(), "auto" );
      $pResultSet["to"] = _extractMailAddress( $pResultSet["to"] );
      #--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--
      # subjectを取得する
      $pResultSet["subject"] = $pDecodedMimeStructure->headers["subject"];
      $pResultSet["subject"] = mb_decode_mimeheader( $pResultSet["subject"] );
      $pResultSet["subject"] = mb_convert_encoding( $pResultSet["subject"], mb_internal_encoding(), "auto" );
      #--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--
      # 日付を取得する
      $pResultSet["date"] = strtotime($pDecodedMimeStructure->headers["date"]);
      #--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--
      # bodyと添付ファイルをパース
      $pResultSet["body"] = "";
      $pResultSet["attachments"] = array();
      switch(strtolower($pDecodedMimeStructure->ctype_primary)){
        # シングルパート(テキストのみ)
        case "text":
          $pResultSet["body"] = $pDecodedMimeStructure->body;
          $pResultSet["body"] = mb_convert_encoding( $pResultSet["body"], mb_internal_encoding(), "auto" );
          break;
        # マルチパート
        case "multipart":
          foreach($pDecodedMimeStructure->parts as $part){
            switch(strtolower($part->ctype_primary)){
              # テキスト
              case "text":
                $pResultSet["body"] = $part->body;
                $pResultSet["body"] = mb_convert_encoding( $pResultSet["body"], mb_internal_encoding(), "auto" );
                break;
              # 画像
              case "image":
                $attachment = array();
                $attachment["mime_type"]  = $part->ctype_primary."/".$part->ctype_secondary;
                $attachment["filename"]   = mb_convert_encoding( $part->ctype_parameters["name"], mb_internal_encoding(), "auto" );
                $attachment["binary"]     = $part->body;
                $pResultSet["attachments"][] = $attachment;
                break;
              # 其れ以外
              default:
                break;
            }
          }
          break;
        # 其れ以外
        default:
          break;
      }
      #--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--
      # bodyに含まれている改行コードの統一
      $pResultSet["body"] = mb_eregi_replace("(\r\n|\r)","\n",$pResultSet["body"]);
      #--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--
      # ここで処理終了
      return TRUE;
    }
    
    #--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--
    # 以下、メイン処理
    #--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--
    # 言語設定、内部エンコーディングを指定する
    mb_language("japanese");
    mb_internal_encoding("eucJP-win");
    mb_regex_encoding(mb_internal_encoding());
    #--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--
    # メールソースを読み込む
    $source = @file_get_contents("php://stdin");
    if( !empty($source) ){
      #--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--
      # メールをMIMEデコードする
      $decoder = new Mail_mimeDecode( $source );
      $params = array();
      $params["include_bodies"] = TRUE;               # ボディを解析する
      $params["decode_bodies"]  = TRUE;               # ボディをコード変換する
      $params["decode_headers"] = TRUE;               # ヘッダをコード変換する
      $structure = $decoder->decode( $params );
      #--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--
      # メールデータの解析
      $maildata = array();
      _parseMail( $structure, $maildata );
    
      print_r($maildata);
    }
    
    2010年 2月 22日 | Filed under PHP
  • [PHP] あるはずのクラスが見つからない

    ec-cube系でのインストールトラブルで分かったことなのだけど、PHP5.2系での環境でクラスの多重継承を行っているプログラムで、あるはずのクラスが見つからないと、実行エラーを出すことがあります。

    5.2系では動作しなくて、5.1系では動作する。こんな現象があったら、おそらくこれ↓が原因だと。

    しかも↓の記事をGoogleなどで検索で、なかなか適したキーワードで見つからなかった。
    ほんとここに行き着くまでに時間が掛かりましたょ。

    PHPプロ!requireするとextendsしたクラスを見つけてくれない

    おぃおぃ!って感じですね350.gif
    オブジェクト指向プログラミングの観点で考えると、致命的なバグ259.gif

    5.3では治ってるのかしら。

    2010年 1月 8日 | Filed under PHP
    タグ: ,
タグ: ‘PHP’ の記事