Actions 기능을 이용해서 Mail을 보낼 때의 본문 개행(CRLF)이 안되는 문제

Actions 기능을 이용해서 Mail을 보낼 때의 본문 개행(CRLF)이 안되는 문제

[현상]

한 프로젝트에서 새로운 노드가 생성될 때마다 메일을 관리자에게 보낼 일이 생겼다.
그것 쯤이야 드루팔은 쉽게 구현한다. 트리거(방아쇠 조건)와 액션을 동원하면 되니까...

얼핏 보면 트리거 설정이 먼저일 것 같지만, 보통은 액션이 제각각이라서
액션을 먼저 설정하는 것이 순서이다.

관리 > 사이트 환경설정 > 액션 에서 새로운 액션으로 "메일 보내기"를 선택한다.
액션 설명("노드 생성시 메일 액션") 및 메일 제목/본문의 내용을 적절히 넣고,
수신자도 설정한 후 저장하면,
액션 타입이 system, 액션 방법은 "노드 생성시 메일 액션"이라는 액션이 생성된다.

그리고,
관리 > 사이트 구축 > 트리거 에서 "새로운 노드가 저장될 때"마다를 선택하고
아까 만든 "노드 생성시 메일 액션"을 선택해 주면, 새로운 컨텐츠가 생성될 때마다
메일이 멋지게 온다. 여기까지는 문제없이 잘 된다. 그런데...

메일 본문이 개행처리(CRLF)가 안된다! 특히 아웃룩으로 보면 본문이 엉망이다.
메일 본문에 일부러 \n 도 넣어봤지만 계속해서 다음 줄이 앞에 줄에 들러붙어 있다.
이를 어떻게 하면 좋을까.

[원인]

우선 Trigger / Actions 관련 소스를 찾아보았다. 메일 관련된 함수에 포맷 지정이 있을까 해서.
module/trigger/trigger.module 에는 메일 관련된 함수가 없었다. 이런...
module/system/system.module 에는... 다행히도 system_send_email_action 함수가 있었다.

그 system_send_email_action 함수의 내부를 쭈욱 따라가며 살펴보니,

  if (drupal_mail('system', 'action_send_email', $recipient, $language, $params)) {
  ...

라는 소스가 보이는데 아마도 이 부분이 액션과 관련된 메일 송신부로 보였다.

도대체 PHP 의 표준 메일 함수와는 너무 차이가 나는 파라미터들에 의아했다.
아마도 $params 가 메일 본문 내용 및 메일 포맷을 결정하는 인자가 들어있으리라?!

그래서 drupal_mail이라는 드루팔 표준 API를 조사했고, 아래와 같은 해결책을 얻었다.

[해결]

드루팔 6에서의 메일 송신에 관한 함수를 소개한 글이 있다.
drupal_mail이라는 드루팔 표준 API에 관한 설명과 사용 예제이다.
http://api.drupal.org/api/function/drupal_mail/6

그 중에 drupal_mail 함수의 중간 부분에 있는 곳이 눈에 띄었다.

  if (function_exists($function = $module .'_mail')) {
    $function($key, $message, $params);
  }

$module은 이미 인자의 형태로 'system'임을, $key는 'action_send_mail'임을 안다.
그렇다면 이 부분은 외부 모듈에서 지정한 메일 관련 함수를 hook하는 부분이다.
module/system/system.module 의 system_send_email_action 함수 근처를 살펴 봤다.
system_send_email_action 함수의 아래에, system_mail 이라는 함수가 보였다.
역시나 $module.'_mail' 부분이 호출되고 있는 것이다.

system_mail 함수의 중간을 살펴보면,

  $message['body'][] = drupal_html_to_text($body);

역시 drupal_html_to_text 라는 드루팔 API 함수가 메일 포맷 및 본문의 변형과 관계가 있다.
http://api.drupal.org/api/function/drupal_html_to_text/6

drupal_html_to_text 함수를 조사해 보면, 소스의 상단에 아래와 같은 태그 필터가 있다.

  if (empty($supported_tags)) {
    $supported_tags = array('a', 'em', 'i', 'strong', 'b', 'br', 'p', 'blockquote', 'ul', 'ol', 'li', 'dl', 'dt', 'dd', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr');
  }

이거 뭐냐. html 태그를 (스팸필터링 방지 등의 목적으로) 모두 없애는 줄 알았더니
특정 태그들은 통과시키네! 특히 개행 CRLF와 관련있는 br 태그도 허락하는구나!

결론 - 액션용 메일 본문의 개행(새 줄)하고 싶은 부분에 *** 그저 <br /> 태그를 넣으면 개행이 되는 것이었다. ***

발송 테스트 해 보니 아웃룩 등에서도 본문이 예쁘게 잘 보였다.

[재발방지]

특별히 없다. 액션을 이용한 메일 본문 기재법을 익히는 수 밖에.
좋은 공부가 됐다. Actions 으로 메일 보낼 때의 hook 구조를
조금이나마 엿볼 수 있는 기회였다.

아쉬운 것은, 특정 컨텐츠 타입을 생성할 때에만 메일을
발송하고 싶은 경우에는 아직 그 방법을 모른다. Trigger를 손봐야 할지도.
현재는 모든 컨텐츠 타입의 새로운 노드 생성에 전부 반응한다.
임시로 Actions 메일 송신 본문에 %node_type을 넣으면 구분이 되긴 한다.

* 참고) Actions 메일 송신시 제목과 본문에 사용가능한 변수들
%site_name, %username, %node_url, %node_type, %title, %teaser, %body

댓글

이제 두르팔로 메일 보내기 막 성공을 했습니다. 좋은

이제 두르팔로 메일 보내기 막 성공을 했습니다.

좋은 팁 감사드립니다!!