메일 전송 - swiftmailer Spool 방식
조회수 1.4k 등록일 2016.05.25 01:59:02

Symfony에서 swiftmailer 이용하여 메일 전송을 하는 경우 요청과 동시에 메일이 전송되어 집니다. 

이 경우 사용자는 응답을 받을 동안 한없이 기다리는 경우가 생기게 되죠. 

Symfony에는 크게 두가지의 Spool 방식이 있습니다. 

첫번째 기본설정인 memory는 메일 전송을 요청하면 사용자는 응답을 받을 때 까지 기다리게  되나 요청과 동시에 메일전송이 가능하다는 장점이 있고

두번째 file 은 메일의 메세지를 특정 경로에 위치한 파일에 저장하여 시스템의 요청에 의해 일괄 전송을 하나 사용자는 응답을 기다릴 필요가 없다는 장점이 있습니다. 


Spool의 방식을 설정하는 경로는 app/config/config.yml에서 가능합니다.


Spool - Memory

  1. #app/config/config.yml
  2. swiftmailer:
  3.    ...
  4.     spool:     { type: memory }

위의 언급했듯이 Symfony를 설치하게 되면 spool은 memory가 기본설정입니다.


Spool - File

  1. swiftmailer:
  2.   ...
  3.     spool:          
  4.         type: file
  5.         path: /Symfony/Spool

파일로 저장하여 시스템에 의해 전송되는 file 방식입니다. type은 file로, path는 메세지가 저장될 폴더의 경로를 입력해 주시면 됩니다.

만약 Spool 폴더가 웹서버에서 액세스하지 못한다면 가능하도록 권한을 변경해야 합니다.


모든 설정이 그렇듯 Symfony에서 설정을 변경하면 cache를 재생성 해주셔야 합니다.

  1. ../Symfony/app/console cache:clear --env=prod

자 이제 파일에 저장된 메세지를 전송할 차례입니다.

  1. app/console swiftmailer:spool:send --env=prod
  1. app/console swiftmailer:spool:send --message-limit=10 --env=prod
  1. app/console swiftmailer:spool:send --time-limit=10 --env=prod

파일에 저장된 모든 메세지를 전송하는 것과 메세지 수와 시간으로 제한하여 전송하는 방식  3가지의 옵션이 있습니다.


Spool 방식을 file로 할 경우에는 메일 전송을 위해선 매번 위의 명령어를 실행해야 합니다. 자동을 원하신다면 리눅스의 cron으로 위의 명령어를 주기적으로 호출 할 수 있도록 설정해 주면 됩니다.




Spool  방식을 file로 설정하여 주기적으로 메세지를 전송하는 방식에서 특정 상황, 즉, 회원가입 시 인증에 대한 메일 전송은 실시간으로 이뤄져야 하기에  php의 exec 함수를  사용하여 백그라운드로 처리하도록 응용 할 수 있습니다.

  1. exec('../app/console swiftmailer:spool:send --env=prod  > /dev/null &');