SQLの窓

2017年09月02日


fake sendmail for windows を使って、PHP でごく普通に( mb_send_mail で )メール送信 : Gmail なので ssl(465)

PHP : mb_send_mail を使用した自家用メール送信 API では、レンタルサーバー上利用する事を想定していましたが、fake sendmail for windows を使用すると、windows 上で同じ事ができます。

fake sendmail は、XAMP に同梱されているらしい情報を多くインターネット上で得る事ができますが、何故か単独で Windows で利用する上では全く無名(日本)に近いソフトウェアのようです。

メールサーバは、フリーメールで可能で、簡単な設定で利用できます。以下のサンプルは、Gmail で動作確認しました。( 但し、Gmail では、Gmail 側で安全性の低いアプリの許可を『有効』にする必要があります )

▼ 手順

ダウンロード

配布元より、sendmail.zip をダウンロードして、解凍します。


sendmail.exe の動作テスト

まず、sendmail.ini をエディタで開いて、四つのエントリを指定します
▼ Gmail の場合
smtp_server=smtp.gmail.com
smtp_port=465
auth_username=ユーザ@gmail.com
auth_password=パスワード
▼ さくらインターネットの場合
smtp_server=初期ドメイン
smtp_port=587
auth_username=ユーザ@初期ドメイン
auth_password=パスワード
※ smtp_ssl=auto となっており、デフォルトで ssl で実行され、使え無い場合は TLS を使おうとします さらに、この中に、send_test.bat を作成して以下のように記述します( 作者のオリジナルのテスト方法です )
@ECHO OFF
REM send email from command line via SMTP with sendmail

ECHO From: ユーザ@gmail.com > %TEMP%\temp.mail
ECHO To: ユーザ@宛先ドメイン >> %TEMP%\temp.mail
ECHO Subject: this is a test >> %TEMP%\temp.mail
ECHO.>> %TEMP%\temp.mail
ECHO testing. >> %TEMP%\temp.mail
ECHO blah blah.. >> %TEMP%\temp.mail
ECHO. >> %TEMP%\temp.mail
ECHO blah. >> %TEMP%\temp.mail

sendmail -t < %TEMP%\temp.mail

REM DEL %TEMP%\temp.mail

これをコマンドプロンプトより実行して、メールが届く事を確認します。最後の行を REM でコメントにしているのは、送信で使われたテキストファイルを残す為です。sendmail.exe に -t が指定されているのは、標準入力より送信データを取得する為のもので、PHP で実行する場合特に必要はありませんでした。

temp.mail の内容
From: ユーザ@gmail.com 
To: ユーザ@送り先ドメイン 
Subject: this is a test 

testing. 
blah blah.. 
 
blah. 
これは、コマンドプロンプトから実行できる事を意味しますが、PHP で使用するには、php.ini で以下のように指定するだけです。 php.ini の設定
sendmail_path = "C:\tools\sendmail\sendmail.exe"
実際の sendmail.exe のパスを "" で囲んで指定します。 ※ この場合、エラーログは "C:\tools\sendmail\error.log" です( デフォルト ) PHP のコード
mb_language("Japanese");
mb_internal_encoding("UTF-8");

$from_header = "From: " . mb_encode_mimeheader( mb_convert_encoding("差出人","iso-2022-jp") );

// このソースを置くサーバから使えるメールアドレス
$from_header .= " <{$GLOBALS["mail"]}>";

$result = mb_send_mail($_POST["fld_to"], $_POST["fld_subject"], $_POST["fld_body"], $from_header);
if ( $result ) {
	$error = 0;
}
else {
	$error = 1;
}


PHP の mb_send_mail の使用方法の全体のサンプルは、こちらを参照して下さい。



posted by lightbox at 2017-09-02 13:36 | PHP + 通信 | このブログの読者になる | 更新情報をチェックする

2017年05月29日


PHP : MastodonOAuthPHP の HttpRequest.php の http_request を public に書き換えて、ファイルアップロード

MastodonOAuthPHP

