SQLの窓

2017年09月02日


FormData を使用して $.ajax で送信すると、ファイルのアップロードとメール送信(ファイル添付)を一度に行えます

mb_send_mail による メール送信におけるファイル添付の普通のサンプルはこちら

呼び出し
	$( "#base" ).submit(function( event ) {

		event.preventDefault();

		$("#action").prop( "disabled", true );
		$("#action_copy").prop( "disabled", true );
		
		// 新規送信用オブジェクト
		var formData = new FormData();

		// 入力テキスト
		formData.append("fld_to", $("input[name='fld_to']").val() );
		formData.append("fld_subject", $("input[name='fld_subject']").val() );
		formData.append("fld_body", $("textarea[name='fld_body']").val() );
		// ファイルオブジェクト( type="file" )
		formData.append("fld_file", $("input[name='fld_file']").get(0).files[0]);

		$.ajax({
			url: "app-mail.php",
			type: "POST",
			data: formData,
			processData: false,  // jQuery がデータを処理しないよう指定
			contentType: false   // jQuery が contentType を設定しないよう指定
		})
		.done(function( data, textStatus ){
			console.log( "status:" + textStatus );
			console.log( "data:" + JSON.stringify(data, null, "    ") );

			if ( data.status == 0 ) {

				toastr.info("メールが送信されました");

				$("input[name='fld_subject']").val( "" );
				$("textarea[name='fld_body']").val( "" );

			}

			if ( data.status == 1 ) {
				// エラーメッセージを表示
				toastr.error("メール送信に失敗しました");

			}
			
		})
		// 失敗
		.fail(function(jqXHR, textStatus, errorThrown ){
			console.log( "status:" + textStatus );
			console.log( "errorThrown:" + errorThrown );
		})
		// 常に実行
		.always(function() {

			$("#action").prop( "disabled", false );
			$("#action_copy").prop( "disabled", false );

		})
		;		
	
	});

受け側の PHP

$_POST['fld_body'] の中身は UTF-8 ですが、mb_send_mail が変換してくれます。
<?php
// ***************************
// このアプリ特有の定義
// ***************************
require_once("../mail-jquery/app.model");

$GLOBALS["content_type"] = "application/json";
$GLOBALS["upload_dir"] = "./upload";

require_once("{$GLOBALS["common_path"]}common.php");

// type="file" のフィールドの name の値
$fld = "fld_file";

// ******************************************************
// アップロード 処理
// ******************************************************
if ( !$_FILES ) {
	// php.ini の upload_max_filesize を超えて、
	// Apache に制限が無いと $_FILE が空になる
	$_FILES[$fld]['error'] = 5;	// ユーザエラーメッセージ
}

// *************************************
// アップロード処理
// フィールド名 : $fld で固定
// *************************************

// true では実行しない
if ( !$GLOBALS["debug_update"] ) {

	$upload = realpath ( $GLOBALS["upload_dir"] );
	$upload .= ( DIRECTORY_SEPARATOR . $_FILES[$fld]['name'] );
	if ( move_uploaded_file(
		$_FILES[$fld]['tmp_name'], $upload ) ) {
		$_POST['result']  = "アップロードに成功しました";
	}
	else {
		if ( !$_FILES ) {
			$_FILES[$fld]['error'] = 5;	// ユーザエラーメッセージ
		}
		$_POST['result']  = "アップロードに失敗しました";
	}

}
else {
	if ( $_FILES[$fld]['error'] == 0 ) {
		$_POST['result']  = "アップロードに成功しました";
	}
	else {
		$_POST['result']  = "アップロードに失敗しました";
	}
}


$_POST['files'] = $_FILES;

// *************************************
// メール処理
// *************************************
mb_language("Japanese");
mb_internal_encoding("UTF-8");

$uniqid = uniqid();

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

// このソースを置くサーバから使えるメールアドレス
$from_header .= " <{$GLOBALS["mail"]}>\n";
$from_header .= "Content-Type: multipart/mixed; boundary=\"{$uniqid}\"\n";

$mime = $_FILES['fld_file']['type'];
$fname = $_FILES['fld_file']['name'];

$body  = "--{$uniqid}\n";
$body .= "Content-Type: text/plain; charset=\"ISO-2022-JP\"\n";
$body .= "\n";
$body .= $_POST['fld_body'] . "\n";
$body .= "--{$uniqid}\n";
$body .= "Content-Type: {$mime}; name=\"{$fname}\"\n";
$body .= "Content-Transfer-Encoding: base64\n";
$body .= "Content-Disposition: attachment; filename=\"{$fname}\"\n";
$body .= "\n";

// アップロードされたファイル
$path = $upload;
$data = file_get_contents($path);
$encode = base64_encode($data);

$body .= chunk_split($encode);
$body .= "\n--{$uniqid}--\n";

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

// アップロードして添付したファイルを削除
unlink($path);


// ***************************
// JSON データ作成
// ***************************
$json = new stdClass;

