symfony advent calendar day twelve: Emails ========================================== 지난 줄거리 ----------- 어제 우리는 askeet 어플리케이션이 질문들을 다른 미디어 - RSS 피드 - 를 통해 전파할 수 있도록 확장하였습니다. Symfony 는 단순히 웹 페이지만을 위해 만들어지지 않았고, 오늘의 튜토리얼에서도 이를 증명해보이겠습니다. 우리는 MVC 구조의 장점을 살려서 이메일을 보내도록 할것입니다. 비밀번호 복구 ------------- 로그인 폼 들은 (모든 페이지에 있는 AJAX 로그인 폼과 상단 메뉴에서 연결되는 기존 방식의 로그인 폼) 사용자 이름과 비밀번호를 입력해야만 하지만 사용자들은 너무 자주 이들을 까먹습니다. 우리는 이런 경우를 위해 그들이 접속할 수 있는 방법을 제공해야 합니다. 우리는 비밀번호를 평문으로 저장하고 있지 않기 때문에, 비밀번호를 임의의 비밀번호로 재설정하고 그것을 사용자에게 이메일로 보내는 방식을 선택하겠습니다. 현재는 사용자가 자신의 비밀번호를 변경할 수가 없기 때문에, 임의의 비밀번호는 기억하기 매우 어려울 것입니다. 이는 추후에 논의하도록 하겠습니다. ### 비밀번호 요청 폼 `user` 모듈에 이메일 주소를 입력할 수 있는 폼을 출력할 새로운 액션을 만들겠습니다. `askeet/apps/frontend/modules/user/actions/action.class.php` 파일에 다음을 추가합니다. [php] public function executePasswordRequest() { } `modules/user/templates/` 폴더에 `passwordRequestSuccess.php` 파일을 만듭니다. [php]
Did you forget your password? Enter your email to receive your login details:
get('email'), 'style=width:150px') ?>Your login information was sent to
get('email') ?>
You should receive it shortly, so you can proceed to the .
이메일 발송 ----------- 좋습니다. 이제 사용자가 올바른 이메일 주소를 입력할 경우, `mail/sendPassword` 액션이 실행될 것입니다. 해당 액션을 만들어보겠습니다. ### 이메일 전송 액션 `mail` 모듈을 만듭니다. $ symfony init-module frontend mail `sendPassword` 액션을 추가합니다. [php] public function executeSendPassword() { $mail = new sfMail(); $mail->addAddress($this->getRequestParameter('email')); $mail->setFrom('AskeetDear askeet user,
A request for getSubject() ?> was sent to this address.
For safety reasons, the askeet website does not store passwords in clear. When you forget your password, askeet creates a new one that can be used in place.
You can now connect to your askeet profile with:
nickname:
password:
To get connected, go to the and enter these codes.
We hope to see you soon on
The askeet email robot
다른 템플릿들과 마찬가지로, 이메일 템플릿에서도 헬퍼 함수들은 (여기서 쓰인 `link_to()` 헬퍼 함수같은) 잘 동작합니다. 또한 이메일을 멋지게 보이게 하기 위한 어떠한 HTML 도 사용이 가능합니다. 첨부 이미지는, 액션에서 이미지를 첨부할때 지정한 값을 `cid:` 뒤에 붙여줌으로써 사용이 가능합니다. ### 메일 본문 대체 텍스트 만약 `sendPasswordSuccess.altbody.php` 템플릿 파일을 미리 저장해 둔다면, 이 파일은 이메일의 대체 텍스트로 사용됩니다. 이 대체 텍스트는 HTML 을 표시하지 않는 클라이언트에게 표시됩니다. [php] Dear askeet user, A request for getSubject() ?> was sent to this address. For safety reasons, the askeet website does not store passwords in clear. When you forget your password, askeet creates a new one that can be used in place. You can now connect to your askeet profile with: nickname: password: To get connected, go to the login page (http://www.askeet.com/login) and enter these codes. We hope to see you soon on askeet! The askeet email robot ### 설정 `sfMail` 의 출력관련 설정은 액션에서 정의되지만, 기타 다른 설정도 가능합니다. `mailer.yml` 파일을 생성하고 다음을 입력합니다. dev: deliver: off all: mailer: sendmail 이 설정을 통해 메일 발송시 사용할 프로그램을 지정하고, 개발환경에서는 메일을 보내지 않도록 하고 있습니다 (테스트 데이터의 이메일들은 가짜긴 하지만). 여러분은 사용자가 이 메일링 액션에 접근하는 것을 원치 않을 것입니다. `module.yml` 파일을 모듈의 `config/` 디렉토리에 만들고 다음을 입력합니다. all: is_internal: on ### 테스트 이제 새로운 비밀번호 복구 시스템을 테스트 해보겠습니다. 테스트 데이터에 여러분의 이메일을 사용한 새로운 사용자를 만들고 `import_data.php` 를 실행합니다. 캐시를 지우고 안정버전의 비밀번호 복구 페이지로 접속합니다. 여러분의 이메일을 입력하고 폼을 제출한 후, 이메일이 도착하는지 확인합니다.  내일 이 시간에 -------------- symfony 의 이메일 시스템은 간단하고 강력합니다. 간단한 이메일은 더할나위없이 간단하고, 복잡한 이메일도 HTML 을 작성하는 것보다 어렵지 않습니다. 이제 여러분의 다음 이메일 캠페인에는 상용 이메일 솔루션 대신 symfony 를 쓰시는게 좋을 것입니다... 어쨌든, 내일은 태그의 날입니다. Askeet 의 질문들에 태그를 달것이고, 이 태그들을 검색 가능하게 할 것이빈다. 그리고 여러분이 지금껏 상상해보지 못 한 멋진 태그 클라우드를 만들것입니다. 평소처럼, 오늘의 코드는 [askeet SVN 저장소](http://svn.askeet.com/tags/release_tag_12/) 에서 `/tags/release_day_12` 로 다운로드 가능합니다. 우리는 아직 21일째에 무엇을 할지 정하지 못 했습니다. [askeet 메일링 리스트](mailto:askeet-subscribe@symfony-project.com) 나 [askeet 포럼](http://www.symfony-project.com/forum/index.php/f/8/) 에 여러분의 의견을 남겨주시기 바랍니다.