drupal_mail ()을 사용하여 사용자 정의 템플릿으로 이메일을 보내는 방법


31

drupal_mail()기능 을 사용하여 전자 메일을 보내지 만 사용자 정의 HTML 템플릿을 사용하여 웹 사이트 디자인을 유지하고 싶지만 후크 및 모듈 등을 완전히 이해하고 있기 때문에 일종의 설명이나 초보자 가이드하십시오.

템플릿을 직접 만들 수 있으며 사용 방법을 알아야합니다 drupal_mail().

답변:


39

사용자 정의 모듈을 통해 메일을 보내려는 경우 아래 언급 된 가이드를 따르십시오. "Commerce Canvas (commerce_canvas)"라는 모듈이 있다고 가정 해 봅시다. 1. 먼저 Drupal의 메일 기능을 변경하여 링크를 지원하고 다른 인코딩 유형을 추가하십시오.


/**
 * Implements hook_mail_alter()
 * @param string $message
 */
function commerce_canvas_mail_alter(&$message) {
    $headers = array(
        'MIME-Version' => '1.0',
        'Content-Type' => 'text/html; charset=iso-8859-1; format=flowed',
        'Content-Transfer-Encoding' => '8Bit',
        'X-Mailer' => 'Drupal',
    );
    foreach ($headers as $key => $value) {
        $message['headers'][$key] = $value;
    }
}
  1. 그런 다음 HOOK_mail을 모듈에 다음과 같이 연결하십시오.

/**
 * Implements hook_mail()
 * @param string $key
 * @param string $message
 * @param unknown_type $params
 */
function commerce_canvas_mail($key, &$message, $params) {

    //Language Selection
    $options = array(
        'langcode' => $message['language']->language,
    );
    switch($key) {
        case "user_payment_notification" :
            $message['subject'] = isset($params['subject']) ? $params['subject'] : $message['subject'] = t('Payment recieved @site-name', array('@site-name' => variable_get('site_name', 'Express Canvas')), $options);
            $message['body'][] = isset($params['body']) ? $params['body'] : NULL;
            if (isset($params['headers']) && is_array($params['headers'])) {
                $message['headers'] += $params['headers'];
            }
            break;
    }
}


  1. 그런 다음 랩퍼 함수를 ​​작성하여 모듈에서 메일을 호출해야합니다.

function commerce_canvas_mail_send(array $values = array()) {
    $module = $values['module'];
    $key = $values['key'];
    $to = $values['to'];
    $from = $values['form'];
    $language = isset($values['lang']) ? $values['lang'] : language_default();
    $params = array(
        'subject' => $values['subject'],
        'body' => $values['body'],
    );
    if(array_key_exists('headers', $values)) {
        $params['headers'] = $values['headers']; //Assumed as an array
    }
    $send = TRUE;
    $mail = drupal_mail($module, $key, $to, $language, $params, $from, $send);
    if($mail['result']) {
        return TRUE;
    } else {
        $error_msg = 'Failed to send the email in commerce_canvas Module';
        watchdog('canvas-email', $error_msg, array(), WATCHDOG_ALERT);
        return FALSE;
    }
}

이 기능은 이메일을 보내고 문제가 발생하면 디버그 메시지를 생성합니다. 그러나 Drupal 7의 기본 DefaultMailSystem 을 자신 의 것으로 확장해야하기 때문에 여전히 HTML 메일을 보낼 수 없습니다 . 따라서 다음과 같이해야합니다.


class CommerceCanvasMailSystem extends DefaultMailSystem {
    /**
     * Concatenate and wrap the e-mail body for plain-text mails.
     *
     * @param $message
     *   A message array, as described in hook_mail_alter().
     *
     * @return
     *   The formatted $message.
     */
    public function format(array $message) {
        $message['body'] = implode("\n\n", $message['body']);
        return $message;
    }

    /**
     * Send an e-mail message, using Drupal variables and default settings.
     *
     * @see http://php.net/manual/en/function.mail.php
        * @see drupal_mail()
     *
     * @param $message
     *   A message array, as described in hook_mail_alter().
     * @return
     *   TRUE if the mail was successfully accepted, otherwise FALSE.
     */
    public function mail(array $message) {
        $mimeheaders = array();
        foreach ($message['headers'] as $name => $value) {
            $mimeheaders[] = $name . ': ' . mime_header_encode($value);
        }
        $line_endings = variable_get('mail_line_endings', MAIL_LINE_ENDINGS);
        return mail(
        $message['to'],
        mime_header_encode($message['subject']),
        // Note: e-mail uses CRLF for line-endings. PHP's API requires LF
        // on Unix and CRLF on Windows. Drupal automatically guesses the
        // line-ending format appropriate for your system. If you need to
        // override this, adjust $conf['mail_line_endings'] in settings.php.
        preg_replace('@\r?\n@', $line_endings, $message['body']),
        // For headers, PHP's API suggests that we use CRLF normally,
        // but some MTAs incorrectly replace LF with CRLF. See #234403.
        join("\n", $mimeheaders)
        );
    }
}


다음으로 hook_theme ()에서 사용자 정의 템플릿 파일을 호출 할 새 테마 함수를 등록해야합니다.


/**
 * Implements hook_theme();
 */
function commerce_canvas_theme($existing, $type, $theme, $path) {
  if($type == 'module') {
    return array(
      'tracking_code_email' => array(
        'variables' => array(
          'image_path' => NULL,
          'user' => NULL,
          'page' => NULL,
        ),
        'template' => 'commerce-canvas-tracking-code',
        'path' => drupal_get_path('module', 'commerce_canvas').'/theme',
      ),

    );
  }
}

마지막으로 이메일을 보낼 때이 테마 함수를 호출해야합니다.



