drupal_mail()はメールからすべてのhtmlタグを取り除きます


7

タイトルが説明するように、drupal_mail()を使用してHTMLメールを送信すると、メールにはHTMLタグがありません。

    $module = 'module';
    $key = 'contact_message';
    $language = language_default();
    $params = array();
    $email = 'sender@email.com';
    $from = variable_get('site_mail', 'admin@example.com');
    $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);

そして、電子メールを受信し、ソースを表示するとき:

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] #

これで、HTMLタグが取り除かれていることがわかります。また、本文に挿入するHTMLタグは関係ありません。

Text Fomatsに関連しているのではないかと思ったのですが、「Filtered HTML」と「Full HTML」のアクティブなフィルターがあり、あらゆる権限が与えられています。


私を混乱させたのは、Ubercartの請求書でした。最初はHTMLで送信されましたが、ある時点で停止しました。彼らは平文を受け取った。@develkarの回答を少し掘り下げた後、私はこれをubercartの更新の1つで見つけました:

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

ある時点で、インストールされたモジュールの1つ(SMTPモジュールと思われる)がこの変数をオーバーライドしたと思います。そのため、メールはプレーンテキストで送信されていました。この更新を手動で再度実行すると、Ubercatの請求書は再びHTMLになります。

残りのメールについては、他の回答で提案されているように、いくつかのモジュールをインストールする必要があります。

ありがとう。

回答:


10

drupal_mail()は、デフォルトでメールをプレーンテキストとして送信します。

配列$message['headers']を出力すると、次のようになります。

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

ご覧のとおりContent-Type、メールヘッダーのはtext/plain; charset=UTF-8; format=flowed; delsp=yesです。このヘッダーをhook_mail_alter()で変更することで試すことができます。HTMLメールMIMEメールのように、HTMLとしてメールを送信できるモジュールの1つを使用できます。

編集:

@Ayeshと@alechkoのコメントに続き、APIを調べたところ、メールがプレーンテキストで送信される理由はヘッダーだけではないことがわかりました。なぜならdrupal_mail()、内部の呼び出し行うdrupal_mail_system()実装するオブジェクトを返し、MailSystemInterfaceのインターフェイスを。format()実施される方法は、drupal_mail_system()電子メールからHTMLを除去する責任があります。したがって、メールのヘッダーがHTMLである形式を示している場合でも、メールはプレーンテキストのみとして送信されます。したがって、を使用してHTMLメールを送信できなかったと思いますdrupal_mail()。上記のその他の代替(モジュール)を探す必要があります。


ctypeを設定しても、Drupalは準備ステップですべてのHTMLタグを取り除きます(メソッド名を思い出せません)。
AyeshK 2013年

受信したメールの出力を見ると、次のことがわかります。Content -Type:text / html; charset = UTF-8
alechko 2013年

@AyeshKあなたは正しいです。私は編集を行いました。HTMLの除去を担当する関数はdrupal_mail_sytem()です。
AjitS 2013年

@alechko編集用にご覧ください。
AjitS 2013年

ありがとう@develkar :)。実際、ヘッダーの変更 D6でうまく機能し、最近、HTMLメールを処理するカスタムメールクラスを作成する必要がありました。引き続きdrupal_mailを使用し、レンダリングメソッドのみをオーバーライドします。
AyeshK 2013年

3

hook_mailでも、ヘッダーをtext / htmlとして定義すると、次のようにHTML形式でメールを取得できます。

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

2

HTML Mailモジュールをインストールして設定してみてください。

Webサイトの他の部分と同じ方法でメッセージのテーマを設定できます。


試してみましたが、以前は同じインストールでHTMLメールを送信していたため、ネイティブソリューションを探していました。過去には「ヘルパーモジュール」はありませんでした。
alechko 2013年

0

ヘッダーのContent-Typeが何であるかは関係ありません。Drupalのデフォルトのメールシステムは、htmlをプレーンテキストに変換します。mail.incのDefaultMailSystem :: format()を参照してください

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

}

メッセージ本文に許可htmlを送信するには、次のことを行う必要があります。

  1. HTMLをプレーンテキストに変換しないformatメソッドを持つMailSystemInterfaceを実装するカスタムメールシステムクラスを作成する
  2. その新しいクラスをmodules.infoファイルに含めます
  3. カスタムメールシステムクラスを使用することをDrupalに知らせます

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

  4. Content-Typeヘッダーを「text / plain」から「html / plain」に設定します

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

このdoに関するドキュメントは、ソリューションを説明し、例を提供するのに適しています。

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


これは実行可能に見えます。一部のWebフォームのみのWebフォーム送信ハンドラーのように、特定の場合にのみmail_systemを切り替えることはできますか?
commonpike 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.