PHPコーディング

ソケットをオープンしてファイル操作をする(get)

2010年02月08日
今度は、ファイル情報取得やファイル削除よりちょっと複雑なファイルのアップロード(put)やダウンロード(get)などです。

put・getはftpサーバーへログインした接続とは別の接続をオープンして行います。

ローカルへファイルを作成します。
$localfile = "local.txt";
$local = @fopen($localfile, "w");

ファイル転送モードを指定します。
バイナリならば、【I】、アスキーなら【A】です。
@fputs($sock, "TYPE I\r\n");
$result = @fgets($sock, 512);

パッシブモードをオンにします。
@fputs($sock, "PASV\r\n");
$result = @fgets($sock, 512);
成功すれば、【227 Entering Passive Mode (200,0,0,1,100,32)】という具合に、メッセージの後にサーバのIPアドレスとデータ接続用のポート番号が返ってきます。
【200,0,0,1,100,32】がそれです。初めの4つがIPアドレス、後ろの2つがデータ用のポート番号です。
ここから接続用のポート番号を取り出します。

ポート番号は
$data_port = 後ろから2番目の数値 * 256 + 一番後ろの数値
で計算できます。
100 * 256 + 32 = 25632

データ用の接続をオープンします。
$ftp = @fsockopen($ftp_server, $data_port);

リモートのファイルを読み込みます。
$remotefile = "remote.txt";
@fputs($sock, "RETR ".$remotefile."\r\n");

ローカルのファイルへ書き込みます。
$result = @fwrite($local, @fread($ftp, 100000));

念のため、書き込んだファイルサイズを照合したほうがいいでしょう。
ローカルへ書き込んだファイルサイズは、【fwrite】の戻り値でチェックできます。

一方、リモート側のサイズは、
@fputs($sock, "SIZE ".$remotefile."\r\n");
$result = @fgets($sock, 512);
成功すれば、【213】に続き、サイズが戻ってきます。

データ用の接続をクローズします。
@fclose($ftp);

念のため一時バックアップファイルを作成しておき、書き込みに失敗したときに書き戻す機能をつけておけば更に安心でしょう。


ローカルのファイルに追記したい場合、ファイルオープンのとき、モードパラメータで【a】を指定すればOKです。
$local = @fopen($localfile, "a");

PHPコーディング

ソケットをオープンしてファイル操作をする(ファイル削除)

2010年02月07日
ftpサーバーに接続できたら、まずは簡単なファイル削除から。

@fputs($sock, "DELE ".$file."\r\n");
$result = @fgets($sock, 512);

接続に成功していれば、
250 ・・・・・
と返ってきます。

このほかにも、リネーム、ファイルリスト取得、ディレクトリ移動など同じような方法で行えます。

PHPコーディング

ソケットをオープンしてファイル操作をする(ftp接続)

2010年02月06日
PHPでftpを利用するには、ftp関数をインストールすれば一番簡単なのですが、レンタルサーバーの場合、自分でインストールできないことが多々あります。

そういった場合、ソケットをオープンしてファイル操作をしなければいけません。

まずはftpサーバーへの接続です。

$ftp_server = "ftp.domain.xxx";
$ftp_uid = "user_id";
$ftp_pw = "password";
$ftp_port = 21;

$sock = @pfsockopen($ftp_server, $ftp_port);
$result = @fgets($sock, 512);

@fputs($sock, "USER ".$ftp_uid."\r\n");
$result = @fgets($sock, 512);

@fputs($sock, "PASS ".$ftp_pw."\r\n");
$result = @fgets($sock, 512);

接続に成功していれば、
230 ・・・・・
と返ってきます。

健康・食

豚まんがやってきた!!

2010年02月03日
ツール作成依頼があったので、作って差し上げたのですが、その方からなんと!豚まんが届きました!!
ビジネスなんだからそんなにお気遣いいただかなくても・・・ととても恐縮なのですが、とっても嬉しいことです。

不在配達票が入ってたので見てみると、ツール依頼者からなにやら届いているようです。
しかもクール便で。
クール便なんて初めてだ。なんだろう?

玄関で受け取ると、ほのかに匂いが。何の匂い?

外箱を開けてみると箱に入った豚まんが出てきました。
ぶ、ぶたまん!!

豚まんの箱を出してみて腰が抜けました。もう一箱下に入ってます!!!

一体何個あるの??
一箱10個入り、全部で20個。

とても1人では食べ切れん。しかも賞味期限2/8・・・
一箱は父母のところへ持っていくとして、それでも食べ切れるのか?

かなり動揺しつつも、早く冷蔵庫に入れなくてはと思い、冷蔵庫を開けると・・・

入らん!!!
うぉぉぉぉぉぉ

無理やり突っ込んで、父母に電話し、持って行くからと伝えすぐに出発です。

実は父母は明後日から東京に行くので、家にいません。
母は冷凍してみることにしたようです。

夕食の後、デザートとして3人で1つ食べてみました。
おいしい!!これはやみつきになりそう。

あまりにおいしかったので、更に1つ温めて追加をいただきました。

スーパーなどで肉まんを見かけると、買おうかな、と思っていたので、とっても嬉しかったです。

しかしまだたくさんあるなぁ。私も一か八かで冷凍してみようかな。

パソコン・電気製品

プリンタで印刷すると筋が入る

