アーカイブ
-
[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]メール受信プログラムのサンプル
だいぶ固まってきたので、テンプレート化してみた。
メールの受信サーバーから、パイプライン処理等で、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したクラスを見つけてくれない
おぃおぃ!って感じですね

オブジェクト指向プログラミングの観点で考えると、致命的なバグ
5.3では治ってるのかしら。
2010年 1月 8日 | Filed under PHP