본문 바로가기

Server/PHP

[laravel] 아마존ses 드라이버로 메일 발송

하 드디어 이메일 붙이기 작업 끝냈다.

조금 돌아돌아 간 감이 없지 않은데 그래도 어느정도 수월하게 끝낸 것 같다.

아래는 최종코드

function sendMail($email, $mail_type, $data){
    $content = 메일 컨텐츠 text;
    $title = 메일 제목;

    if($content) {
        $data['enc_tr_cert'] = enc_tr_cert;
        $data['tr_url'] = url;
        $data['tr_add'] = add;

        $file = fopen(/...resources/views/mailling(생략가능)/$mail_type.blade.php","w");
        fwrite($file, $content);
        fclose($file);

        Mail::send("mailling.$mail_type", $data, function ($m) use($title, $email){
            $m->from('인증받은 email주소', '이름');
            $m->to($email);
            $m->subject($title);
        });
        //로그 저장
        $mCommon->insertMailLog($email, $title, $content);
    }
  }

$data 는 array 형식인데, key->value 형의 map 형으로 사용되고 있고,

blade.php 파일 내용은 html 형식으로 저장돼서

"<p>보낼메세지~~{{$content01}} ... ... {{$content02}} 입니다.</p>" 같은 내용으로 DB에 저장되어있다.

 

아래는 시행착오 목록들

01. 함수 내 함수에서 함수에서 정의된 변수 사용하기

아 이거 그 전에 이전에도 sql문 쓰다가 끝끝내 못 찾아서 빡쳤던 기억이 나는데 ㅋㅋㅋㅋ 그냥 php나 라라벨 이해도가 부족했던걸로...

함수 내에서 다른 함수를 사용할 때 (가령 위의 코드처럼 내부 함수를 사용한다거나) 내부함수에서 호출하는 함수에 정의된 변수를 너무너무너무 쓰고 싶었는데 못 썼던 기억이 아릿하다.

그런데 저렇게 function(매개변수) 뒤에 ues 로 기존 함수의 변수를 적으면 되는거였음..

아, 짜증나... 하면서도 일단 해결법을 알았으니 다행이다 싶었다.

 

02. 메일 보낼때 지정한 변수 사용하기

이거는 좀 케이스가 있는데 처음에는

1. send() 함수로 메일을 보내려 했는데 파일을 일일히 만들어줄 수가 없으니까(DB에서 내용을 가져다 쓸거라서) 포기

2. raw() 함수는 쌩 텍스트 그대로 보낼 수 있다기에 db에서 받아온 텍스트 값을 그대로 보냈다.

   물론 동작은 했는데 html 태그나 출력명령어 {{ $변수 }} 도 그대로 발송돼서 이마 짚..

3. 이전 다른 코드를 찾아보니 아예 파일을 생성해서 그 안에 db에 저장된 텍스트를 집어넣는? 아무튼 그런 방식을 쓰더라. 아무래도 이게 답이겠거니 싶어서 파일 관련 함수 가져다가 파일 생성까지는 성공. 근데 변수를 어떻게 보내지?

4. 아무리 똥꼬발랄 지랄을 떨어도 변수 출력이 안 되는 것이다.. {{$변수}}, {$변수}, {변수} ... 등등등 양식만 주구장창 바꿨는데 완전 헛짓이었음..

    어찌저찌 하다가 라라벨 공식 페이지에서 메일 발송 부분을 찾아봤는데 매개변수가 있는데에는 다 이유가 있는 법이니 뭔가 하다가 막히면 공식 페이지부터 뒤져보자... 시야가 좁아서 그걸 못 찾은 나자신 반성해라ㅠ

    아무튼 send() 함수의 경우 매개변수가 (보낼 파일, 파일 내에서 사용할 데이터 변수, callback함수) 인 것 같은데 정확한 expended 자료형은 모르겠다. 일단 아! 이 데이터로 보내는거구나! 찾았다! 싶었지.

5. 근데 데이터를 내부에서 어떻게 쓰느냐를 또 몰라서 별 뻘짓을 했는데 기본적으로 데이터는 map형식으로 사용하는 것 같고, 정의는 늘 그렇듯 key->value 로 값을 넣어주고. 생성한 blade.php 파일 내에서는 value 값을 그냥 변수처럼 {{$value}} 로 작성해두면 data로 넘겨준 값이 넘어가는 것!

 

요약

- Mail::raw(text, function($message){ ... }) 는 어찌됐든 날 text를 그냥 그대로 발송하는 거

- Mail::send(plainTextFile, $data, function($message)/*$callback*/ { ... }) 은 내가 지정한 플레인 텍스트 파일의 내용을 발송하는거.

- $data 는 Map 형식으로 예를들어 ['name'->$name, 'email'->$email] 라고 한다면, 발송할 텍스트 파일 내에서는 {{$name}}, {{$email}} 으로 작성해두면 함수에서 지정한 값으로 값이 대입된 후 메일이 발송된다. 

내가 헷갈렸어서 추가로 작성해두자면

Mali::send(plainTextFile, $data, $callback) 이든

Mali::send(plainTextFile, ['name'->$name, 'email'->$email], $callback) 이거든 간에 차이는 없고 추가로 값이

[ 'print_name'->$func_name, 'print_email'->$func_email ] 일 때 파일 내에서는 {{$print_name}}, {{$print_email}}으로 작성하면 되는거고, $func_name과 $func_email 은 함수 내에서 지정된 변수라는 것.