1

Cakephp で作業しており、ユーザー サインアップ時に確認リンクを送信したいのですが、SMTPについてはよくわかりません。ここに私が書いたものがあります私はトークンを使用して、ユーザーが同じ確認リンクを押すと次回期限切れになる電子メールを確認しています。 ユーザーコントローラー/サインアップ方法は次のとおりです。

 public function signup()
{
    $this->layout = 'main';
    if ($this->request->is('post')) {
        $this->User->create();
        $this->request->data['User']['password'] = AuthComponent::password($this->request->data['User']['password']);
        $hash = sha1($this->request->data['User']['username'] . rand(0, 100));
        $this->request->data['User']['tokenhash'] = $hash;
        if ($this->User->validates()) {
            $this->User->save($this->request->data);

            $ms = 'Click on the link below to complete registration ';
            $ms .= 'http://localhost/FindTutor/users/verify/t:' . $hash . '/n:' . $this->data['User']['username'] . '';
            $ms = wordwrap($ms, 70);
            $this->Email->from = 'usman.jamil0308@gmail.com';
            $this->Email->to = $this->request->data['User']['email'];
            $this->Email->subject = 'Confirm Registration..';
            $this->Email->send($ms);
            $this->Session->setFlash('Please Check your email for validation Link');
            $this->redirect('/users/login');
        }
    }
}

ユーザーが確認リンクをクリックしたかどうかを確認するためのusers/verifyメソッドは次のとおりです。

public function verify(){
    //check if the token is valid
    if (!empty($this->passedArgs['n']) && !empty($this->passedArgs['t'])){
        $name = $this->passedArgs['n'];
        $tokenhash = $this->passedArgs['t'];
        $results = $this->User->findByUsername($name);
        if ($results['User']['activate']==0){
            //check the token
            if($results['User']['tokenhash']==$tokenhash)
            {
                $results['User']['activate']=1;
                //Save the data
                $this->User->save($results);
                $this->Session->setFlash('Your registration is complete');
                $this->redirect('/users/login');
                exit;
            }
            else{
                $this->Session->setFlash('Your registration failed please try again');
                $this->redirect('/users/register');
            }
        }
        else {
            $this->Session->setFlash('Token has alredy been used');
            $this->redirect('/users/register');
        }
    }else
    {
        $this->Session->setFlash('Token corrupted. Please re-register');
        $this->redirect('/users/register');
    }

}

エラーは次のようなものです。

mail(): Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set()
4

3 に答える 3

0
  public $smtp = array(
    'host' => 'ssl://smtp.gmail.com',
    'port' => 465,
    'username' => 'your email id',
    'password' => 'your password',
    'transport' => 'Smtp',
    );


App::uses('CakeEmail', 'Network/Email');
$Email = new CakeEmail('smtp');
$Email->from('info@email.com');
$Email->to($email);
$message = "hello";
$Email->send($message);
于 2016-03-28T09:21:58.280 に答える
0
  1. 最初に、次のように App Controller に Email コンポーネントを含めます。

    public $components = array( '電子メール' );

  2. 次のように App コントローラーに sendMail 関数を作成します。

    public function _sendMail( $to, $from, $replyTo, $subject, $element,$parsingParams = array(),$attachments ="", $sendAs = 'html', $bcc = array()){       
        $ ポート = '';
        $タイムアウト = '';
        $ ホスト = '';
        $ユーザー名 = '';
        $パスワード = '';
        $ クライアント = '';

        $toAraay = 配列();
        if (!is_array($to)) {
            $toAraay[] = $to;
        } そうしないと {
            $toAraay = $to;
        }
        $this->Email->smtpOptions = array(
            'ポート' => "$ポート",
            'タイムアウト' => "$タイムアウト",
            'ホスト' => "$ホスト",
            'ユーザー名' => "$ユーザー名",  
            'パスワード' => "$パスワード",  
            'クライアント' => "$クライアント"
        );
        $this->Email->delivery = 'smtp';
        foreach ($parsingParams as $key => $value) {
            $this->set($key, $value);
        }
        foreach ($toAraay as $email) {
            $this->Email->to = $email;
            $this->Email->subject = $subject;
            $this->Email->replyTo = $replyTo;
            $this->Email->from = $from;
            if(!empty($bcc)){
                $this->Email->cc = $bcc[0];
            }

             if ($attachments!="") {
                $this->Email->attachments = array();
                $this->Email->attachments[0] = $attachments ;
            }
            $this->Email->template = $element;
            $this->Email->sendAs = $sendAs;
            $this->Email->send();

            $this->Email->reset();
        }
    }
  1. View/Emails/html に sendmail.ctp ファイルを作成する
    このコンテンツをファイルに追加し、ヘッダーまたはフッターも追加します

    <?php エコー $メッセージ; ?>

  2. メールを送信するときはいつでも、次のようにこの関数を呼び出します。

    $this->_sendMail($to, $from, $replyTo, $subject, 'sendmail', array('message' => $message), "", 'html', $bcc = array());

これで、確認メールのロジックを次のように実装できます。

$message = 'Click on the link below to complete registration ';
$message .= 'http://localhost/FindTutor/users/verify/t:' . $hash . '/n:' . $this->data['User']['username'] . '';

$from    = 'usman.jamil0308@gmail.com';
$to      = $this->request->data['User']['email'];
$subject = 'Confirm Registration..';
$replyTo =  'usman.jamil0308@gmail.com';    
$this->_sendMail($to, $from, $replyTo, $subject, 'sendmail', array('message' => $message), "", 'html', $bcc = array());
于 2016-03-29T09:47:42.593 に答える