Fuelphpでメール送信時にメールサーバーへ接続できないなどのエラーキャッチ

Fuelphpでメール送信時のエラーキャッチを「EmailValidationFailedException」「EmailSendingFailedException」だけでよいのかなって思っていたけど、SMTPサーバーに接続できないときの例外エラーはキャッチされなかった。

 

っということでメール送信時に

$email = Email::forge(array(必要な内容を記述));
try
 {
     $email->send();
 }
 catch(\EmailValidationFailedException $e)
 {
    // バリデーションが失敗したとき
    echo  = 'メールアドレスが正しくないため送信できませんでした。:'.$e->getMessage();
 }
 catch(\EmailSendingFailedException $e)
 {
    // ドライバがメールを送信できなかったとき
    echo 'メール送信に失敗しました。:'.$e->getMessage();
  } catch (\Exception $e) {
    echo = 'メール送信時のその他のエラーが発生しました。:'.$e->getMessage();
 }

 

「Exception」をcatchを付けてそれ以外のエラーをキャッチすることにした。

 

どのクラウドサービスだって停止することあるんだから、SMTPサーバーへのConnectエラーも考慮しなければならない。

 

初期のままSMTPを利用していると

「ot an unexpected response from host on command: [MAIL FROM:<メールアドレス>] expecting: 250 received:」

となってメールが送れなくなる

以下のようにemailドライバーのSMTPの部分を修正したほうが安全

https://github.com/fuel/email/commit/2eab3974e4c38b9fea0a7ebbad3d4e1f20076448

 

FuelPHPでAJAXのCSR対策のメモ

FuelPHPでAJAXのCSR対策のメモです。忘れちゃうので。

 

ViewでTOKENを呼び出す→POSTでTOKENを送るようにする

・js_fetch_tokenの呼び出し

<?php echo Security::js_fetch_token();?> 

 

・AJAXを作る

function save() 
{
    $.ajax({
        type:'post',
        url: "送信先URL",
        cache: false,
        data: { 
          fuel_csrf_token: fuel_csrf_token()
        },
        statusCode: { 
                404: function(){
                }
        },
    }).done(function(data, textStatus, jqXHR){

//結果を受けたった処理        

    }).fail(function(data, textStatus, errorThrown){
//送信失敗した時の処理

    });   

}

※「fuel_csrf_token」は、Configの「csrf_token_key」を変更している場合は、変更した名前を呼び出すようにする。

例:Config::get(‘security.csrf_token_key’);

 

・PHP側処理

if (Security::check_token()) {
//成功したときの処理
}

 

こんな感じで処理が可能。

FuelPHPでバリデーションで追加したルールを削除する方法

FuelPHPのバリデーションって便利で基本的に利用しています。その中で、自動的にルールをがつがつ追加するプログラムを作っていたのですが一部に限って例外が発生して、追加したルールを削除しなければならないということが発生しました。

削除ってあるのかなってバリデーション定義を除いていたところ、「delete_rule」なるものを発見!!FuelPHP 1.7のドキュメントにはありませんでしたが、探していたらFuelPHP 1.8のドキュメントに記載がありました。

 

↓記述方法は下記のようになるとこと。FuelPHP1.8のドキュメントはこちら

// フィールドから valid_string ルールを取り除く
$fieldset->field('fieldname')->delete_rule('valid_string');

// そして、必須項目の指定を取り除く
$message = $fieldset->field('fieldname')->delete_rule('required', true);

※FuelPHP1.8のドキュメントから抜粋

requiredの項目を取り除くときは「true」も必要とのこと。

 

FuelPHPでビューにHTMLデータをそのまま渡したい時のメモ

FuelPHPでビューにHTMLデータをそのまま渡したい時のメモ

 

■コントローラー側の設定

$this->template->content = \View::forge('index', $data);
$this->template->content->set_safe('html_data', $data['html_data']);

 

$this->template->contentでいつも通りVIEWのコンテンツを設定したのちにset_safeで生データ渡しの値をセットする。

 

FuelPHPでTASK処理時に環境を指定する

