Posts tagged mail

CakePHP の開発を簡単にする 5 つの Tips

1

“開発を便利にする5つのTips” フォーラム – CakePHP Users in Japan で紹介されていた記事です。

Make your life easier with these five CakePHP Quicktips ? Debuggable Ltd

1. prd という便利な関数を作成する

pr($someVar);
die;

というコードをよく書くなら prd という関数を作ってしまえば、もっと楽できますね。

function prd($var) {
    pr($var);
    die;
}

(続きを読む…)

OpenPNE 2.10 のメールサーバの設定

1

OpenPNE のインストール時にメールから日記の投稿などを受け付けるためにメールサーバの設定を行います。
OpenPNE のバージョン 2.10 からメールアドレスに新たに編集のアドレスが加わっていますが、ググッてみても 2.8 のころの形式の設定方法しか情報がないので書いておきます。
(続きを読む…)

PHP で大量メール送信を非同期で行う

1

PHP でメールを非同期に送信する時に PEAR の Mail_Queue を使用するときのメモです。

Mail_Queue のマニュアル
PEAR :: Manual :: Mail_Queue

上記マニュアルにあるチュートリアルが分かりやすいです。
PEAR :: Manual :: チュートリアル

処理の流れとしては下記のようになります。

  • データベースに送信するメールを貯める
  • cron で定期的に貯まったメールを送信する

(続きを読む…)

CakePHP 1.2 Form ヘルパーで input タグとエラーメッセージを別々に表示する方法

2

CakePHP1.2 では Form ヘルパーの input メソッドでエラーメッセージを自動的に表示することが可能です。 自動的にエラーメッセージを表示するためには CakePHP1.2 のバリデーション で書いたようにモデルのバリデーションでエラーメッセージを設定しておきます。

