2021년 목표설정

이미지
기본적으로 작년에 달성하지 못한 것들을 하려고 생각중인데..코로나가 언제까지 이어질지, 한국이나 북해도는 갈 수 있을지..자격증은 응시 가능할지..여러가지가 불확실하다. 2021년은 무엇보다 정신적인 부분과 경제적인 부분에 중점을 두고 조금 더 치열하게 지내보고 싶다. 일본나이로도 30대 마지막 해, 이제 불혹에 접어드는 나이..복잡하지만 심플하게. 육체적목표 : 트라이에슬론 스탠다드 도전하기 정신적 : 자격증2개 도전 + 자체개발 서비스 론칭 가족적 : 가정의 평화를 유지하기 경제적 : 외식과 유흥비를 줄이고 부수입을 늘려서 결과적으로 저축하기 사회적 : 목표세미나를 포함해서 민단과 개인인맥의 활성화와 교류를 촉진하기

cakephp3.5 에서 메일 발송하는 방법 정리

[공식 메뉴얼]
...있기는 한데 메뉴얼이 영 친절하지 않아서 ㅎㅎㅎ

우선, 메일서버가 있어야 하는데 테스트용으로 구글 메일을 써 보기로 했다.
맨 처음으로 해야 할 일은 /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와 자바가 주류라는 듯..한국어 자료 구하기는 거의 불가능하고...좀 외롭네 그려 ㅎㅎ

댓글

  1. 저도 일본에서 이번에 cakephp로 프로젝트중이네여 ㅠㅠ 정말 자료가 없네여

    답글삭제

댓글 쓰기

이 블로그의 인기 게시물

[메모] PostgreSQL에서 Insert 하는 경우 자동채번 PK가 중복에러 나는 경우

[C# & LINQ] 랜덤으로 데이터를 한 개 추출하는 방법

[react-native] uuid 생성이 에러가 날 때 대처법