drupal_mail () entfernt alle HTML-Tags aus E-Mails

7

Wie der Titel erklärt, enthält die E-Mail beim Senden einer HTML-E-Mail mit drupal_mail () keine HTML-Tags.

    $module = 'module';
    $key = 'contact_message';
    $language = language_default();
    $params = array();
    $email = '[email protected]';
    $from = variable_get('site_mail', '[email protected]');
    $send = TRUE;
    $message = drupal_mail($module, $key, $email, $language, $params, $from, $send);
    $message['headers']['Content-Type'] = 'text/html; charset=UTF-8';
    $message['subject'] = 'Test';
    $message['body'] = array();
    $message['body'][] = '<a href="#">Testing anchor in mail</a>';
    $system = drupal_mail_system($module, $key);
    $message = $system->format($message);
    $message['result'] = $system->mail($message);

Und wenn Sie die E-Mail empfangen und die Quelle anzeigen:

Message-Id: <201305090722.r497MLAV005654@test.server>
X-Authentication-Warning: testserver : www-data set sender to sender@email.com using -f
To: from@email.com
Subject: Test
X-PHP-Originating-Script: 1000:system.mail.inc
MIME-Version: 1.0
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 8Bit
X-Mailer: Drupal
Sender: sender@email.com
From: from@email.com

Testing anchor in mail [1]

[1] #

So können Sie sehen, dass alle HTML-Tags entfernt wurden. Und es spielt keine Rolle, welche HTML-Tags ich in den Body eingefügt habe.

Ich dachte, es könnte mit Text-Formaten zusammenhängen, aber ich habe aktive Filter "Gefiltertes HTML" und "Volles HTML" mit allen Berechtigungen.


Das, was mich verwirrte, waren die Ubercart-Rechnungen. Zuerst wurden sie mit HTML gesendet, und dann hörte es irgendwann auf. Sie erhielten Klartext. Nachdem ich ein bisschen @develkar Antwort gegraben habe, habe ich dies in einem der Ubercart-Updates gefunden:

/**
 * Installs HTML Mail System for Ubercart.
 */
function uc_store_update_7004() {
  // Set mail handler for all Ubercart modules
  variable_set('mail_system',
    array_merge(
      variable_get('mail_system', array('default-system' => 'DefaultMailSystem')),
      array(
        'uc_cart'  => 'UbercartMailSystem',
        'uc_order' => 'UbercartMailSystem',
        'uc_file'  => 'UbercartMailSystem',
        'uc_roles' => 'UbercartMailSystem',
        'uc_stock' => 'UbercartMailSystem',
        'uc_store' => 'UbercartMailSystem',
      )
    )
  );
}

Ich vermute, dass irgendwann eines der installierten Module (ich vermute das SMTP-Modul) diese Variable überschrieben hat, und deshalb kamen E-Mails als einfacher Text. Nachdem Sie dieses Update erneut manuell ausgeführt haben, sind Ubercat-Rechnungen wieder HTML-Rechnungen.

Für den Rest der E-Mails muss ich einige Module installieren, wie in anderen Antworten vorgeschlagen.

Danke.

Alechko
quelle

Antworten:

10

drupal_mail () sendet standardmäßig eine Mail als Klartext.

Wenn Sie das Array ausdrucken $message['headers'], erhalten Sie Folgendes:

array(
    'MIME-Version' => '1.0',
    'Content-Type' => 'text/plain; charset=UTF-8; format=flowed; delsp=yes',
    'Content-Transfer-Encoding' => '8Bit',
    'X-Mailer' => 'Drupal',
  );

Wie Sie sehen können, ist der Content-Typeim Mail-Header text/plain; charset=UTF-8; format=flowed; delsp=yes. Sie können versuchen, indem Sie diesen Header in hook_mail_alter () ändern . Sie können eines der Module verwenden, mit denen Sie die Mail als HTML senden können, z. B. HTML Mail oder Mime Mail .

Bearbeiten:

