2017-02-06 5 views
0

私のユーザモデルでは、新しいレコードを挿入した後にメールを送信する必要があります。あまりにも時間がかかるので、私は電子メールを送信するためのexicutionを待つことはできません。イベントハンドラをモデル自体の内部に使用しようとしましたモデル自体にyii2イベントハンドラを追加

class User extends ActiveRecord { 
    public function events() 
    { 
     return [ 
      User::EVENT_AFTER_INSERT => [$this, 'sendEmail'] 
     ]; 
    } 
    public function sendEmail(){ 
     Yii::$app->mailer->compose() 
      ->setTo($this->email) 
      ->setFrom(['mail address' => 'name']) 
      ->setSubject('Verify your Email') 
      ->setHtmlBody('<p>Please click on the <a href="'.Yii::$app->request->hostInfo.'/'.Yii::$app->params['frontEndUrl'].'#/verify-email/' 
       .$this->emailToken. 
       '">link</a> to verify your email</p>') 
      ->send(); 
    } 
} 

しかし、それは何の問題もありません。

答えて

0

あなたはおそらくJavaScriptのバックグラウンドから来ていますが、PHPのイベントはそのように動作しません(Javascriptではそうです)。イベントを発生させると、それは捕らえられますが、新しいプロセスには入りません。あなたが望んでいることをしても、電子メールが送信されるのを待っています。

解決策は、何らかの種類のキューを使用することです。最も単純なものは、DBの「電子メール」テーブルにレコードを挿入して移動するだけです。あなたは、電子メールテーブルを処理し、実際の電子メールを送信するcronジョブを持つことができます。

+0

メール確認ですので、CRONジョブとして設定することはできません。マンドリルのような即効性のあるメール以外のメールを送信する方法はありますか? –

+0

もちろん、あなたはcronとして送ることができます。あなたはなぜ技術的/論理的な配慮がありますか?もちろん、私はこれを過去に使ったマンドリルを使うこともできます。 https://packagist.org/packages/nickcv/yii2-mandrill –

+0

cronジョブの設定例を教えてください。新しいユーザーレコードが挿入されるたびにメールを即時に送信するにはどうしたらいいですか? –

関連する問題