So senden Sie HTML-E-Mails

25

Ich erstelle ein einfaches Modul, das HTML-E-Mails an Benutzer für Angebote auf unserer Website sendet.

Ich habe viel gesucht, aber ich kann keine passende Lösung für Drupal finden. Jetzt kann ich aber Klartext Mails verschicken.

Was ist eine schrittweise Anleitung zum Versenden von HTML-E-Mails in Drupal 7?

function example_form_submit( $form,&$form_state) {
    $friend_email=$form_state['values']['friend_email'];
    $mailto =$friend_email;  //gift to a friend
    $mailfrom ='[email protected]';
    $subject = "another message for  HTML email from example.com";
    $body="<h2 style='font-size:28px;color:red;'>Hello EMAIL, i here i want to be <b>bolded</b></h2>";
    if (drupal_mail('example', 'send_gift', $mailto, language_default(),$params,$mailfrom,TRUE)) {
        drupal_set_message(t('Your gift was sent successfully!!!'));
    }
    else {
        drupal_set_message(t('<font color="red">Error occured while sending your mail!!!</font>'));
    }


/****hook_mail*/
function example_mail($key,&$message,$params) {
    $language = $message['language'];
    switch ($key) {
        case 'send_gift':
            $message['subject']=t($params['subject'], $var, $language->language);
            $message['body'][]=$params['body'];
            $message['headers']['Content-Type'] = 'text/html; charset=UTF-8; format=flowed';
        break;
    }
}
mrcniceguy
quelle
Sie übergeben keine vollständige HTML-Seite
GoodSp33d

Antworten:

22

Wie bereits erwähnt, besteht eine Option darin, das MIME-Mail-Modul zu verwenden. Sie können jedoch auch Ihr benutzerdefiniertes Modul aktivieren, um HTML-E-Mails mit etwas zusätzlichem Code zu senden. Kurz gesagt, Sie müssen die mail_systemVariable ändern und Ihre eigene Implementierung von schreiben MailSystemInterface. Ein Beispiel dafür ist der folgende Code.

In 'mymodule.install':

function mymodule_enable() {
  $current = variable_get('mail_system', array('default-system' => 'DefaultMailSystem'));
  $addition = array('mymodule' => 'MymoduleMailSystem');
  variable_set('mail_system', array_merge($current, $addition));
}

function mymodule_disable() {
  $mail_system = variable_get('mail_system', array('default-system' => 'DefaultMailSystem'));
  unset($mail_system['mymodule']);
  variable_set('mail_system', $mail_system);
}

In 'mymodule.module':

class MymoduleMailSystem extends DefaultMailSystem {
  public function format(array $message) {
    $message['body'] = implode("\n\n", $message['body']);
    $message['body'] = drupal_wrap_mail($message['body']);
    return $message;
  }
}

Sie müssten mymodule-Instanzen durch den Namen Ihres tatsächlichen Moduls ersetzen und dann Ihr Modul deaktivieren und wieder aktivieren, damit die Variable geändert wird, nachdem die Dinge funktionieren sollten. Ein vollständiges Beispiel finden Sie hier . Außerdem stammt diese Seite auf drupal.org von dort, wo ich ursprünglich alle Informationen erhalten habe.

Madis
quelle
2
Ich befolgte Ihre Anweisungen + das vollständige Beispiel, das Sie jetzt gaben, alles funktioniert ... Vielen Dank.
Mrcniceguy
7

Das Mime Mail- Modul ist mit ziemlicher Sicherheit das, wonach Sie suchen.

Dies ist ein Mime Mail-Komponentenmodul (zur Verwendung durch andere Module).

  • Es ermöglicht Benutzern den Empfang von HTML-E-Mails und kann von anderen Modulen verwendet werden. Die Mail-Funktionalität akzeptiert einen HTML-Nachrichtentext, mimt ihn und sendet ihn.
  • Wenn der HTML-Code eingebettete Grafiken enthält, sind diese Grafiken MIME-codiert und als Nachrichtenanhang enthalten.
  • Übernimmt den Stil Ihrer Site, indem Sie die Stylesheet-Dateien Ihres Themas automatisch in ein anpassbares HTML-Nachrichtenformat einfügen
  • Wenn die Präferenz des Empfängers verfügbar ist und dieser Klartext bevorzugt, wird der HTML-Code in Klartext konvertiert und unverändert gesendet. Andernfalls wird die E-Mail in themenbezogenem HTML mit einer Nur-Text-Alternative gesendet.
  • Ermöglicht es Ihnen, Nachrichten mit einem bestimmten Mailkey zu gestalten.
  • Konvertiert CSS-Stile in Inline-Stilattribute.
  • Bietet einfache System- und Regelaktionen zum Senden von HTML-E-Mails mit eingebetteten Bildern und Anhängen.
Geoff
quelle
5
Ich habe das Mimemail-Modul und das Mail-System heruntergeladen. Bitte erläutern Sie mir, wie Sie die Mimemail-Funktion für mein Modul als obigen Code aufrufen.
mrcniceguy
3

Vielleicht möchten Sie sich auch das Swift Mailer-Modul ansehen. Sie können HTML-E-Mails mit Inline- und normalen Anhängen (wie Bildern oder Dateien) senden. Darüber hinaus können auf Basis der HTML-E-Mail automatisch Klartextversionen generiert werden.

Sie können einen Blick darauf werfen http://www.drupal.org/project/swiftmailer

Für die Aufzeichnung: Ich bin der Autor und der Betreuer des Moduls.

sbrattla
quelle
2

Sie senden kein richtiges HTML, Sie schließen nur H1-Tags und B-Tags ein, wahrscheinlich müssen Sie auch vollständige HTML-Tags einschließen, beginnend mit
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

GoodSp33d
quelle
Vielen Dank für Ihren Kommentar, ich habe @Dooshta Beispiel verwendet, fügte auch die richtige HTML wie Sie vorgeschlagen .. alles funktioniert.
Mrcniceguy
Ich bin sicher, dass die Verwendung eines Doctype und die vollständige Validierung von HTML keinen Schaden anrichten, aber es ist nicht erforderlich, eine HTML-E-Mail über Drupal zu senden. Ich habe gerade das Tag doctype & html entfernt und die E-Mail in Gmail & Outlook gut gerendert. Allerdings ist es sehr wichtig , Dooshta die fix an seinem Platz zu haben: bevor ich diese Änderungen umgesetzt ich überhaupt keine HTML zu erzeugen , nicht in der Lage war.
doub1ejack
2

Keine der obigen Antworten hat für mich funktioniert, daher hier meine Ansicht zur ursprünglichen Frage.

Installieren und aktivieren Sie zunächst das Mime Mail- Modul. In der README.txt finden Sie eine vollständige Anleitung zur Verwendung. Ich gebe dir die kurze Version.

Sie müssen Mime Mail für Ihr Modul aktivieren. Sie können dies tun mit hook_enableoder hook_update_Nin example.install:

function example_enable() {
  mailsystem_set(array(
    'example_send_gift' => 'MimeMailSystem',
  ));
}

Wenn Sie zu gehen, werden admin/config/system/mailsystemSie feststellen, dass ein neuer Eintrag für Ihr Modul hinzugefügt wurde:

Beispielmodulklasse (send_gift key)

MimeMailSystem

Jetzt müssen Sie keine text/htmlHeader mehr spezifizieren , Mime Mail kümmert sich darum. Das brauchst du also nicht:

$message['headers']['Content-Type'] = ...

Wenn Sie möchten, können Sie $message['plaintext']Ihrer E-Mail eine andere als HTML-Alternative hinzufügen , dies ist jedoch nicht erforderlich.

Das ist es!

Wim Mostrey
quelle