Nach den Kommentaren von @Ayesh und @alechko und nach Prüfung der APIs stellte ich fest, dass die Header nicht der einzige Grund sind, die E-Mail als Klartext zu senden. Weil drupal_mail()intern drupal_mail_system () aufgerufen wird , das ein Objekt zurückgibt, das die MailSystemInterface- Schnittstelle implementiert . Die von format()implementierte Methode drupal_mail_system()ist dafür verantwortlich, den HTML-Code aus den E-Mails zu entfernen. Selbst wenn in den Kopfzeilen der E-Mails die Formate HTML angezeigt werden, werden die E-Mails nur als einfacher Text gesendet. Ich denke also, man konnte keine HTML-Mail mit senden drupal_mail(). Sie sollten nach einer anderen Alternative (Modul) suchen, die oben erwähnt wurde.

AjitS
quelle
Obwohl Sie den ctype festlegen, entfernt Drupal alle HTML-Tags im Vorbereitungsschritt (der Methodenname kann nicht gespeichert werden).
AyeshK
Wenn Sie in meine Ausgabe der empfangenen E-Mails schauen, sehen Sie Folgendes: Inhaltstyp: text / html; Zeichensatz = UTF-8
Alechko
@ AyeshK Du hast recht. Ich habe die Bearbeitung vorgenommen, die Funktion, die für das Entfernen von HTML verantwortlich ist, ist drupal_mail_sytem().
AjitS
@alechko Bitte beachten Sie für die Bearbeitung.
AjitS
Danke @develkar :). Tatsächlich ist der Kopfwechsel tut den Trick in D6, und ich vor kurzem eine eigene Mail - Klasse erstellen , musste HTML - E - Mails handhaben . Verwenden Sie weiterhin drupal_mail und überschreiben Sie nur die Rendering-Methoden.
AyeshK
3

In hook_mail können Sie die Header auch als text / html definieren. Anschließend erhalten Sie Mail als HTML-Format, wie zum Beispiel:

$message['headers']['Content-Type'] = 'text/html; charset=UTF-8; format=flowed';
Ankita
quelle
2

Probieren Sie es mit installiertem und konfiguriertem HTML Mail- Modul aus.

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

arpitr
quelle
Ich habe es versucht und es hat funktioniert, aber ich habe nach einer nativen Lösung gesucht, da in der Vergangenheit bei derselben Installation HTML-E-Mails gesendet wurden und ich nach einiger Zeit bemerkt habe, dass die E-Mails entfernt wurden. Ich hatte in der Vergangenheit keine "Hilfsmodule".
Alechko
0

Es spielt keine Rolle, wie der Header-Inhaltstyp lautet. Das Standard-Mail-System von Drupal konvertiert HTML in einfachen Text. Siehe DefaultMailSystem :: format () in mail.inc

<?php
public function format(array $message) {
// Join the body array into one string.
$message['body'] = implode("\n\n", $message['body']);
// Convert any HTML to plain-text.
$message['body'] = drupal_html_to_text($message['body']);
// Wrap the mail body for sending.
$message['body'] = drupal_wrap_mail($message['body']);
return $message;

}}

Um HTML im Nachrichtentext zu senden, müssen Sie:

  1. Erstellen Sie eine benutzerdefinierte Mail-Systemklasse, die MailSystemInterface implementiert und über eine Formatmethode verfügt, die HTML nicht in einfachen Text konvertiert
  2. Fügen Sie diese neue Klasse in Ihre Datei modules.info ein
  3. Teilen Sie Drupal mit, dass Sie Ihre benutzerdefinierte Mail-Systemklasse verwenden möchten

    variable_set('mail_system', array('default-system' => 'ExampleMailSystem'));

  4. Setzen Sie den Content-Type-Header von "text / plain" auf "html / plain".

    $message['headers']['Content-Type'] = 'text/html; charset=UTF-8; format=flowed';

In dieser Dokumentation zu do wird die Lösung gut beschrieben und ein Beispiel bereitgestellt.

https://www.drupal.org/docs/7/converting-drupal-6-modules-to-drupal-7/creating-html-formatted-emails-in-drupal-7#comment-11792179

aczietlow
quelle
Das sieht machbar aus. Wäre es möglich, das mail_system nur zu bestimmten Anlässen zu wechseln, wie in einem Webformular-Übermittlungs-Handler nur für einige Webformulare?
Commonpike