HttpRequest.php の http_request は、file_get_contents を使用した通信処理です。とてもいいサンプルですし、ソースも簡単に読めます。HttpRequest.php のみ upload_file.php と同じディレクトリに置いて実行します。

以下は http_request メソッドを public にして普通に使えるサンプルです。

upload_file.php
<?php
session_cache_limiter('nocache');
session_start();

header( "Content-Type: text/html; charset=utf-8" );

// **********************************************
// クラス定義の読み込み
// **********************************************
require_once("HttpRequest.php");

// **********************************************
// 【クラスの参照】
// HttpRequest の別名を Http として使用
// **********************************************
use \theCodingCompany\HttpRequest as Http;

$file_name = "./img.jpg";

$data = file_get_contents($file_name);
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_buffer($finfo, $data);
finfo_close($finfo);

$body = <<<DATA
-----------------------------7da1c519203ca
Content-Disposition: form-data; name="target"; filename="img.jpg"
Content-Type: {$mime}

{$data}
-----------------------------7da1c519203ca
Content-Disposition: form-data; name="send"

送信
-----------------------------7da1c519203ca--
DATA;

// バイト数
$size = strlen($body);

$header = array(
	"Content-Type" => "multipart/form-data; boundary=---------------------------7da1c519203ca",
	"Content-Length" => $size
);

// **********************************************
// アップロード
// **********************************************
$result = Http::http_request(
	"POST",
	"https://ドメイン/demo/file_upload.php", 
	$header, 
	$body
);

print_r( $result );

?>

※ データ区切りの boundary は、以前にダンプした実データのものを使用しています。
※ name="target" でアップロードしています。なので、受けの PHP では固定で処理しました。

file_upload.php
<?php
session_cache_limiter('nocache');
session_start();

header( "Content-Type: application/json; charset=utf-8" );


if ( $_SERVER['REQUEST_METHOD'] == "POST" ) {
 
	$upload = realpath ( './image' );
	$upload .= ( DIRECTORY_SEPARATOR . $_FILES['target']['name'] );
	if ( move_uploaded_file(
		$_FILES['target']['tmp_name'], $upload ) ) {
		$_POST['result']  = "アップロードに成功しました";
	}
	else {
		$_POST['result']  = "アップロードに失敗しました";
	}

}
else {
	$_POST['result']  = "POST メソッドを使用して下さい";
}

$_POST['files'] = $_FILES;

print json_encode($_POST, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE );
?>


関連する記事

MastodonOAuthPHP の HttpRequest.php の解説

WindowBuilder(Swing) で、WEBカメラを使用して画像を保存して okhttp で WEBサーバへアップロードする



タグ:通信 PHP
posted by lightbox at 2017-05-29 23:52 | PHP + 通信 | このブログの読者になる | 更新情報をチェックする

2017年05月03日


MastodonOAuthPHP の HttpRequest.php の解説

MastodonOAuthPHP の HttpRequest.php は、Mastodon 用というか、API 呼び出しに特化しているので、そのまま使うには少し改造が必要です。ですが、GET 呼び出しはとりあえずそのまま使えるので、仕様としての概要をだいたいは知る事ができます。

get_and_save.php
<?php
session_cache_limiter('nocache');
session_start();

header( "Content-Type: text/html; charset=utf-8" );

// **********************************************
// クラス定義の読み込み
// **********************************************
require_once("HttpRequest.php");

// **********************************************
// 【クラスの参照】
// HttpRequest の別名を MastodonHttp として使用
// **********************************************
use \theCodingCompany\HttpRequest as MastodonHttp;

$path = "0502/std.html";

// **********************************************
// ペース URL を設定をしたインスタンスの取得
// **********************************************
$http = MastodonHttp::Instance("http://localhost");

// **********************************************
// static メソッドの実行
// **********************************************
$result = $http::Get($path);



file_put_contents('get_and_save.txt', $result );

?>
保存しました


クラスの参照

まず、HttpRequest クラスは名前空間が theCodingCompany で定義されているので、require_once で読み込んだ後、use \theCodingCompany\HttpRequest as MastodonHttp; で、MastodonHttp という名前で使えるようにします。

