Verwendung von drupal_mail () zum Versenden von E-Mails mit benutzerdefinierten Vorlagen

31

Ich möchte die drupal_mail()Funktion zum Versenden von E-Mails verwenden, aber mit einer benutzerdefinierten HTML-Vorlage, damit sie mit dem Design meiner Website übereinstimmen. Ich bin jedoch ein absoluter Neuling in Bezug auf Hooks und Module usw., also würde ich mich über eine Erklärung oder eine Erklärung freuen Anfängerleitfaden bitte.

Ich kann die Vorlage selbst erstellen, ich muss nur wissen, wie ich drupal_mail()sie verwenden kann.

Andy
quelle

Antworten:

39

Wenn Sie versuchen, die E-Mails über Ihr benutzerdefiniertes Modul zu senden, können Sie der unten aufgeführten Anleitung folgen. Angenommen, ich hatte ein Modul namens "Commerce Canvas (commerce_canvas)". 1. Ändern Sie zuerst die Mail-Funktion des Drupal, um Links zu unterstützen und andere Codierungstypen hinzuzufügen


/**
 * 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. Dann haken Sie als nächstes die HOOK_mail in Ihr Modul ein als

/**
 * 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. Anschließend müssen Sie eine Wrapper-Funktion erstellen, um die E-Mail von Ihrem Modul aus aufzurufen.

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

Diese Funktion sendet die E-Mail und erstellt Debug-Meldungen, wenn etwas schief geht. Sie können die HTML-Mail jedoch nicht senden, da Sie das Standard- DefaultMailSystem des Drupal 7 mit Ihrem eigenen System erweitern müssen . So müssen Sie wie folgt vorgehen:


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


Als nächstes müssen Sie eine neue Designfunktion registrieren, die Ihre benutzerdefinierte Vorlagendatei in Ihrem hook_theme () aufruft.


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

    );
  }
}

Zuletzt müssen Sie diese Themenfunktion zum Zeitpunkt des Versendens der E-Mail aufrufen als,



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

}

Dies ist das vollständige Snippet, um die HTML-E-Mail in Drupal 7 korrekt zu behandeln. Sie können also in hook_theme Ihre benutzerdefinierte Vorlage angeben.

Aneek Mukhopadhyay
quelle
1
Vielen Dank für Ihre Antwort - genau darum habe ich gebeten! Leider habe ich jetzt die Arbeit gesehen und es gibt Module, die alles für mich tun können. Ich glaube, ich werde warten, bis ich meinen eigenen Hook erschaffe. Ich kann Ihnen jedoch nicht genug für Ihre Antwort danken, da dies alles ist, wonach ich gefragt habe. Ich wünschte, ich könnte mehr als einmal upvoten
Andy
11
Gute Antwort. Ich
mag
1
But still you won't be able to send the HTML mail..., Recht.
Ejaz
@Ejay, ja das kannst du. Das macht das.
Aneek Mukhopadhyay
1
Fürs Protokoll: Mit dem folgenden Modul ist es einfacher: drupal.org/project/simple_mail
gue
11

Wenn Sie die ausgehenden Mails mit Hilfe von benutzerdefinierten Vorlagen thematisieren möchten, sollten Sie das HTML-Mail- Modul verwenden.

Ermöglicht es Ihnen, Ihre Nachrichten so zu gestalten, wie Sie den Rest Ihrer Website gestalten.

Es funktioniert gut mit anderen Modulen, wie Print , Mail Mime , etc.

Sie müssen das Mail-System- Modul installieren , um HTML-Mail verwenden zu können.

Ajits
quelle
1
Bitte beachten Sie, dass HTML Mail mit dem Mail Mime-Modul funktioniert, nicht mit Mime Mail (Mime Mail und HTML Mail machen ähnliche Dinge und überschreiben sich gegenseitig).
Patrick Kenny
@indrock Danke auch für deine Antwort. Wissen Sie, ob ich das HTML-Mail-Modul zum Entwerfen von E-Mails verwenden kann, die mit PHP-Code gesendet wurden?
Andy
4

Anwendungsbeispiel:

    $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
quelle
4
Es wird immer empfohlen, die E-Mails mit zu senden, drupal_mail()anstatt $system->mail(..die hook_mail_alterFunktion (die nur für E-Mails funktioniert, die mit gesendet werden) zu verwenden drupal_mail().
AjitS
Ich weiß genau, wie man die Funktion benutzt (Syntax / Code), ich möchte nur wissen, wie man ein Thema erstellt, damit ich mich auf alle E-Mails anwenden kann, die mit drupal_mailetc gesendet werden , aber trotzdem danke
Andy
Ich benutze diesen Code, der funktioniert aber genauso gut wie eine leere Mail gesendet hat.
Vishal Sirsodiya
3

Zum Versenden von HTML-E-Mails können Sie das Mimemail- Modul verwenden. Sobald die Vorlage eingerichtet und konfiguriert ist, können Sie sie einfach vorbereiten, benennen mimemail-message.tpl.php, in Ihr Designverzeichnis ablegen und sie wird automatisch auf alle ausgehenden E-Mails angewendet (vorausgesetzt, Sie haben alle von Mimemail zu sendenden E-Mails konfiguriert). .

Das Einrichten des Moduls ist wahrscheinlich einfacher als das Überschreiben drupal_mail().

Patrick Kenny
quelle
Vielen Dank für Ihre Antwort! Kann ich mit diesem Modul E-Mails mit PHP senden? Wenn ja, können Sie mir bitte zeigen, wie es geht?
Andy
In Kombination mit dem Mail-System-Modul übernimmt Mimemail alle von der Site gesendeten E-Mails. Somit werden alle von einem Modul gesendeten E-Mails, einschließlich benutzerdefinierter Module, automatisch über Mimemail versendet. Wenn Sie einschränken möchten, welche E-Mails betroffen sind, können Sie die Konfigurationsoptionen für die Module des Mail-Systems verwenden.
Patrick Kenny
1
Ich denke, das hat Andy nicht genau gefragt. Es stimmt, müssen Sie Mimemail Modul oder Ihr eigenes Mailsystem rollen , dies zu tun , sondern kann Andy gefragt , wie zum Thema der E - Mail - Einrichtung , die in hook_mail () Funktion und ein Thema ( ‚my_custom_theme‘) Aufruf in ihm getan werden sollte?
AyeshK
1
Ich denke, @Andy möchte wissen, ob das Mimemail-Modul eine Funktion hat, die zum Versenden von E-Mails aufgerufen werden kann.
kiamlaluno
@ Kiamlaluno Sie sind richtig, das ist, was ich bitte wissen möchte
Andy