SQLの窓 イラストAC フリー素材

2013年11月03日

Pear のインストール

posted by at 2013-11-03 03:07 | PHP+Pear | このブログの読者になる | 更新情報をチェックする

2009年12月21日

PHP:Pearを使って動的にファイルセットを作ってzipでダウンロードさせる方法

通常は、Pear で必要なファイルを配置するのが面倒だと思うので、
必要なものだけをまとめてサンプル付きでダウンロードできるようにしました。


PHP : Pear 同梱ですぐ使える、動的に ZIP 書庫をダウンロードさせるサンプル


必要な Pear ライブラリは、 PHP License 3.0 と LGPL でした。
サンプルコードでそのまま殆どの場面で利用できると思います。

<?
// *********************************************************
// Pear ライブリを使用する為に、include パスを設定し、
// 必要なライブラリを読み込む
// *********************************************************
set_include_path( ".".PATH_SEPARATOR."../pear" );
require_once "File/Archive.php";

// 日本語処理の為に内部エンコードを明示設定
mb_language( "ja" );
mb_internal_encoding("EUC-JP");

// Pear ライブラリを含める
$files = array(
	 "../pear"
);

// ダウンロード用アーカイブを決定
$zip = File_Archive::toArchive(
	"zip_sample.zip",
	File_Archive::toOutput()
);

// このファイル自身を追加する
$files[] = "./zip_download.php";


// shift_jis に変換したファイルを追加する
// 為のエントリを追加
$zip->newFile("zip_download_sjis.php");

// 元データを取得
$txt = file_get_contents( "./zip_download.php" );
// shift_jis に変換
$txt = mb_convert_encoding (
	$txt,
	"shift_jis",
	"euc-jp" );
// エントリに書き込む
$zip->writeData( $txt ); 

// zip 書庫として出力
File_Archive::extract( 
	$files, $zip
); 

?>


ファイル化はリンク先にあるドキュメントのリンクから情報を比較的容易に取得できると思います。





posted by at 2009-12-21 16:28 | PHP+Pear | このブログの読者になる | 更新情報をチェックする

2008年07月05日

【PHP】Pearでメール送信する為の全ての情報



実際に使う事になったので、以前に作ってあったサンプルコードに
いろいろ情報を追加して、実際に実装できるようにしたつもりです。


けっこういろいろありましたです。

まず、Pear を最新にアップデート すると・・・

Net_SMTP の最新は、2008-04-24 で結構最近。
古いコードと 行単位で比べる とかなり変わってました。
そして、以前より問題のあった部分が使えるようになってたり。

実装サンプルを作るのに、関数化して CC と BCC に対応して
land.to にのっけてテストしたら、Pear の一部で 警告でたり。
( /dev/urandom 等のアクセス時の権限の問題らしい )

で、警告でてるけど、動いてるからコメントに。


CC やら BCC で持ってるアドレスに送信してテストして、
ヘッダー情報の確認。特に問題は無かったのだけれど、

何故か、gmail で「迷惑メール」扱い。

たぶん、宛先の日本語部分のせいのような気もするのだけれど、
そんなもん調べてられないので無視。
ただ、その時に、メーラを主張するヘッダーを追加。

で、たぶん Pear のどのファイルが必要なのか解らない人も
居るだろうと、最低限を lzh に固めてリンクを貼りました。


それと、このテストで解ったのだけれど、
件名に長い日本語と半角の混じったメールをあちらこちらのメーラで送ったら、
結構適当な対応している事が解りました。

改行が入って無いのなんてかわいいほうで、 
ひどいのになると、送れなかったり(笑)

どれも、けっこうマトモなメーラ・WEBメーラなんですけどね・・・








posted by at 2008-07-05 19:03 | PHP+Pear | このブログの読者になる | 更新情報をチェックする

2008年03月04日

PEARでグラフ画像と内部事情



http://winofsql.jp/php/codeget/php_getter.php?id=7634


コードパッケージを整備するにあたって、内部コードにいろいろありました。

そもそも、円グラフの凡例の出ないバグの対処方法をひさびさに調査して
みつけて、(http://pear.php.net/bugs/bug.php?id=8055)
あらためてコードを整備。

すると、以下のような内容も。

Canvas.php で ブラウザのキャッシュを無効にする為に HTTP ヘッダ
をいくつか設定しています

header('Expires: Tue, 2 Jul 1974 17:41:00 GMT'); // Date in the past
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); // always modified
header('Cache-Control: no-cache, must-revalidate'); // HTTP/1.1
header('Pragma: no-cache');