※ 別名を定義する必要は無いのですが、use \theCodingCompany\HttpRequest は参照するのに必要です。

コンストラクタが protected

使い勝手の理由だと思いますが、new でインスタンスを作らずに instance メソッドを実装してインスタンスを作成するようになっています。内部メソッドは全て static なので、インスタンス化しなくても呼べるはずですが、API 用の $base_url と $base_path を保存した上で インスタンス化して使用しています。

※ インスタンス化されたクラスオブジェクトから static なメソッドにはアクセスできます

static 仕様にした本当の理由は解りませんが、get_called_class を使用して呼び出し元からの インスタンス作成で必ず再利用できるようになっているようです。( instance メソッド を何度読んでも一度しか作成されないので、結果的には static メソッドのクラスを使うのと同じようになっています )

コンストラクタと instance メソッド
    // コンストラクタ
    protected function __construct($base_url = "", $base_path = "/") {            
        self::$base_path = $base_path;
        self::$base_url = $base_url;
    }
    
    // インスタンス作成用メソッド
    public static function Instance($base_url = "", $base_path = "/"){
        $cls = get_called_class();
        if(!isset(self::$instance[$cls])){
            self::$instance[$cls] = new HttpRequest($base_url, $base_path);
        }
        return self::$instance[$cls];
    }


結果的に $http::Get($path); は、$http がインスタンスで、インスタンスから static メソッドを呼び出しています。

Post メソッドは API に特化
    public static function Post($path = "", $parameters = array(), $headers = array()){
        //Sen the request and return response
        $post_data = json_encode($parameters);
        return self::http_request(
            "POST", 
            self::$base_url.self::$base_path.$path, 
            $headers,
            $post_data
        );
    }

データ部分が JSON フォーマットに固定されています。このままでは一般用では使用できないのですが、private メソッドの http_request が結果的に一般仕様なので、これを public に変更すると使えるはずです。

http_request を public にして使用 

public で、URL は直接指定なので、インスタンス作成する必要もありません。
<?php
session_cache_limiter('nocache');
session_start();

header( "Content-Type: text/html; charset=utf-8" );

// **********************************************
// クラス定義の読み込み
// **********************************************
require_once("HttpRequest.php");

// **********************************************
// 【クラスの参照】
// HttpRequest の別名を MastodonHttp として使用
// **********************************************
use \theCodingCompany\HttpRequest as MastodonHttp;

// **********************************************
// POST
// **********************************************
MastodonHttp::http_request("POST","http://localhost/0502/post_and_save.php", array(), array( "text" => "投稿データ" ) );

?>
投稿しました



posted by lightbox at 2017-05-03 20:58 | PHP + 通信 | このブログの読者になる | 更新情報をチェックする

2015年11月05日


PHP : mb_send_mail を使用した自家用メール送信 API

連想配列のキー部分がプロパティと一致したらセットする( メール送信用クラス ) では、$_GET でメール用のクラスのテストを行いましたが、実際にレンタルサーバに置いて、自分専用の API として整備しました。

ブラウザからも直接使えるように、header( "Access-Control-Allow-Origin: *" ); を実行しています。

自分専用ですが、イザという時に全て遮断できるように簡易パスワードを設定してあります。

呼び出し側は POST で送信して、FORM 要素を使用する場合は、name の値を クラスのプロパティと一致させるだけで利用可能です。( 但し差出人のメールアドレスは仕様上固定です )

{ "error": "nothing" } は、正常終了です
<?php
header( "Content-Type: application/json; Charset=utf-8" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );
header( "Access-Control-Allow-Origin: *" );

mb_language( "ja" );
mb_internal_encoding("utf-8");

if ( $_POST['pass'] != "簡易パスワード" ) {
	print '{ "error": "no pass" }';
	exit();
}

$mail = new mail_data();

$_POST['from_address'] = "サーバ側で認証の必要の無いメールアドレス";

$mail->send_mail_set($_POST);

$result = $mail->send_mail();

