[공식 메뉴얼]
...있기는 한데 메뉴얼이 영 친절하지 않아서 ㅎㅎㅎ
우선, 메일서버가 있어야 하는데 테스트용으로 구글 메일을 써 보기로 했다.
맨 처음으로 해야 할 일은 /config/app.php 에 메일전송 관련 셋팅을 바꾸어 주는 일!!
> /config/app.php
|
// 대충 180행 정도부터 시작되는 곳에 다음과 같이 수정을 해 준다..
'EmailTransport' => [
'default' => [
'className' => 'Smtp',
// The following keys are used in SMTP transports
'host' => 'ssl://smtp.gmail.com',
'port' => 465,
'timeout' => 30,
'username' => 'gmail계정',
'password' => 'gmail비밀번호',
'client' => null,
'tls' => null,
'url' => env('EMAIL_TRANSPORT_DEFAULT_URL', null),
],
],
|
다음은 구글 계정의 세큐리티 설정을 좀 손을 봐야 한다.
다음 링크에 들어가서 '보안 수준이 낮은 앱 사용' 옵션을 켜 주고...
다음 요 페이지에 들어가서 다음 버튼을 눌러서 확인하면 메일로 세큐리티 관련 경고 메일이 온다..
만약에 이 과정을 거치지 않으면 Cakephp에서 SMTP server did not accept the password. 같은 에러가 뜬다.
두 번째 단계는 UserMailer 를 작성한다.
프로젝트 폴더의 /src 에 /Mailer 폴더(없으면 만들면 됨..ㅋ) 안에 UserMailer.php 파일을 만들고 메일 셋팅을 한다.
참고로, 이 파일 안 만들고 그냥 사용하고 싶은 컨트롤러에 때려넣어도 상관은 없지만, 3.1 버전부터 분리해서 만들게 지원이 된다고 하니 이용하도록 하자.
> /src/Mailer/UserMailer.php
|
<?php
namespace App\Mailer;
use Cake\Mailer\Mailer;
use Cake\Mailer\Email;
class UserMailer extends Mailer
{
public function welcome($user)
{
$this
->profile('default')
->from(['보내는 사람 메일계정' => '보내는 사람명']) // 수신메일에 표시됨
->to($user->email) // 받는 사람 메일계정
->subject('안녕하세요 가입인사 입니다') // 제목
->template('welcome_mail') // 메일 템플릿
->emailFormat('html') // 메일 템플릿 옵션, html과 text중 고를 수 있음
->layout('default'); // 레이아웃
}
public function resetPassword($contract)
{
// passwordをランダムで再発行し、メールに添付する&データベースを更新する
}
}
?>
|
다음 단계로는 메일 보내는 기능을 구현하고 싶은 컨트롤러 (이번 예시에서는 ContractController.php) 에서 메일을 전송하는 함수를 구현하여 위에서 작성한 UserMailer 를 호출한다.
> /src/Controller/ContracrController.php
|
<?php
//... 네임스페이스 등 생략
use Cake\Mailer\MailerAwareTrait; // 필수 추가
class ContractController extends AppController
{
use MailerAwareTrait; // 필수 추가
// 여러가지 다른 함수도 생략...
// 여기서부터 메일전송 함수
public function mailSend($id = null)
{
$user = $this->Users->get($id);
if(isset($user))
{
$this->getMailer('User')->send('welcome',[$user]); // UserMailer에 있는 welcome 함수 호출하여 전송
$this->Flash->success(__('메일이 성공적으로 전송 되었습니다!!')); // 성공 메세지
return $this->redirect(['action' => 'index']);
}
else {
$this->Flash->error(__('메일 전송에 실패 하였습니다'));
}
}
//...다른 함수들 역시 생략...ㅋㅋ
|
다음은 메일 전송 버튼을 누르면 전송이 되게끔 만들어야 하므로 뷰에 버튼을 추가하고 컨트롤러 액션을 연결한다.
> /src/Template/Contract/index.ctp
|
<td>
<?= $this->Html->link(
'메일 전송',
['controller' => 'Contract', 'action' => 'mailSend', $user->id],
['class' => 'btn btn-success btn-xs', 'role' => 'button']
); ?>
</td>
|
거의 다 왔다...다음은 템플렛을 만든다. 템플렛 파일명은 UserMailer 에서 template('파일이름') 에 설정한 이름과 동일해야 한다. 이번에는 welcome_mail.ctp 가 된다. 이 파일을 두는 폴더는 emailFormat의 옵션에 따른다. 옵션은 html과 text 중 고를 수 있는데, html인 경우 /src/Template/Email/html 에, text인 경우 /src/Template/Email/text 에 파일이 있어야 한다. 이번 예제에서는 html을 옵션으로 적용하였으니 /src/Template/Email/html/welcome_mail.ctp 를 만들어서 원하는 디자인을 입히면 된다.
> /src/Template/Email/html/welcome_mail.ctp
|
<div class="container">
<div class="row">
<h2 class="text-center">회원 가입 감사합니다!!</h2>
<div class="row">
<div class="col-md-4 text-center">
<div class="box">
<div class="box-content">
<h1 class="tag-title">임시 패스워드 알림</h1>
<hr />
<p>안녕하세요, 임시 패스워드를 알려드립니다</p>
<p>계정명:testuser</p>
<p>패스워드:******</p>
<br />
<p>필히 아래의 링크에서 패스워드를 변경하신 후 서비스를 이용하시기 바랍니다.</p>
<br />
<a href="http://" class="btn btn-block btn-primary">패스워드 변경 페이지로 이동</a>
</div>
</div>
</div>
</div>
</div>
</div>
|
마지막으로, 메일전송 후에 보여줄 페이지가 필요한 경우에는 /src/Template/컨트롤러명/mail_Send.ctp (파일명은 컨트롤러에 작성한 파일명에 기반한다..컨트롤러에 mailSend 라는 함수를 만들었기에 작명기준에 따라서 mail_Send로 만들어야만 인식되니 주의!!) 등으로 만들면 된다..이번 경우에는 컨트롤러에서 전송 후 바로 인덱스 페이지에서 결과를 보여주게끔 했으므로 필요가 없어서 걍 에러 안 나게끔 파일만 만들어 두었다.
결과는 성공적으로 메일이 잘 도착했다.
프레임워크 안 쓰면 꽤나 번거로운 작업이라던데 상당히 간단하게 처리 할 수 있구나...라고 해도 공부하고 만드는데 약 3시간 소요 ㅋ
*잡담 : 일본과는 달리 한국에서는 cakephp 사용자가 거의 없는 듯 싶음..메뉴얼도 일본어는 있는데 한국어는 없음. 듣기로는 한국은 거의 JSP와 자바가 주류라는 듯..한국어 자료 구하기는 거의 불가능하고...좀 외롭네 그려 ㅎㅎ
저도 일본에서 이번에 cakephp로 프로젝트중이네여 ㅠㅠ 정말 자료가 없네여
답글삭제