3つめの設定では、IE6で 右クリックで画像保存しようとすると、
BMP で「無題」となりました。必ずしも良い設定ではありません。

後、実際の実行に支障無いようですが、
HTTP ヘッダの記述がおかしい。

'...; filename = \"'. basename($_SERVER['PHP_SELF'], '.php') . '.png\"'

と、シングルクオートの中で、エスケープ書いてまして、
そのまま HTTP ヘッダに送られます。
( PNG.php と JPG.php )



ま、小ネタですけど。





posted by at 2008-03-04 11:22 | PHP+Pear | このブログの読者になる | 更新情報をチェックする

2006年12月01日

PEARのMailパッケージによるメール送信

ほんとに pear.bat でインストールするとろくな事が無いです。今回、偶然以前に動くコードで試していたので事なきを得ましたが、でなきゃ、こんな原因解るわけ無いです

code: 535, response: 5.7.0 authentication failed
▼ その事情と実行可能なコードサンプル
<?php
set_include_path( "C:\php\PEAR" );
include('Mail.php');
include('Mail/mime.php');

# 内部コード指定
mb_language( "ja" );
mb_internal_encoding("UTF-8");

# メール送信環境
$mailServer = "localhost";
$mailPort = 25;
$mailFrom = "lightbox@localhost";
$mailTo = "lightbox@localhost";
$mailUser = "lightbox";
$mailAuth = true;	// true 認証有り、false 認証無し
$mailPass = "password";

print "<PRE>";

# **********************************************************
# 本文( テキスト )
# 30 文字程度で改行を入れて下さい
# **********************************************************
$text = mb_convert_encoding("日本語\n日本語", "JIS", "SJIS" );

# **********************************************************
# 本文( HTML )
# **********************************************************
$html = "<html><body><pre>$text</pre></body></html>";

# **********************************************************
# 添付ファイル( 必要ならば、$file にセットする )
# **********************************************************
#$file = './Book1.xls';
$crlf = "\n";

# **********************************************************
# FROM と TO を設定
# **********************************************************
$from    = mb_convert_encoding( "送信者", "JIS", "SJIS" );
$from    = "=?ISO-2022-JP?B?" . base64_encode($from) . "?= <$mailFrom>";
$to      = mb_convert_encoding( "宛先", "JIS", "SJIS" );
$to      = "=?ISO-2022-JP?B?" . base64_encode($to) . "?= <$mailTo>";

# **********************************************************
# ● 長い件名の処理
# **********************************************************
$subject = "改行する必要のある長い日本語を";
$subject .= "件名にセットしてテストしてみましょう。";
$subject .= "件名に「AあBいC」のように半角が交互に含まれると";
$subject .= "エンコード後の長さが増加するので、";
$subject .= "改行長は短めに設定しています。";

// SJIS として文字数を取得
$len = mb_strlen( $subject, "SJIS" );
// 10 文字以下ならそのまま処理
if ( $len <= 10 ) {
	$subject = mb_convert_encoding( $subject, "JIS", "SJIS" );
	// mime encode
	$sub_str = "=?ISO-2022-JP?B?" . base64_encode($subject) . "?=";
}
// 10 文字以上なら分解して処理
else {
	// 先頭から10文字取得
	$sub_str = mb_substr( $subject, 0, 10, "SJIS" );
	// JIS に変更
	$sub_str = mb_convert_encoding( $sub_str, "JIS", "SJIS" );
	// mime encode
	$sub_str = "=?ISO-2022-JP?B?" . base64_encode($sub_str) . "?=";
	// 次の処理の為に処理済みの文字列を削除
	$sub_work = mb_substr(
		$subject, 10, mb_strlen( $subject,"SJIS" ) - 10, "SJIS" );
	// 処理文字列が存在する間続ける
	while( 1 ) {
		// 改行とスペース
		$sub_str .= "\r\n ";
		// まだ 10 文字より長い場合
		if ( mb_strlen( $sub_work, "SJIS" ) > 10 ) {
			// 先頭から10文字取得
			$sub_left = mb_substr( $sub_work, 0, 10, "SJIS" );
			// JIS に変更
			$sub_left = mb_convert_encoding( $sub_left, "JIS", "SJIS" );
			// mime encode して追加
			$sub_str .=
				"=?ISO-2022-JP?B?" . 
				base64_encode($sub_left) . 
				"?=";
			// 次の処理の為に処理済みの文字列を削除
			$sub_work = mb_substr(
				$sub_work,
				10,
				mb_strlen( $sub_work, "SJIS" ) - 10,
				"SJIS"
			);
		}
		// 10 文字以内の場合
		else {
			// JIS に変更
			$sub_work = mb_convert_encoding( $sub_work, "JIS", "SJIS" );
			// mime encode
			$sub_str .=
				"=?ISO-2022-JP?B?" . 
				base64_encode($sub_work) . 
				"?=";
			// 終了
			break;
		}
	}
}
// 出来上がった文字列を件名として使用する
$subject = $sub_str;