if ( $result ) {
	print '{ "error": "nothing" }';
}
else {
	print '{ "error": "mb_send_mail" }';
}

// ***********************************************
// メール処理用クラス
// ***********************************************
class mail_data {

	public $from_address;
	public $from_text;
	public $to_address;
	public $to_text;
	public $subject;
	public $body;

	// ***********************************************
	// 連想配列のキー部分がプロパティと一致したらセット
	// ***********************************************
	public function send_mail_set( $data ) {

		foreach( $data as $k => $v ) {
			if ( property_exists( $this, $k ) ) {
				$this->{$k} = $v;
			}
		}

	}

	// ***********************************************
	// サーバー(メールサーバ)送信処理
	// ***********************************************
	public function send_mail() {

		$from = mb_convert_encoding( $this->from_text, "JIS", "utf-8" );
		$from = "From: =?ISO-2022-JP?B?" . base64_encode($from) . "?= <{$this->from_address}>";
		$to = mb_convert_encoding( $this->to_text, "JIS", "utf-8" );
		$to = "=?ISO-2022-JP?B?" . base64_encode($to) . "?= <{$this->to_address}>";
		return mb_send_mail($to, $this->subject, $this->body, $from );
	}

}
?>


ブラウザからの ajax を想定していますが、以下は FORM による 直接テスト用の画面になります

send_test.php
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">

<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.1/themes/base/jquery-ui.css">
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.1/jquery-ui.min.js"></script>

<style>
.title {
	display: inline-block;
	width: 150px;
	padding: 15px;
}

.entry {
	display: inline-block;
	width: 350px;
	padding: 15px;
}

</style>
<script>
// jQuery 初期処理
$(function() {

	$("input,textarea").prop("required", true );

});
</script>
</head>
<body>
<div>

<?php
// -------------------------------------
// フォーム開始
// -------------------------------------
?>
<form 
	method="post"
	action="send_mail.php"
	target="_self">
<?php
// -------------------------------------
// 簡易パスワード
// -------------------------------------
?>
<input 
	type="hidden"
	name="pass"
	value="簡易パスワード">


<div class="title">差出人(日本語)</div>
<div class="entry">
	<input
		type="text"
		name="from_text"
		maxlength="50"
		style="width:200px">
</div>

<br>

<div class="title">宛先</div>
<div class="entry">
	<input
		type="text"
		name="to_address"
		style="width:200px">
</div>

<br>

<div class="title">宛先(日本語)</div>
<div class="entry">
	<input
		type="text"
		name="to_text"
		style="width:200px">
</div>

<br>

<div class="title">件名</div>
<div class="entry">
	<input
		type="text"
		name="subject"
		style="width:200px">
</div>

<br>

<div class="title" style='vertical-align:top'>本文</div>
<div class="entry">
	<textarea
		name="body"
		style="width:200px;height:150px;"></textarea>
</div>

<br>


<div class="title"></div>
<div class="entry">
	<input
		type="submit"
		name="send"
		value="送信">
</div>

</form>

</body>
</html>





posted by lightbox at 2015-11-05 21:39 | PHP + 通信 | このブログの読者になる | 更新情報をチェックする

2015年10月03日


PHP で Windows標準のオブジェクト(CDO.Message)とGMail を使ってメール送信

ひさしぶりにテスト( Windows7 ) しようとすると、Gmail からエラーが返って来ましたが、Gmail 側で安全性の低いアプリの許可を『有効』にする必要がありました。

また、php 側では、php_com_dotnet.dll を php.ini で有効にする必要があります。

※ CDO.Message に関する詳細は、ソース内に URL を記述しています

関連する記事

Windows標準のオブジェクト(CDO.Message)とGMail を使ってメール送信

本来は、VBScript で実行するものですが、PHP が分かる人なら、こちらのほうがいろいろ応用がきいて使い勝手もいいと思います。

▼ バッチファイル
------------------------------------------------------
@echo off
setlocal
set PATH=c:\php;%PATH%

php mail.php "題名" "本文\nで す\nよ"

