Cara menggunakan drupal_mail () untuk mengirim email dengan templat khusus

31

Saya ingin menggunakan drupal_mail()fungsi untuk mengirim email tetapi dengan template HTML khusus sehingga sesuai dengan desain situs web saya, tetapi saya seorang pemula yang lengkap untuk pengait dan modul dll, jadi saya akan menghargai semacam penjelasan atau mohon panduan pemula.

Saya dapat membuat template sendiri, saya hanya perlu tahu cara drupal_mail()menggunakannya.

Andy
sumber

Jawaban:

39

Jika Anda mencoba mengirim surat melalui modul khusus Anda, maka Anda dapat mengikuti panduan yang disebutkan di bawah ini. Katakanlah, saya punya satu Modul yang disebut "Commerce Canvas (commerce_canvas)" 1. Pertama-tama Ubah fungsi surat Drupal untuk mendukung tautan dan menambahkan jenis penyandian lainnya


/**
 * 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. Lalu selanjutnya, kaitkan HOOK_mail di modul Anda sebagai

/**
 * 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. Maka Anda perlu membuat fungsi pembungkus untuk memohon surat dari modul Anda.

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

Fungsi ini akan mengirim email dan juga membuat pesan debug jika terjadi kesalahan. Tapi tetap saja Anda tidak akan dapat mengirim email HTML karena Anda perlu memperpanjang DefaultMailSystem default Drupal 7 dengan Anda sendiri. Jadi perlu dilakukan sebagai berikut,


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


Selanjutnya Anda perlu mendaftarkan fungsi tema baru yang akan memanggil file templat kustom Anda di hook_theme Anda ().


/**
 * 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',
      ),

    );
  }
}

Terakhir, Anda perlu memanggil fungsi tema ini saat mengirim email sebagai,



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

}

Ini adalah cuplikan lengkap untuk menangani email HTML dengan benar di Drupal 7 sehingga di hook_theme Anda dapat memberikan templat khusus Anda.

Aneek Mukhopadhyay
sumber
1
Terima kasih banyak atas jawaban Anda - persis seperti yang saya minta! Sayangnya sekarang saya telah melihat pekerjaan yang terlibat dan ada modul di luar sana yang bisa melakukan segalanya untuk saya, saya pikir saya akan menunggu sebelum saya terburu-buru membuat kait saya sendiri. Namun, saya tidak bisa cukup berterima kasih atas jawaban Anda karena itu semua yang saya minta. Saya berharap saya dapat memilih lebih dari satu kali
Andy
11
Jawaban yang bagus Saya suka cara Drupal membuat hal-hal dasar begitu sederhana ;-)
artfulrobot
1
But still you won't be able to send the HTML mail...benar
Ejaz
@ Bersenang-senanglah, ya Anda bisa. Ini melakukan itu.
Aneek Mukhopadhyay
1
Sebagai catatan: Lebih mudah menggunakan modul berikut: drupal.org/project/simple_mail
gue
11

Jika Anda ingin menentukan tema surat keluar dengan bantuan templat khusus, Anda harus menggunakan modul HTML Mail .

Memungkinkan Anda mengubah tema pesan dengan cara yang sama dengan tema lainnya di situs web Anda.

Ini berfungsi baik dengan modul lain, seperti Print , Mail mime , dll.

Anda harus menginstal modul Sistem Surat untuk menggunakan surat HTML.

Ajit
sumber
1
Harap perhatikan bahwa HTML Mail berfungsi dengan modul Mail Mime, bukan Mime Mail (Mime Mail dan HTML Mail melakukan hal serupa dan saling menimpa).
Patrick Kenny
@indrock Terima kasih atas jawaban Anda juga. Apakah Anda tahu jika saya bisa menggunakan modul HTML Mail untuk tema email yang dikirim menggunakan kode php?
Andy
4

Contoh penggunaan:

    $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);
monymirza
sumber
4
Selalu disarankan untuk mengirim email menggunakan drupal_mail()daripada $system->mail(..menggunakan hook_mail_alterfungsi (yang hanya berfungsi untuk email yang dikirim menggunakan drupal_mail().
AjitS
Saya sepenuhnya menyadari bagaimana menggunakan fungsi ini (sintaks / kode bijaksana), saya hanya ingin tahu cara membuat tema sehingga saya dapat menerapkan ke semua email yang dikirim dengan drupal_maildll, tetapi terima kasih tetap
Andy
Saya menggunakan kode ini, itu berfungsi dengan baik tetapi juga satu surat kosong telah dikirim.
vishal sirsodiya
3

Untuk mengirim email HTML, Anda dapat menggunakan modul Mimemail . Setelah diatur dan dikonfigurasikan, Anda cukup menyiapkan template, beri nama mimemail-message.tpl.php, letakkan di direktori tema Anda, dan itu akan secara otomatis diterapkan ke semua email keluar (dengan asumsi Anda telah mengkonfigurasi semua email yang akan dikirim oleh Mimemail) .

Menyiapkan modul mungkin lebih mudah daripada menimpa drupal_mail().

Patrick Kenny
sumber
Terima kasih atas jawaban Anda! Bisakah saya mengirim email menggunakan PHP dengan modul ini? Jika demikian, bisakah Anda menunjukkan kepada saya bagaimana caranya?
Andy
Mimemail, ketika dikombinasikan dengan modul Sistem Mail, akan mengambil alih semua email yang dikirim oleh situs. Dengan demikian, semua email yang dikirim oleh modul apa pun, termasuk modul khusus, akan secara otomatis dikirim melalui Mimemail. Jika Anda ingin membatasi e-mail mana yang terpengaruh, Anda dapat menggunakan opsi konfigurasi modul Sistem Mail.
Patrick Kenny
1
Saya pikir ini bukan apa yang Andy tanyakan. Benar, Anda akan memerlukan modul Mimemail atau roll MailSystem Anda sendiri untuk melakukan ini, tetapi mungkin Andy bertanya tentang bagaimana tema tubuh email yang harus dilakukan dalam fungsi hook_mail () dan panggilan tema ('my_custom_theme') di dalamnya?
AyeshK
1
Saya pikir @Andy ingin tahu apakah modul Mimemail memiliki fungsi yang dapat dipanggil untuk mengirim email.
kiamlaluno
@kiamlaluno Anda benar, ini yang ingin saya ketahui
Andy