# **********************************************************
# ● 準備された情報を元に、SMTP に渡す MIME 情報を
#    作成する
# **********************************************************
$mime = new Mail_mime($crlf);

# 本文( テキスト )
$mime->setTXTBody($text);
# 本文( HTML )
$mime->setHTMLBody($html);
# 添付ファイル
if ( $file != "" ) {
	$mime->addAttachment($file, 'application/octet-stream');
}
# パーツ別のキャラクタセット指定
$param = 
	array(
		'text_charset' => 'ISO-2022-JP',
		'html_charset' => 'ISO-2022-JP'
	);
# **********************************************************
# ヘッダと本文の作成
# **********************************************************
// ヘッダ情報の整理
$hdrs = 
	array(
		'Date' => date("r"),
		'From'    => $from,
		'To'    => $to,
		'Subject' => $subject
	);

$body = $mime->get( $param );
$hdrs = $mime->headers($hdrs);

# **********************************************************
# SMTP 環境の情報
# **********************************************************
if ( $mailAuth ) {
	$smtp = 
		array(
			'host' => $mailServer,
			'port' => $mailPort,
			'auth' => TRUE,
			'username' => $mailUser,
			'password' => $mailPass,
		);
}
else {
	# 以下は認証なし
	$smtp = 
		array(
			'host' => $mailServer,
			'port' => $mailPort,
			'auth' => FALSE,
			'username' => '',
			'password' => '',
		);
}

# メールオブジェクトを作成
$mail =& Mail::factory('smtp', $smtp );

# **********************************************************
# ● メール送信( ヘッダと本文 を引数として渡す )
# **********************************************************
$ret = $mail->send($mailTo, $hdrs, $body);
if ( $ret !== true ) {
	print $ret->getMessage() . "<br>";
}

print "</PRE>";
?>
Done



posted by at 2006-12-01 17:10 | PHP+Pear | このブログの読者になる | 更新情報をチェックする

PEARで簡易メール受信

モジュールでは、IMAP、POP3 および NNTP 関数 というのがありますが、レンタルサーバー側でインストールされる事は無いと思われるので、PEAR で実装する事になると思います。

▼ サンプルコード
<?php
# PEAR
require_once('Net/POP3.php');

# 漢字変換用( 内部コード設定 );
mb_language( "ja" );
mb_internal_encoding("EUC-JP");

print "<PRE>";

# インスタンス作成
$pop3 = new Net_POP3();

# 接続( さくらインターネットの場合 )
$ret = $pop3->connect ("ユーザid.sakura.ne.jp", 110 );
if ( $ret ) {
	print "接続OK\n";
}

# ログイン ( APOP )
$ret = $pop3->login( "メールid@ユーザid.sakura.ne.jp", "パスワード", true );
if ( $ret ) {
	print "ログインOK\n";
}

# メッセージの総件数
$ret = $pop3->numMsg();
print "$ret : メッセージ件数\n";

# メッセージの総サイズ
$ret = $pop3->getSize();
print "$ret : メールボックスのサイズ\n";

# メッセージの一覧
$ret = $pop3->getListing();
$i = 1;
if ( $ret !== false ) {
	foreach( $ret as $Key => $Value ) {

		# msg_id、size、uidl の表示
		print "$Key : $Value\n";
		foreach( $Value as $Key2 => $Value2 ) {
			print "\t$Key2 : $Value2\n";
		}

		# ヘッダ情報の表示
		$ret2 = $pop3->getParsedHeaders( $i );
		foreach( $ret2 as $Key2 => $Value2 ) {
			print "\t\t$Key2 : $Value2\n";
		}

		# 本文の表示
		$ret2 = $pop3->getBody( $i );
		print $ret2 . "\n";
		$i++;
	}
}

# 先頭メッセージの本文を Shift_JIS に変換して表示
$ret = $pop3->getBody( 1 );
print mb_convert_encoding( $ret, "SJIS", "JIS" );

# 接続解除
$pop3->disconnect();

print "</PRE>";
?>



posted by at 2006-12-01 13:48 | PHP+Pear | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します