function a_custom_function($params) {

$email_text_user = theme('tracking_code_email', array(
                    'image_path' => $base_url . '/' . drupal_get_path('module', 'commerce_canvas') . '/images',
                    'user' => null,
                    'page' => array(
                        'greet_text' => t('Thank you for your order at Express Canvas. Your order is ready and has shipped. You may track your order using FedEx tracking with your tracking number: '.$order->field_tracking_number['und']['0']['value'].''),

                    ),
                ));
$sent_to_user = commerce_canvas_mail_send($email_values_user);

}

이들은 Drupal 7에서 HTML 이메일을 올바르게 처리하기위한 전체 스 니펫이므로 hook_theme에서 사용자 정의 템플릿을 제공 할 수 있습니다.


1
답변 해 주셔서 대단히 감사합니다. 정확히 내가 요청한 것입니다! 불행히도 이제는 관련된 작업을 보았고 저를 위해 모든 것을 할 수있는 모듈이 있다는 것을 알았습니다. 내 자신의 후크를 만들기 위해 서두르 기 전에 기다릴 것이라고 생각합니다. 그러나 내가 요청한 모든 것이기 때문에 귀하의 답변에 대해 충분히 감사 할 수 없습니다. 나는 한 번 이상 찬성 투표 수 있으면 좋겠다
앤디

11
좋은 대답입니다. Drupal이 기본적인 것을 그렇게 간단하게 만드는 방식을 좋아합니다. ;-)
artfulrobot

1
But still you won't be able to send the HTML mail..., 권리.
Ejaz

@Ejay, 네 가능합니다. 그렇게합니다.
Aneek Mukhopadhyay

1
레코드 : 다음 모듈을 사용하는 것이 더 쉽습니다. drupal.org/project/simple_mail
gue

11

사용자 지정 템플릿을 사용하여 발신 메일을 테마로하려면 HTML 메일 모듈을 사용해야합니다 .

나머지 웹 사이트를 테마로하는 것과 같은 방식으로 메시지를 테마로 지정할 수 있습니다.

Print , Mail mime 등과 같은 다른 모듈과 잘 작동합니다 .

HTML 메일을 사용하려면 메일 시스템 모듈 을 설치해야합니다 .


1
HTML 메일은 Mime Mail이 아닌 Mail Mime 모듈과 함께 작동합니다 (Mime Mail과 HTML Mail은 유사한 작업을 수행하고 서로 재정의 함).
패트릭 케니

@indrock 답변도 감사합니다. PHP 코드를 사용하여 전송 된 이메일을 테마로 HTML 메일 모듈을 사용할 수 있는지 알고 있습니까?
Andy

4

사용법 예 :

    $module = 'module_name';
    $key = 'key';
    $language = language_default();
    $params = array();
    $from = NULL;
    $send = FALSE;
    $message = drupal_mail($module, $key, $email, $language, $params, $from, $send);

    $message['subject'] = $subject;
    $message['body'] = array();
    $message['body'][] = $line1;
    $message['body'][] = $line2;

    // Retrieve the responsible implementation for this message.
    $system = drupal_mail_system($module, $key);

    // Format the message body.
    $message = $system->format($message);

    // Send e-mail.
    $message['result'] = $system->mail($message);

4
항상 사용하여 메일을 전송하는 것이 좋습니다 drupal_mail()보다는 $system->mail(..사용하기 위해서는 hook_mail_alter사용하여 전송 전용 메일 작동 기능 ( drupal_mail().
AjitS

나는 기능 (구문 / 코드 현명한)을 사용하는 방법을 완전히 알고있다. 나는 테마를 만드는 방법을 알고 싶어서 drupal_mail등을 통해 전송 된 모든 이메일에 적용 할 수 있지만, 고맙다
Andy

이 코드를 사용하고 있지만 잘 작동하지만 하나의 빈 메일이 전송되었습니다.
vishal sirsodiya

3

HTML 이메일을 보내려면 Mimemail 모듈을 사용하면 됩니다 . 일단 설정하고 구성하면 템플릿을 준비하고 이름을 지정하고 mimemail-message.tpl.php테마 디렉토리에 놓으면 모든 발신 이메일에 자동으로 적용됩니다 (모든 메일이 Mimemail에서 발송되도록 구성한 경우). .

모듈을 설정하는 것이 우선하는 것보다 쉽습니다 drupal_mail().


답변 주셔서 감사합니다! 이 모듈과 함께 PHP를 사용하여 이메일을 보낼 수 있습니까? 그렇다면 어떻게 제발 보여줄 수 있습니까?
Andy

메일 시스템 모듈과 결합 된 Mimemail은 사이트에서 발송 한 모든 이메일을 대신합니다. 따라서 사용자 정의 모듈을 포함한 모든 모듈에서 보낸 모든 전자 메일은 Mimemail을 통해 자동으로 전송됩니다. 영향을받는 전자 메일을 제한하려는 경우 메일 시스템의 모듈 구성 옵션을 사용할 수 있습니다.
Patrick Kenny

1
앤디가 정확히 요구 한 것이 아니라고 생각합니다. 사실,이를 위해서는 Mimemail 모듈이 필요하거나 자신의 MailSystem을 롤링해야하지만 , hook_mail () 함수와 theme ( 'my_custom_theme') 호출에서 수행해야하는 이메일 본문 을 테마 화 하는 방법에 대해 Andy에게 질문 할 수 있습니다 .
AyeshK

1
@Andy는 Mimemail 모듈에 이메일을 보내기 위해 호출 할 수있는 기능이 있는지 알고 싶어합니다.
kiamlaluno

@kiamlaluno 당신은 맞습니다, 이것이 제가 알고 싶은 것입니다
Andy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.