FuelPHPのタスク処理時に環境モードを指定して実行するには戦闘に「FUEL_ENV=production」と指定しておけばおけー。

 

# FUEL_ENV=production php ./pro/oil refine robots



                                        "KILL ALL HUMANS!"
                                  _____     /
                                 /_____\
                            ____[\*---*/]____
                           /\ #\ \_____/ /# /\
                          /  \# \_.---._/ #/  \
                         /   /|\  |   |  /|\   \
                        /___/ | | |   | | | \___\
                        |  |  | | |---| | |  |  |
                        |__|  \_| |_#_| |_/  |__|
                        //\\  <\ _//^\\_ />  //\\
                        \||/  |\//// \\\\/|  \||/
                              |   |   |   |
                              |---|   |---|
                              |---|   |---|
                              |   |   |   |
                              |___|   |___|
                              /   \   /   \
                             |_____| |_____|
                             |HHHHH| |HHHHH|

 

FuelphpでSMTPサーバーを利用したメール送信

■GMAIL以外

FuelPHPでSMTPサーバーを利用してメールを送信しようとしたら下記の個所の設定でハマって送信できませんでした。

(元)

'newline' => "\n",

(修正)

'newline' => "\r\n",

新しい行の設定でエラーが発生していた。

‘driver’ => ‘mail’でも’driver’ => ‘smtp’でも「newline」は修正した内容で問題ないみたい

 

■GMAILの場合

セキュリティ設定を下記のURLを参考に行う。

https://support.google.com/a/answer/6260879?hl=ja

 

FuelPHPでCSRF対策エラーでのメモ

FuelphpでCSRF対策していると

下記のように記載すると対策できますが、

if(Security::check_token()){
    //正しいポストのときの処理
}else{
    //不正なポストのときの処理
}

なぜか、今まで動いていたのに動かない事象が発生したのでメモとして残しておきます。

 

ヘッダーで、Scriptやlinkでなんだかんだ読み込みをしているかと思います。

これのどこかが影響しているっぽいのでヘッダーを疑うべし。

chromeの検証ツールでみたいたところ、どうも同じURLに対してGETだけをリクエストするのが通常の動作だったのですが、GETの前にHEADでリクエストしている動きを発見。

ファイルアップロードのjavascriptでHEADでアクセスしている箇所があったのでこれが影響。

原因は判明したがもっとセキュリティについても勉強しなくては。

 

Fuelphp自身がワンタイムトークンを利用している点も考慮しないとな。

Fuelphpでファイルアップロード時にエラー

PHPのフレームワークで最近、ハマっているのがFuelphpというフレームワークにハマっています。

簡単で便利でいろいろできちゃう!というのとPHPの対応バージョンでも気にっています。

プログラム開発をしているとファイルアップロードなんて当たり前!

基本的なものはFORMのタグの中に「enctype=”multipart/form-data”」と宣言して、あとはFUELPHP側でPOSTした値の受け取りとファイル処理。

ざっくりなコード的にはこんな感じで画像のアップロードとpublic/uploadフォルダにファイル保存が可能。ファイルには実行権限がいらないので644を設定。

// 初期設定:ファイル名はランダム、ファイルの種類は画像のみ
$config = array(
'path' => DOCROOT.'upload',
'randomize' => true,
'ext_whitelist' => array('img', 'jpg', 'jpeg', 'gif', 'png'),
'file_chmod' => 0644,
);

//アップロードプロセス実行
Upload::process($config);

//アップロードの値の検証
if (Upload::is_valid())
{

Upload::save(); //ファイル保存
}

 

で、実際にコードを記述してPOSTしてみたら・・・・

 

あれれ・・・・

 

ファイルアップロードエラー

 

「enctype=”multipart/form-data”」のタグの記載がないと・・・でもソースコードをみるとあるよ・・・。

 

うーん・・・・

 

あ!!

 

「enctype=”multipart/form-data”」の前に全角スペースが入っていた・・・(泣)

 

全角スペースが入るとこのようなエラーになる体験でした・・。

 
↓FuelPHPを初めて使うときに参考にさせていただきました。今でも利用中。