web-dev-qa-db-ja.com

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

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

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

また、メールを受信して​​ソースを表示する場合:

Message-Id: <[email protected]>
X-Authentication-Warning: testserver : www-data set sender to [email protected] using -f
To: [email protected]
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: [email protected]
From: [email protected]

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になります。

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

ありがとう。

7
alechko

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 Mail または-のように、HTMLとしてメールを送信できるモジュールの1つを使用できます。 MIMEメール

編集:

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

10
AjitS

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

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

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

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

2
arpitr

ヘッダーの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';_

このd.oのドキュメント。ソリューションを説明し、例を提供するのに良い仕事をします。

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

0
aczietlow