/* モデルのバリデーション */
var $validate = array(
    'email' => array(
        'required' => array(
       	    'rule'=>VALID_NOT_EMPTY ,
       	    'message' => '必須項目です'
       	),
);

/* View の Form ヘルパー */
echo $form->input('User/email', array('type'=>'text'));

(続きを読む…)

WordPress API フックの使い方

2

API フックとは

プラグインやテーマの動作を WordPress 本体に連動させることができます。WordPress 本体に修正を加えなくてもカスタマイズできます。

アクションとフィルタ

API フックにはアクションとフィルタがあります。アクションは WordPress で発生するイベントによって実行されます。イベントは投稿やテンプレートの変更などユーザが行う行動です。フィルタはテーマなどで出力するテキストデータを変更するものです。
(続きを読む…)

CakePHP1.2 バリデーションのルール

2

CakePHP1.2 のバリデーションのメモです。
詳しくは cake/libs/validation.php を見ると分かりやすいです。

半角英数字のみ

alphaNumeric

var $validate = array('field' => array('rule' => array('alphaNumeric')));

文字列の長さ

between

var $validate = array('field' => array('rule' => array('between', 6, 8)));
半角で6文字以上8文字以内

文字列が空

blank

var $validate = array('field' => array('rule' => array('blank')));

クレジットカード番号

cc

var $validate = array('field' => array('rule' => array('cc')));

比較

comparison

var $validate = array('field' => array('rule' => array('comparison', '>', 10)));
‘==’, ‘!=’, ‘< =’, など使用できる

正規表現

custom

var $validate = array('field' => array('rule' => array('custom', '/^[0-9]{3}\-[0-9]{4}$/')));
例として NNN-NNNN 形式の郵便番号のバリデーション

日付

date

var $validate = array('field' => array('rule' => array('date', 'ymd')));
‘dmy’, ‘mdy’, ‘ymd’, ‘dMy’, ‘Mdy’, ‘My’, ‘my’ が使用可

小数点の桁数チェック

decimal

var $validate = array('field' => array('rule' => array('decimal', 2)));

var $validate = array('field' => array('rule' => array('decimal', null, '/^[0-9]{2}\.[0-9]{2}$/')));
正規表現を指定してチェックすることも可。

メールアドレス

email

var $validate = array('field' => array('rule' => array('email')));

=== での比較

equalTo

var $validate = array('field' => array('rule' => array('equalTo', 'hoge')));
型も含めて等しいかチェック

拡張子

extension

var $validate = array('field' => array('rule' => array('extension', array('gif', 'jpg')));
ファイルの拡張子をチェック。許可したい拡張子を配列で指定。デフォルトは array(‘gif’, ‘jpeg’, ‘png’, ‘jpg’)

IPアドレス

ip

var $validate = array('field' => array('rule' => array('ip')));

最小文字数

minLength

var $validate = array('field' => array('rule' => array('minLength', 6)));

最大文字数

maxLength

var $validate = array('field' => array('rule' => array('maxLength', 12)));

数字

numeric

var $validate = array('field' => array('rule' => array('numeric')));

数字の範囲チェック

range

var $validate = array('field' => array('rule' => array('range', 0, 100)));
注意点は指定した数字は含まれない
上の例では 1?99 までが true

var $validate = array('field' => array('rule' => array('range')));
とすると有限数かどうかのチェック

URL

url

var $validate = array('field' => array('rule' => array('url')));

CakePHP1.2 のバリデーション

12

CakePHP 1.2 を使用してフォームを作成してバリデーションを使用したメモです。

下記サイトを参考にさせていただきました。
cakePHP 1.2のバリデーションを理解する – cakephp – クロアチアで働くプログラマー日記

例としてメールアドレスを2回入力させるフォームを考えて見ます。
バリデーションルールとして

  • 必須項目
  • メールアドレスとして正しい
  • メールアドレスがユニーク
  • 2回入力したメールアドレスが一致する

モデルにバリデーションを定義する

var $validate = array(
    'email' => array(
        'unique' => array(
    	    'rule' => array('checkUnique', 'email'),
    	    'message' => 'メールアドレスは既に登録されています'
    	),
        'rule1' => array(
       	    'rule' => array('email'),
       	    'message'=>'メールアドレスが正しくありません'
      	 ),
        'required' => array(
       	    'rule'=>VALID_NOT_EMPTY ,
       	    'message' => '必須項目です'
       	),
    ),
    'email_confirm' => array(
        'rule1' => array(
    	    'rule'=> array('checkCompare'),
    	    'message'=>'一致しません'
    	),
    ),
);

私はエラーメッセージをバリデーション定義にまとめておきたいので、上記のように各ルールに
'message' => 'エラーメッセージ'
として定義しています。
ここで定義しておけば、後でビューに書くフォームヘルパーでフォームを出力するときに引っかかったエラーを自動的に出力することができます。

また、自分でバリデーション関数を作成してチェックすることもできます。それが checkUnique と checkCompare です。

メールのユニークチェックは参考サイトを参考にさせていただきました。

function checkUnique($field){
    foreach( $field as $key => $value ){
        $this->recursive = -1;
        $found = $this->find(array("{$this->name}.$key" => $value));
        return !$found;
    }
}

次にメールアドレスを2回入れたものが一致するかのチェックです。
これはパスワードなどでもたまに使用するので汎用性を持たせてあります。
例えばメールアドレスのフィールド名が email の場合、確認用のフィールド名は ‘_confirm’を付けて email_confirm としておけばこの2つが一致するかチェックします。

function checkCompare($field) {
    foreach( $field as $key => $value ){
        if (preg_match('/^(.+)_confirm$/', $key, $regs)) {
            return $this->data[$this->name][$regs[1]] == $this->data[$this->name][$key];
        }
    }
}

ビューでフォームを設定

<?php echo $form->input('User/email', array('type'=>'text')); ?>
<?php echo $form->input('User/email_confirm', array('type'=>'text')); ?>

このように書いておけばバリデーションエラーがある場合は、モデルのバリデーションに定義したエラーメッセージを自動的に出力してくれます。

ちなみに上記のように書くと input タグの前に email などのフィールド名が出力されます。これを消したい場合は
<?php echo $form->input('User/email', array('type'=>'text', 'label'=>'')); ?>
と書くと表示されなくなります。

追記:
コメントで教えていただきました。label=>” だと表示されないが、label タグは残るので
<?php echo $form->input('User/email', array('type'=>'text', 'label'=>false)); ?>
とするとラベルタグも出力されなくなります。

コントローラでバリデーションチェック

以下のようになります。

function action() {
    if ($this->data) {
        if ($this->User->create($this->data) && $this->User->validates()) {
	    // バリデーションOK
	}
    }
}

他にもいろいろフォーム気がついた点があったのでそれはまた後でまとめます。

CakePHP メール送信許可フラグによってメールを一斉送信するメールビヘイビア

2

Acts As Emailable | The Bakery, Everything CakePHP : Articles

メール送信許可フラグによってメールを一斉送信することができるメールビヘイビアが上記エントリで紹介されています。
ビヘイビアというのは今まで使ったことがなかったのですが、モデルに共通の振る舞いをさせるようなときに使う感じでしょうか。このメールビヘイビアはモデルにメールの一斉送信機能を付加します。

テーブル

CREATE TABLE `users` (
  `id` int(11) NOT NULL auto_increment,
  `username` varchar(255) NOT NULL default '',

  `emailable` tinyint(4) NOT NULL default '1',
  `email` text NOT NULL,
  PRIMARY KEY  (`id`)
)

emailable カラムは 0 or 1 の値で、1の場合はメール送信許可です。
email カラムはメールアドレスが入ります。

モデル

app/models/user.php

< ?php
class User extends AppModel {
     var $actsAs = array('emailable');
}
?>

モデルでメールビヘイビアを使うことを定義します。

ビヘイビア

Acts As Emailable | The Bakery, Everything CakePHP : Articles にメールビヘイビアのコードがあります。
これを app/models/behaviors/emailable.php として保存します。
ただし1点修正が必要でした。
322行目の
App::import('Component', 'EmailComponent');

App::import('Component', 'Email');
として保存してください。
Email コンポーネントが修正前のコードでは読み込めずにエラーになります。

メールテンプレート

< ?php
    echo "テストメッセージです。名前は".$username."です";
?>

保存先ですが、どこがいいのか悩みましたが今回は app/views/emails/test_template.php としました。
テンプレート内の変数はモデルのカラム名が使用できます。

メール送信

$email_options = array('from' => 'hoge@example.com', 'subject' => 'テストです');
$template = "views/emails/test_template.php";
$this->User->send_campaign_to_emailable($template, $email_options);

これでメール送信許可している(users.emailable=1)のユーザにメールが送信されます。

そのほかに以下のようなメソッドがあります。
send_campaign_to_all($template, $email_options)
登録されているユーザ全てにメールを送信します。

send_campaign_to_non_emailable($template, $email_options)
登録されているユーザでメール送信許可していないユーザにメールを送信します。

add_emailable($id)
ID で指定したユーザの emailable=1 にします。

remove_emailable($id)
ID で指定したユーザの emailable=0 にします。

デフォルトは mail 関数でメール送信しますが、SMTP を指定して送信することもできます。

まとめ

このメールビヘイビアを今回試すことによってビヘイビアの使い方、便利さが少し理解できました。まだビヘイビアを試されていない方は一度試して見てはいかがでしょうか?

OpenPNE 特定ページを SSL で接続する

3

OpenPNE で個人情報などを送信するようなフォームや管理画面を SSL で接続する方法です。

SSL を使用するように設定を変更する

openpne/config.phpの以下の行を変更
特定ページを SSL で接続するように設定
define('OPENPNE_USE_SSL_PARAM', false);define('OPENPNE_USE_SSL_PARAM', true);に変更
これだけで特定ページが SSL で接続されるようになります。

SSL を使用したいアクションを追加する

デフォルトで SSL 接続されるようになっているページ以外も SSL 接続にしたい場合は

$GLOBALS['_OPENPNE_SSL_REQUIRED'] = array(
'pc' => array(
    'page_o_regist_prof',  'page_o_regist_prof_confirm', 'do_o_regist_prof',
    'page_o_regist_intro', 'page_o_ri', 'page_o_regist_end',
    'page_h_config_prof', 'page_h_config_prof_confirm', 'do_h_config_prof',
    'page_h_config_ktai', 'do_h_config_ktai_send',
),
'ktai' => array(
    'page_o_login', 'do_o_login', 'do_o_easy_login',
    'page_o_login2', 'do_o_update_ktai_address',
    'page_o_regist_pre', 'page_o_regist_input', 'do_o_insert_c_member',
    'page_o_regist_end',
    'page_o_password_query', 'do_o_password_query',
    'page_h_config_prof', 'do_h_config_prof_update_c_member',
    'page_h_config_easy_login', 'do_h_config_easy_login',
    'page_h_config_mail', 'do_h_config_mail_insert_c_ktai_address_pre',
    'page_h_pc_send', 'page_h_pc_send_confirm', 'do_h_pc_send_insert_c_pc_address_pre',
    'page_h_config_password_query', 'do_h_config_password_query_update_password_query',
    'page_h_config_password', 'do_h_config_password_update_password',
));

となっているところに SSL 接続したいアクションを追加していく。
例えば、携帯ではリマインダーは SSL 接続になりますが PC では SSL 接続ではありません。
そこで PC でも SSL にしたい場合は上の pc の配列にリマインダーのアクションの “page_o_password_query” を追加します。
これで http://www.example.com/?m=pc&a=page_o_password_query という URL は自動的に
https://www.example.com/?m=pc&a=page_o_password_query へリダイレクトされます。

注意点は上記の URL からフォームが送信される ?m=pc&a=do_o_password_query というURL も SSL にする必要があります。
これをしないとフォームの画面は SSL でも送信先が SSL ではなくなってしまいます。

PC 用のリマインダーを SSL にする場合は “page_o_password_query” と “do_o_password_query” の2つを追加する必要があるということです。

確認画面が入るフォームなどではフォーム画面表示アクション、確認画面表示アクション、実行アクションと3つ追加する必要があります。

ユーザに SSL を使用するか選択させるアクションの追加

ユーザが SSL を使用するか選択できるリストというのもあります。

$GLOBALS['_OPENPNE_SSL_SELECTABLE'] = array(
'pc' => array(
    'page_h_config', 'do_h_config_1', 'do_h_config_2', 'do_h_config_3',
    'page_o_login', 'page_o_tologin', 'do_o_login',
),
'ktai' => array(
    'page_h_config',
));

このリストに追加するとフォームの右上やリンクの下に SSL 用のリンクが表示されユーザが SSL の使用をするか選択することができます。

ソフトバンク端末から mailto で件名と本文を入れる

1

携帯サイトを作成していて mailto リンクで件名と本文を指定するのに下記のように指定します。
<a href="mailto:メールアドレス?subject=件名&body=本文">
※件名と本文は URL エンコードする必要があります。

しかしソフトバンクの3GC 端末で件名と本文の日本語がメーラに渡せないという現象がありました。
そこで、日本語を UTF-8 に変換してから URL エンコードすると渡せるようになりました。
HTML ソース自体は Shift-JIS です。

ソフトバンクの開発資料を見直したのですが、そういう記述は見つけられませんでした。
どこかに書かれているのでしょうか?
それとももっとうまいやり方があるのかなぁ。

Go to Top