endlocal
------------------------------------------------------

mail.php
<?php
// ***********************************************
// バッチファイル内容
// setlocal は、環境変数を一時的に設定する為に使用します
// php.exe は、c:\php にあります
// ***********************************************
/*
@echo off
setlocal
set PATH=c:\php;%PATH%

php mail.php "題名" "本文\nで す\nよ"

endlocal
*/

// ***********************************************
// php.ini で必要な拡張
// ***********************************************
/*
extension=php_com_dotnet.dll
*/

// ***********************************************
// Gmail 側の設定
// ***********************************************
/*
安全性の低いアプリの許可を『有効』にする

https://myaccount.google.com/security?pli=1#connectedapps
*/

// ***********************************************
// PHP の処理開始
// ***********************************************
$strFrom = "私です <ユーザ名@gmail.com>";
$strTo = "あなたです <宛先メールアドレス>";

$strServer = "smtp.gmail.com";
$nPort = 465;
$strUser = "ユーザ名@gmail.com";
$strPass = "パスワード!";

// ***********************************************
// CDO.Message( CDO for Windows 2000 )
// ***********************************************
$cdo = new COM( "CDO.Message" );

$cdo->From = $strFrom;
$cdo->To = $strTo;

// ***********************************************
// 題名
// ***********************************************
$cdo->Subject = $argv[1];

// ***********************************************
// バッチファイルで引渡した本文文字列内の \n を実際の改行に変換
// ***********************************************
$data = str_replace( "\\n", "\n", $argv[2] );
$cdo->Textbody = $data;

// ***********************************************
// 送信情報オプション
// ***********************************************
$cdo->Cc = "メールアドレス1,メールアドレス2";
//$cdo->Bcc = "";
$cdo->Htmlbody = "<img src=\"http://winofsql.jp/image/winofsql.png\">";

// ***********************************************
// ファイル添付
// ***********************************************
$cdo->AddAttachment( "C:\\Users\\lightbox\\Desktop\\画像\\_img.jpg" );

// cdoSendUsingPort : 2 : Send the message using the network (SMTP over the network)
// https://msdn.microsoft.com/en-us/library/ms527265.aspx.
$cdo->Configuration->Fields["http://schemas.microsoft.com/cdo/configuration/sendusing"] = 2;

// The name (DNS) or IP address of the machine hosting the SMTP service through which messages are to be sent.
// https://msdn.microsoft.com/en-us/library/ms527294.aspx
$cdo->Configuration->Fields["http://schemas.microsoft.com/cdo/configuration/smtpserver"] = $strServer;

// The port on which the SMTP service specified by the smtpserver field is listening for connections.
// https://msdn.microsoft.com/en-us/library/ms526227.aspx
$cdo->Configuration->Fields["http://schemas.microsoft.com/cdo/configuration/smtpserverport"] = $nPort;

// Indicates that SSL should be used when sending messages using the SMTP protocol over the network.
// https://msdn.microsoft.com/en-us/library/ms526975.aspx
$cdo->Configuration->Fields["http://schemas.microsoft.com/cdo/configuration/smtpusessl"] = true;

// Specifies the authentication mechanism to use when authentication is required to send messages
// to an SMTP service using a TCP/IP network socket.
// https://msdn.microsoft.com/en-us/library/ms526600.aspx
// 1 : Use basic (clear-text) authentication
// https://msdn.microsoft.com/en-us/library/ms526961.aspx
$cdo->Configuration->Fields["http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"] = 1;

// ユーザとパスワード
$cdo->Configuration->Fields["http://schemas.microsoft.com/cdo/configuration/sendusername"] = $strUser;
$cdo->Configuration->Fields["http://schemas.microsoft.com/cdo/configuration/sendpassword"] = $strPass;

$cdo->Configuration->Fields->Update();

$cdo->Send();