$json->post = $_POST;			// 行データ
$json->status = $error;		// エラー
if ( !$GLOBALS["debug_update"] ) {
	$json->user = $GLOBALS["mail"];
	$json->debug = $from_header;
}

print json_encode( $json, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE );

?>

関連する記事

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




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

ファイルのアップロードからそれを添付してメールを送るテンプレート(スケルトン)



メール送信部分には、『mb_send_mail』を使用しているので、インターネット上のサーバーで、そこからパスワード無しでメールアドレスが利用できる必要があります。

※ fake sendmail for windows でも動作確認しました
※ FormData を使用して送信すると、ファイルのアップロードとメール送信を一度にできます。
( FormData を使用したサンプル )



メールアドレスは、mail.php で、セッション変数にセットして使用しています。

Content-Type の MIME は、ファイルアップロード時に取得した type をセッション変数に保存して使用しています。
<?php
require_once("common.php");

$_SESSION['user'] = "セッションデータを表示する為のダミー";
$_SESSION["mail_from"] = "メールアドレス";

require_once("mail_view.php");
?>
ファイル一覧
  • common.php
  • debug_value.php
  • mail.php
  • mail_view.php
  • form2.php
  • form2_view.php
  • upload1.php
  • html_head.php
  • mail_ex.php
  • style.css ※ ソース全体参照へのリンク
  • メール送信部分の mail_ex.php
    <?php
    require_once("common.php");
    
    require_once("html_head.php");
    
    foreach( $_POST as $Key => $Value ) {
    	$_POST[$Key] = str_replace("\\\\", "\\", $Value );
    	$_POST[$Key] = str_replace("\\'", "'", $_POST[$Key] );
    	$_POST[$Key] = str_replace("\\\"", "\"", $_POST[$Key] );
    }
    
    
    mb_language( "ja" );
    mb_internal_encoding("utf-8");
    
    $from = $_SESSION["mail_from"];
    $fname = $_SESSION["mail_file"];
    $mime = $_SESSION['mime'];
    
    if ( $fname == "" ) {
    	print "ファイルをアップロードして下さい <a href=\"mail.php\">戻る</a><br>";
    	exit();
    }
    
    $uniqid = uniqid();
    
    $headers = "From: {$from}\n";
    $headers .= "Content-Type: multipart/mixed; boundary=\"{$uniqid}\"\n";
    
    $body  = "--{$uniqid}\n";
    $body .= "Content-Type: text/plain; charset=\"ISO-2022-JP\"\n";
    $body .= "\n";
    $body .= $_POST['text'] . "\n";
    $body .= "--{$uniqid}\n";
    $body .= "Content-Type: {$mime}; name=\"{$fname}\"\n";
    $body .= "Content-Transfer-Encoding: base64\n";
    $body .= "Content-Disposition: attachment; filename=\"{$fname}\"\n";
    $body .= "\n";
    
    $path = "upload_file/{$fname}";
    $data = file_get_contents($path);
    $encode = base64_encode($data);
    
    $body .= chunk_split($encode);
    $body .= "\n--{$uniqid}--\n";
    
    $ret = mb_send_mail(
    	$_POST['to_address'],
    	$_POST['subj'],
    	$body,
    	$headers );
    
    // アップロードして添付したファイルを削除
    unlink($path);
    $_SESSION["mail_file"] = "";
    
    if ( $ret === TRUE ) {
    	print "<a href=\"mail.php\">戻る</a> メール送信が終了しました。<br>";
    }
    else {
    	print "<a href=\"mail.php\">戻る</a> メール送信に失敗しました。<br>";
    }
    
    print "</body>";
    print "</html>";
    ?>
    
    
    ファイルのアップロード後、アップロードフォルダのファイルのタイムスタンプが5分以上経過している場合は削除します。(upload1.php)
    
    ファイルアップロードの実行は IFRAME 内の別ページで行っています。さらに、IFRAME 内の IFRAME にアップロード結果を表示している為、アップロード結果の『ファイル名』をメインページに転送する為、JavaScript を PHP で出力しています。
    
    その際、メインページでは jQuery を使用しているので、メインページの jQuery を使用してファイル名をテキストフィールドに転送しています
    
    if ( move_uploaded_file( $_FILES['file_1']['tmp_name'], $upload ) ) {
    	print "アップロードに成功しました<br>";
    	$_SESSION["mail_file"] = $target;
    	print "<script>";
    	print " parent.parent.$('#mail_file').val( \"{$target}\" );";
    	print "</script>";
    }
    else {
    	print "アップロードに失敗しました<br>";
    }
    
    
    関連する記事
    
    fake sendmail for windows を使って、PHP でごく普通に( mb_send_mail で )メール送信 : Gmail なので ssl(465)
    
    
    
    
    posted by lightbox at 2017-09-02 16:33 | PHP + 通信 | このブログの読者になる | 更新情報をチェックする

    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 + 通信 | このブログの読者になる | 更新情報をチェックする
    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 ドロップシャドウの参考デモ
    イラストAC
    ぱくたそ
    写真素材 足成
    フリーフォント一覧
    utf8 文字ツール
    右サイド 終わり
    base 終わり