-----
Phần x41. CakePHP2
– updateAll, CakeEmail, config smtp
Xem (clip số 41c– chickenrainshop):
- Hàm updateAll
Viết tiếp xử lý cho hàm confirm():
[Controller\UsersController.php action confirm()]
public function confirm($code = null) {
$confirm
= false;
if
(!empty($code)) {
$user
= $this->User->findByCode($code);
if
(!empty($user)) {
$confirm
= true;
if
($this->request->is('post')) {
$this->User->set($this->request->data);
if
($this->User->validates()) {
if
($this->updatePassword($user['User']['id'])) {
//
xóa mã xác nhận trong cơ sở dữ liệu
$this->User->updateAll(['User.code'
=> null], ['User.id' == $user['User']['id']]);
$this->Flash->success('Đăng
nhập với mật khẩu mới!', ['key' => 'auth', 'params' => ['class' =>
'alert alert-success']]);
$this->redirect('/login');
}
}
else {
$this->Flash->error($this->User->validationErrors,
['params' => ['class' => 'alert alert-error']]);
}
}
}
}
$this->set('confirm',
$confirm);
$this->set('title_for_layout',
'Yêu cầu đổi mật khẩu mới');
}
[Controller\UsersController.php hàm updatePassword()]
private function updatePassword($id) {
$this->User->id
= $id;
if
($this->User->saveField('password',
$this->request->data['User']['password'])) {
return true;
} else {
return false;
}
}
Xem (clip số 41d– chickenrainshop):
- Gửi link confirm về email người dùng (41d)
- Sử dụng CakeEmail (1":00)
- Cấu hình smtp (6":44)
Khai báo sử dụng CakeEmail:
[Controller\UsersController.php]
<?php
App::uses('AppController', 'Controller');
App::uses('CakeEmail',
'Network/Email');
Đọc thêm về CakeEmail tại đây: https://book.cakephp.org/2.0/en/core-utility-libraries/email.html
Cấu hình smtp để gửi email trên máy cục bộ:
[Config\email.php]
public $smtp = array(
'transport'
=> 'Smtp',
'from'
=> array('email1@gmail.com' => 'Email1'),
'to'
=> 'email2@gmail.com',
'host'
=> 'ssl://smtp.gmail.com',
'port'
=> 465,
'timeout'
=> 30,
'username'
=> 'email1',
'password'
=> 'matkhau_email1',
'client'
=> null,
'log'
=> false,
//'charset'
=> 'utf-8',
//'headerCharset'
=> 'utf-8',
);
Thêm mã cho action forgotPassword()
[Controller\UsersController.php]
public function forgotPassword() {
$this->set('title_for_layout',
'Quên mật khẩu');
if
($this->request->is('post')) {
$user
= $this->User->findByEmail($this->request->data['User']['email']);
if
(!empty($user)) {
//
tạo mã xác thực
$code
= $this->Tool->generateCode();
//
tạo link để người dùng bấm vào
$linkConfirm
= 'http://local.chickenrainshop/xac-nhan/'.$code;
//
lưu code vào cơ sở dữ liệu
$this->User->id
= $user['User']['id'];
$this->User->saveField('code',
$code);
//
gửi email link xác nhận
$email
= new CakeEmail();
//
$email->from(['chickenrain@gmail.com' => 'Admin']);
//
$email->to([$user['User']['email'] => $user['User']['name']]);
//
$email->subject('Xác nhận thay đổi mật khẩu');
//
$email->send('Bạn vừa yêu cầu thay đổi mật khẩu, vui lòng nhấn vào link để
xác nhận: '.$linkConfirm);
$email->config('smtp')
//->from(['chickenrain@gmail.com'
=> 'Admin']);
//->to([$user['User']['email']
=> $user['User']['name']]);
->subject('Xác
nhận thay đổi mật khẩu')
->send('Bạn
vừa yêu cầu thay đổi mật khẩu, vui lòng nhấn vào link để xác nhận: '.$linkConfirm);
$this->Flash->success('Vui
lòng kiểm tra hộp thư để xác nhận yêu cầu!', ['params' => ['class' =>
'alert alert-success'], 'key' => 'forgot']);
}
else {
$this->Flash->error('Email
này chưa được đăng kí trên hệ thống', ['params' => ['class' => 'alert
alert-error'], 'key' => 'forgot']);
}
}
}
Do email của gmail được bảo mật, nên không cho ứng dụng được
phép truy cập vào để gửi email, kết quả là ứng dụng web sẽ bị lỗi. Nghĩa là ‘Allow
less secure apps’ đang ở chế độ OFF, cần chuyển sang chế độ ON để chạy
được đoạn mã và kiểm tra. Sau đó nhớ chuyển email về lại chế độ OFF để đảm bảo
an toàn cho hộp thư.
Đọc thêm tại đây: https://stackoverflow.com/questions/26399202/sending-activation-email-smtp-server-did-not-accept-the-password
-----------
Cập nhật 22/7/2017
-----------