// ***********************************************
// レジストリ内容
// ***********************************************
/*
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\CLSID\{CD000001-8B95-11D1-82DB-00C04FB1625D}]
@="CDOMessage Class"

[HKEY_CLASSES_ROOT\CLSID\{CD000001-8B95-11D1-82DB-00C04FB1625D}\InprocServer32]
@="C:\\Windows\\system32\\cdosys.dll"
"ThreadingModel"="Both"

[HKEY_CLASSES_ROOT\CLSID\{CD000001-8B95-11D1-82DB-00C04FB1625D}\ProgID]
@="CDO.Message.1"

[HKEY_CLASSES_ROOT\CLSID\{CD000001-8B95-11D1-82DB-00C04FB1625D}\Programmable]

[HKEY_CLASSES_ROOT\CLSID\{CD000001-8B95-11D1-82DB-00C04FB1625D}\VersionIndependentProgID]
@="CDO.Message"
*/
?>

参考情報

メーラーからGmailへの接続時に認証(パスワード)のエラーが生じる場合の対処方法



posted by lightbox at 2015-10-03 21:44 | PHP + 通信 | このブログの読者になる | 更新情報をチェックする

2015年06月22日


PHP : http 経由でファイルのサイズを取得する file_size 関数と ファイルサイズを付加した get_imagesize 関数

getimagesize は、ファイルのサイズが取得されません。あまり大きいサイズは事前に排除したいので、ファイルサイズを付加すれば便利だろうと思い、まず file_size 関数を作成しました。



※ getimagesize( get_imagesize ) は、画像以外だとエラーになります。
<?php
header( "Content-Type: text/html; Charset=utf-8" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

if ( $_SERVER["REQUEST_METHOD"] == "POST" ) {

	if ( $_POST["send"] == "テスト送信" ) {
		$result = @getimagesize( $_POST["url"] );
		if ( $result !== false ) {
			$view = print_r( $result, true );

			$header = get_headers( $_POST["url"] );
			$view .= print_r( $header, true );

			$size = implode( "\n", $header );
			$view .= $size;

			if (preg_match('/Content-Length: (\d+)/', $size, $matches)) {
				$contentLength = (int)$matches[1];
				$view .= "\n\niamge size : {$contentLength}";
			}

		}
		else {
			$view = "{$_POST["url"]} を読み込めません";
		}
	}

	if ( $_POST["send"] == "get_imagesize" ) {
		$result = get_imagesize( $_POST["url"] );
		if ( $result !== false ) {
			$view = print_r( $result, true );
		}
		else {
			$view = "{$_POST["url"]} を読み込めません";
		}
	}

	if ( $_POST["send"] == "fle_size" ) {
		$result = fle_size( $_POST["url"] );
		if ( $result !== false ) {
			$view = "filesize : $result";
		}
		else {
			$view = "{$_POST["url"]} を読み込めません";
		}
	}
}

function get_imagesize($url) {

	$result = @getimagesize($url);
	if ( $result !== false ) {
		$view = print_r( $result, true );

		$size = fle_size($url);
		if ( $size !== false ) {
			$result["size"] = $size;
		}
		return $result;
	}
	else {
		return false;
	}

}

function fle_size($url) {

	$header = @get_headers($url) ;
	if ( $header !== false ) {
		$size = implode( "\n", $header );
		if (preg_match('/Content-Length: (\d+)/', $size, $matches)) {
			$contentLength = (int)$matches[1];
			return $contentLength;
		}
		else {
			return false;
		}
	}
	else {
		return false;
	}

}

?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title></title>
<style>
* {
	font-size: 16px;
	font-family: "Hiragino Kaku Gothic ProN", "メイリオ", Meiryo, "MS Pゴシック", sans-serif;
}
</style>
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script>
$(function(){

});
</script>
</head>
<body>

<form method="post" target="_self">
	URL => <input type="text" name="url" style="width:800px;" value="<?= $_POST["url"] ?>">
	<br>

	<input type="submit" name="send" value="テスト送信">
	<input type="submit" name="send" value="get_imagesize">
	<input type="submit" name="send" value="fle_size">
</form>
<pre>
<?= $view ?>
</pre>
</body>
</html>

※ ボタン画像



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

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

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

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

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


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

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

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

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

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

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり