Cách sử dụng drupal_mail () để gửi email với mẫu tùy chỉnh


31

Tôi muốn sử dụng drupal_mail()chức năng để gửi email nhưng với mẫu HTML tùy chỉnh để chúng phù hợp với thiết kế trang web của tôi nhưng tôi là người mới hoàn toàn để móc và mô-đun, v.v., vì vậy tôi đánh giá cao một số loại giải thích hoặc người mới bắt đầu hướng dẫn xin vui lòng.

Tôi có thể tự tạo mẫu, tôi chỉ cần biết cách drupal_mail()sử dụng nó.

Câu trả lời:


39

Nếu bạn đang cố gắng gửi thư qua mô-đun tùy chỉnh của mình thì bạn có thể làm theo hướng dẫn được đề cập dưới đây. Giả sử, tôi đã có một Mô-đun gọi là "Canvas thương mại (Commerce_canvas)" 1. Trước tiên, hãy thay đổi chức năng thư của Drupal để hỗ trợ các liên kết và thêm các loại mã hóa khác


/**
 * 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. Sau đó, nối HOOK_mail trong mô-đun của bạn dưới dạng

/**
 * 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. Sau đó, bạn cần tạo một hàm bao bọc để gọi thư từ mô-đun của bạn.

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;
    }
}

Chức năng này sẽ gửi email và cũng như tạo thông báo gỡ lỗi nếu có gì sai. Nhưng bạn vẫn không thể gửi thư HTML vì bạn cần mở rộng DefaultMailSystem mặc định của Drupal 7 bằng chính bạn. Vì vậy, cần phải làm như sau,


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)
        );
    }
}


Tiếp theo, bạn cần đăng ký một chức năng chủ đề mới sẽ gọi tệp mẫu tùy chỉnh của bạn trong 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',
      ),

    );
  }
}

Cuối cùng, bạn cần gọi chức năng chủ đề này trong thời gian gửi email dưới dạng,



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);

}

Đây là đoạn mã đầy đủ để xử lý email HTML chính xác trong Drupal 7, do đó trong hook_theme bạn có thể cung cấp mẫu tùy chỉnh của mình.


1
Cảm ơn bạn rất nhiều vì câu trả lời của bạn - đó chính xác là những gì tôi yêu cầu! Thật không may bây giờ tôi đã thấy công việc liên quan và có những mô-đun ngoài đó có thể làm mọi thứ cho tôi, tôi nghĩ rằng tôi sẽ đợi trước khi tôi vội vàng tạo ra cái móc của riêng mình. Tuy nhiên, tôi không thể cảm ơn bạn đủ cho câu trả lời của bạn vì đó là tất cả mọi thứ tôi yêu cầu. Tôi ước tôi có thể nâng cao hơn một lần
Andy

11
Câu trả lời chính xác. Tôi yêu cách Drupal làm cho những điều cơ bản trở nên đơn giản ;-)
artfulrobot 16/07/13

1
But still you won't be able to send the HTML mail..., đúng.
Ejaz

@Ejay, vâng, bạn có thể. Điều này làm điều đó.
Aneek Mukhopadhyay

1
Đối với bản ghi: Dễ dàng hơn khi sử dụng mô-đun sau: drupal.org/project/simple_mail
gue

11

Nếu bạn muốn tạo chủ đề cho các thư gửi đi với sự trợ giúp của các mẫu tùy chỉnh, bạn nên sử dụng mô-đun Thư HTML .

Cho phép bạn tạo chủ đề cho tin nhắn của mình giống như cách bạn tạo chủ đề cho phần còn lại của trang web.

Nó hoạt động tốt với các mô-đun khác, như Print , Mail mime , v.v.

Bạn phải cài đặt mô-đun Hệ thống Thư để sử dụng thư HTML.


1
Xin lưu ý rằng HTML Mail hoạt động với mô-đun Mime Mail, không phải Mime Mail (Mime Mail và HTML Mail làm những việc tương tự và ghi đè lên nhau).
Patrick Kenny

@indrock Cảm ơn bạn đã trả lời quá. Bạn có biết nếu tôi có thể sử dụng mô-đun HTML Mail để gửi email chủ đề bằng mã php không?
Andy

4

Ví dụ sử dụng:

    $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
Chúng tôi luôn khuyến nghị gửi thư bằng cách sử dụng drupal_mail()chứ không phải $system->mail(..để sử dụng hook_mail_alterchức năng (chỉ hoạt động đối với thư được gửi bằng cách sử dụng drupal_mail().
AjitS

Tôi hoàn toàn nhận thức được cách sử dụng chức năng (cú pháp / mã khôn ngoan), tôi chỉ muốn biết cách tạo một chủ đề để tôi có thể áp dụng cho tất cả các email được gửi với drupal_mailvv, nhưng dù sao cũng cảm ơn bạn
Andy

Tôi đang sử dụng mã này, nó hoạt động tốt nhưng cũng như một thư trống đã gửi.
vishal sirsodiya

3

Để gửi e-mail HTML, bạn có thể sử dụng mô-đun Mimemail . Sau khi được thiết lập và định cấu hình, bạn chỉ cần chuẩn bị mẫu, đặt tên mimemail-message.tpl.php, thả nó vào thư mục chủ đề của mình và nó sẽ tự động được áp dụng cho tất cả các email gửi đi (giả sử bạn đã định cấu hình tất cả thư được gửi bởi Mimemail) .

Thiết lập mô-đun có lẽ dễ dàng hơn ghi đè drupal_mail().


Cảm ơn bạn vì câu trả lời! Tôi có thể gửi email bằng PHP với mô-đun này không? Nếu vậy, bạn có thể chỉ cho tôi làm thế nào?
Andy

Mimemail, khi được kết hợp với mô-đun Hệ thống Thư, sẽ tiếp quản tất cả các e-mail được gửi bởi trang web. Do đó, tất cả các e-mail được gửi bởi bất kỳ mô-đun nào, bao gồm các mô-đun tùy chỉnh, sẽ tự động được gửi qua Mimemail. Nếu bạn muốn giới hạn email nào bị ảnh hưởng, bạn có thể sử dụng các tùy chọn cấu hình mô-đun của Hệ thống thư.
Patrick Kenny

1
Tôi nghĩ rằng đây không phải là những gì Andy hỏi chính xác. Đúng, bạn sẽ cần mô-đun Mimemail hoặc cuộn MailSystem của riêng bạn để thực hiện việc này nhưng có thể Andy đã hỏi về cách tạo chủ đề cho phần thân email cần được thực hiện trong hàm hook_mail () và một chủ đề ('my_custom_theme') trong đó?
AyeshK

1
Tôi nghĩ rằng @Andy muốn biết liệu mô-đun Mimemail có chức năng có thể được gọi để gửi email không.
kiamlaluno

@kiamlaluno Bạn nói đúng, đây là những gì tôi muốn biết xin vui lòng
Andy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.