Cum se utilizează drupal_mail() pentru a trimite e-mailuri cu șablon personalizat (Drupal, 7, Cârlige, Emailuri)

Andy a intrebat.

Aș dori să folosesc drupal_mail() pentru a trimite e-mailuri, dar cu un șablon HTML personalizat, astfel încât acestea să fie în concordanță cu designul site-ului meu, dar sunt un novice în materie de cârlige și module etc., așa că aș aprecia un fel de explicație sau un ghid pentru începători, vă rog.

Pot să creez șablonul singur, trebuie doar să știu cum să obțin drupal_mail() să îl folosesc.

4 răspunsuri
Aneek Mukhopadhyay

Dacă încercați să trimiteți e-mailurile prin intermediul modulului dvs. personalizat, atunci puteți urma ghidul menționat mai jos. Să spunem că am avut un modul numit „Commerce Canvas(commerce_canvas)” 1. În primul rând, modificați funcția de mail din Drupal pentru a suporta link-uri și adăugați alte tipuri de codificare


/**
 * 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. Apoi, în continuare, agățați HOOK_mail în modulul dvs. ca

/**
 * 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. Apoi, trebuie să creați o funcție wrapper pentru a invoca mail-ul din modulul dvs.

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

Această funcție va trimite e-mailul și, de asemenea, va crea mesaje de depanare în cazul în care se întâmplă ceva greșit.Dar tot nu veți putea trimite e-mailul în format HTML, deoarece trebuie să extindeți funcția implicită din Drupal 7 DefaultMailSystem cu unul propriu. Deci, trebuie să faceți următoarele,


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("

", $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?
@', $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("
", $mimeheaders)
        );
    }
}


Apoi trebuie să înregistrați o nouă funcție de temă care va apela fișierul șablon personalizat în 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',
      ),

    );
  }
}

În cele din urmă trebuie să apelați această funcție de temă în momentul trimiterii e-mailului ca,



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: <strong>'.$order->field_tracking_number['und']['0']['value'].'</strong>'),

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

}

Acestea sunt fragmentele complete pentru a gestiona corect e-mailul HTML în Drupal 7, astfel, în hook_theme puteți da șablonul dvs. personalizat.

Comentarii

  • Vă mulțumesc foarte mult pentru răspuns – este exact ceea ce am cerut! Din păcate, acum că am văzut munca pe care o implică și că există module care ar putea face totul pentru mine, cred că voi aștepta înainte de a mă grăbi să îmi creez propriul cârlig. Cu toate acestea, nu pot să vă mulțumesc îndeajuns pentru răspunsul dumneavoastră, deoarece este tot ceea ce am cerut. Mi-aș dori să pot să dau mai multe voturi în sus decât o dată…  > Por Andy.
  • Minunat răspuns. Îmi place modul în care Drupal face lucrurile de bază atât de simple 😉 –  > Por artfulrobot.
  • But still you won't be able to send the HTML mail..., , corect. –  > Por Ejaz.
  • @Ejay, da, se poate. Acest lucru face asta. –  > Por Aneek Mukhopadhyay.
  • Pentru înregistrare: Este mai ușor să folosești următorul modul: drupal.org/project/simple_mail –  > Por gue.
AjitS

Dacă doriți să tematizați mailurile de ieșire cu ajutorul unor șabloane personalizate, trebuie să folosiți modulul HTML Mail .

Vă permite să tematizați mesajele în același mod în care tematizați restul site-ului dvs. web.

Funcționează bine cu alte module, cum ar fi Print, , Mail mime, , etc.

Trebuie să instalați modulele Mail System pentru a putea utiliza poșta electronică HTML.

Comentarii

  • Vă rugăm să rețineți că HTML Mail funcționează cu modulul Mail Mime, nu cu Mime Mail (Mime Mail și HTML Mail fac lucruri similare și se suprascriu reciproc). –  > Por Patrick Kenny.
  • @indrock Mulțumesc și eu pentru răspuns. Știți dacă pot folosi modulul HTML Mail pentru a tematiza e-mailurile trimise folosind codul php? –  > Por Andy.
monymirza

Exemplu de utilizare:

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

Comentarii

  • Este întotdeauna recomandat să trimiteți mailurile folosind drupal_mail() mai degrabă decât $system->mail(.. pentru a utiliza hook_mail_alter (care funcționează numai pentru mesajele trimise cu ajutorul funcției drupal_mail(). –  > Por AjitS.
  • Sunt pe deplin conștient de modul de utilizare a funcției (sintaxă / cod înțelept), aș dori doar să știu cum să fac o temă astfel încât să o pot aplica la toate e-mailurile trimise cu drupal_mail etc., dar vă mulțumesc oricum –  > Por Andy.
  • Folosesc acest cod, funcționează bine, dar la fel ca și un e-mail gol a trimite. –  > Por Vishal Sirsodiya.
Patrick Kenny

Pentru a trimite un e-mail HTML, puteți utiliza codul Mimemail modul. Odată ce este setat și configurat, puteți pur și simplu să pregătiți șablonul, să-l numiți mimemail-message.tpl.php, , să îl plasați în directorul de teme și acesta va fi aplicat automat la toate e-mailurile de ieșire (presupunând că ați configurat toate e-mailurile pentru a fi trimise prin Mimemail).

Configurarea modulului este probabil mai ușoară decât suprapunerea drupal_mail().

Comentarii

  • Vă mulțumesc pentru răspuns! Pot trimite e-mailuri folosind PHP cu acest modul? Dacă da, puteți să-mi arătați cum, vă rog? –  > Por Andy.
  • Mimemail, atunci când este combinat cu modulul Mail System, va prelua toate e-mailurile trimise de site. Astfel, toate e-mailurile trimise de orice modul, inclusiv modulele personalizate, vor fi trimise automat prin Mimemail. Dacă doriți să limitați ce e-mailuri sunt afectate, puteți utiliza opțiunile de configurare a modulelor din Mail System. –  > Por Patrick Kenny.
  • Cred că nu este exact ceea ce a întrebat Andy. Este adevărat, veți avea nevoie de modulul Mimemail sau de propriul MailSystem pentru a face acest lucru, dar poate că Andy a întrebat despre cum să tema corpul e-mailului, care ar trebui să se facă în funcția hook_mail() și un apel la theme(‘my_custom_theme’) în ea? –  > Por AKS.
  • Cred că @Andy vrea să știe dacă modulul Mimemail are o funcție care poate fi apelată pentru a trimite e-mailuri. –  > Por kiamlaluno.
  • @kiamlaluno Aveți dreptate, asta este ceea ce aș vrea să știu, vă rog –  > Por Andy.