2010年02月01日
写真を撮ってばかりだったので、印刷してみることにしました。写真用の用紙が安く出ていて、その上10倍ポイントが付いたので、買ってみました。

写真印刷はほとんどしたことがありません。プリンタでの印刷は普通紙への通常のカラー印刷や年賀状程度です。

用紙も来て、勢い込んで印刷!!
ところが筋が入ります。インクが目詰まりしているのかとクリーニングしてみても直りません。

何度も何度も印刷してみたのですが、筋が入ります・・・

そしてついにインクがなくなってしまいました。

そして今日、注文したインクが来たので、再チャレンジです。

やっぱり筋が入ります。

カメラ屋さんで印刷頼んだほうが安くて早いか・・・?
疲れ果ててしまいました。

最後にと用紙設定を変えてみました。
購入した用紙に推奨設定として記載してあった用紙設定とは違う設定を選んでみたのです。

すると・・・

筋が消えました!!!

用紙設定のせい??

でも「こうしなさい」と買いてある設定で印刷していたんだけど・・・

わぁぁぁぁぁぁぁぁ!!!

イライラした数日間は一体なんだのか。

PHPコーディング

SMTPソケットをオープンしてメール送信(メールDATA部)

2010年01月27日
前回に続き、今度はDATA部です。いわゆるメールのボディ部です。

ボディ部は、【DATA】コマンドから、【.】のみの行が送信されるまでとなります。


$from_name = mb_encode_mimeheader("差出人名", "EUC", "B");
$from_add = "from@domain.xxx";
$to = "sendto@yyyy.zzz";
$reply-to = "reply@domain.xxx";
$subject = mb_encode_mimeheader("smtpメール送信", "EUC", "B");
$body = "メール本文です。\n";
$body = mb_convert_encoding($body, "ISO-2022-JP", "ASCII,JIS,UTF-8,EUC-JP,SJIS");

$result = @fputs($sock, "DATA\r\n");

$data.= "From: ".$from_name."<".$from_add.">\r\n";
$data.= "To: ".$to."\r\n";
$data.= "Subject: ".$subject."\r\n";
$data.= 'Reply-To:'.$reply-to."\r\n";

$data.= "MIME-version: 1.0\r\n";
$data.= "Content-Type: text/plain; charset=ISO-2022-JP\r\n";
$data.= "Content-Transfer-Encoding: 7bit\r\n";
$data.= "\r\n";
$data.= $body

@fputs($sock, $data."\r\n");
$result = @fgets($sock, 128);

//最後を示す【.】を送信
@fputs($sock, "\r\n.\r\n");
$result = @fgets($sock);

上の例は、内部文字コードは【EUC】、【ISO-2022-JP】のプレーンテキストメールを送信する場合です。

$data.= "MIME-version: 1.0\r\n";
以降を変えることで、もちろんthmlメールや添付ファイル付きのメールを送信することもできます。

この辺りは、【mail】関数で添付なしプレーンテキスト形式メールを送信【mail】関数で添付ありプレーンテキスト形式メールを送信【mail】関数で添付ありhtml形式メールを送信(代替本文なし)【mail】関数で添付なしhtml形式メールを送信(代替本文あり)【mail】関数で添付ありhtml形式メールを送信(代替本文あり)とほぼ同じです。
違うのは、行の最後を表す文字がきっちり【\r\n】になることです。


送信し終えたら、
@fputs($sock, "QUIT\r\n");
@fclose($sock);

PHPコーディング

SMTPソケットをオープンしてメール送信(メールヘッダ)

2010年01月26日
本当は【DIGEST-MD5】もコーディングしたかったのですが、どうしても【DIGEST-MD5】ではどのように認証すればいいのかの記述が見つかりません。英語で書いてある仕様書はあるようなのですが、日本語で書かれているページがみつかりません。

それよりも前に進まないといけないので、とりあえずメール送信に進みます。

$return-path = "return@domain.xxx";
$to = "sendto@yyyy.zzz";
$bcc1 = "bcc1@domain.xxx";
$bcc2 = "bcc2@domain.xxx";

まずはヘッダ部からです。

送信元メールアドレスをサーバーに知らせます。
この送信元はメーラーでは送信者としては表示されません。smtpサーバーによりreturn-pathに設定されます。メーラーに送信者として表示されるのはDATA部のfromです。
@fputs($sock, "MAIL FROM:<".$return-path.">\r\n");

送信先メールアドレスをサーバーに知らせます。
@fputs($sock, "RCPT TO:<".$to.">\r\n");

BCCがある場合はBCC分【RCPT TO】コマンドを送信します。
@fputs($sock, "RCPT TO:<".$bcc1.">\r\n");
@fputs($sock, "RCPT TO:<".$bcc2.">\r\n");

次回はDATA部です。
2010年02月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28
先月
来月
カテゴリ
関連サイト
プロフィール
【ネットネーム】
みゅー

キャラクター by ツカエルサイト


【趣味】
・プログラミング
・写真
・楽器演奏
・手芸
・考えること
・自然科学
・猫と戯れる
・ジグソーパズル

【仕事】
・派遣社員でSE・PGやってます。やっと派遣期間が終了し、ビジネスへ注力しようかと思っています。
・経験言語:VB6、VB.NET、PHP、Perl、JAVA、Oracle、SQLServer、PostgreSQL

RSSフィールド