SQLの窓

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年11月02日


PHP : $_GET、$_POST、$_SESSION とグローバル変数全ての簡単な表示方法

$GLOBALS はスーパーグローバル変数を含む、ほぼ全てのグローバル変数を保持しています。そこで、print_r で取得できる内容から、正規表現で $_COOKIE と $_FILES を削除したものを表示しています。

※ 同時に get_include_path で、現在の include_path をパス単位で表示しています
<?php

$debug_string = print_r($GLOBALS,true);

$debug_string = preg_replace('/\n\s+\[_[C|F].+?\)/s', '', $debug_string);

print "<br><br><hr>";
print "<pre style='font-weight:bold;white-space:pre-wrap;'>";
print $debug_string;
print "--------------------------------------\n";
print_r( explode(PATH_SEPARATOR,get_include_path()) );
print "</pre>";

?>


print_r は、このように出力結果を文字列として戻す事ができるので、デバッグ時にファイルに出力するのに有効です

▼ 表示結果の例( windows )
Array
(
    [_GET] => Array
        (
            [update_type] => 1
            [syain] => 0053
            [order] => 氏名
        )

    [_POST] => Array
        (
        )

    [rpath] => C:\httpd142p\if_skeleton\lightbox99\
    [_SESSION] => Array
        (
            [charset] => utf-8
            [iframe_id] => target
        )

    [server] => localhost
    [db_name] => lightbox
    [user] => root
    [password] => パスワード
    [connect] => mysqli Object
        (
            [affected_rows] => 5
            [client_info] => mysqlnd 5.0.10 - 20111026 - $Id: e707c415db32080b3752b232487a435ee0372157 $
            [client_version] => 50010
            [connect_errno] => 0
            [connect_error] => 
            [errno] => 0
            [error] => 
            [error_list] => Array
                (
                )

            [field_count] => 12
            [host_info] => localhost via TCP/IP
            [info] => 
            [insert_id] => 0
            [server_info] => 5.6.17
            [server_version] => 50617
            [stat] => Uptime: 15857  Threads: 1  Questions: 288  Slow queries: 0  Opens: 71  Flush tables: 1  Open tables: 64  Queries per second avg: 0.018
            [sqlstate] => 00000
            [protocol_version] => 10
            [thread_id] => 76
            [warning_count] => 0
        )

    [query] => select * from `社員マスタ`
where 管理者 is NULL order by 氏名

    [result] => Array
        (
            [0] => 社員マスタ
            [1] => mysqli_result Object
                (
                    [current_field] => 0
                    [field_count] => 13
                    [lengths] => 
                    [num_rows] => 0
                    [type] => 0
                )

            [2] => コード名称マスタ
            [3] => mysqli_result Object
                (
                    [current_field] => 0
                    [field_count] => 7
                    [lengths] => 
                    [num_rows] => 3
                    [type] => 0
                )

            [4] => 社員マスタ
            [5] => mysqli_result Object
                (
                    [current_field] => 0
                    [field_count] => 12
                    [lengths] => 
                    [num_rows] => 5
                    [type] => 0
                )

        )

    [ErrorMessage] => 
    [php_errormsg] => Undefined variable: ErrorDisable
    [row] => 
    [sentaku] => 
    [GLOBALS] => Array
 *RECURSION*
)
--------------------------------------
Array
(
    [0] => .
    [1] => C:\php\pear
    [2] => C:\httpd142p\if_skeleton\lightbox99\common
    [3] => C:\httpd142p\if_skeleton\lightbox99\db
    [4] => C:\httpd142p\if_skeleton\lightbox99\view
)
データベースのテーブル別に配列を使って処理すると、後から確認しやすくなります
posted by lightbox at 2015-11-02 14:30 | PHP + ベーシック | このブログの読者になる | 更新情報をチェックする

Windows・Unix(Linux)共用、PHPの include_path の動的設定方法

まず、WEB用のパスでは、ファイルをサーチする事はできません。その OS が判断できる絶対パスを作成する必要があります。Unix(Linux) の場合は、WEBのフォルダの前に、実際の / からのパスを付加します。Windows の場合は、同様の処理を行いますが、/ を \ に変換する簡単な方法として realpath を使用しています。

※ Windows の realpath は、その場所が C ドライブだとすると、 / は C:\ に変換してくれます

PATH_SEPARATOR は、ファイルサーチ用の区切り文字で、Unix(Linux) では :(コロン)、Windows では ;(セミコロン)になります。

DIRECTORY_SEPARATOR は、それぞれ / と \ となります。

realpath では、実際にそのファイルが存在しないと何も返さないので注意して下さい。

get_include_path() で元々のパスを含める事を忘れないで下さい。(恐らく)デフォルトの環境で、. が含まれているはずで、それによってカレントディレクトリの検索が可能になっています。
<?php
$rpath = "/if_skeleton/lightbox99";
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
	$rpath = realpath( "/httpd142p{$rpath}" );
}
else {
	$rpath = "/home/lightbox/www/testweb{$rpath}";
}
$rpath .= DIRECTORY_SEPARATOR;
set_include_path(get_include_path() . PATH_SEPARATOR . "{$rpath}common" . PATH_SEPARATOR . "{$rpath}db" . PATH_SEPARATOR . "{$rpath}view");


関連する PHP ドキュメント

コア php.ini ディレクティブに関する説明 


posted by lightbox at 2015-11-02 14:12 | 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 終わり