タイトルが説明しているように、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になります。
残りのメールについては、他の回答で提案されているように、いくつかのモジュールをインストールする必要があります。
ありがとう。
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メールを送信できなかったと思います。上記のその他の代替(モジュール)を探す必要があります。
Hook_mailでも、ヘッダーをtext/htmlとして定義すると、次のようにHTML形式でメールを取得できます。
$message['headers']['Content-Type'] = 'text/html; charset=UTF-8; format=flowed';
HTML Mail モジュールをインストールして設定してみてください。
Webサイトの他の部分と同じ方法でメッセージのテーマを設定できます。
ヘッダーの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を送信するには、次のことを行う必要があります。
Drupalカスタムメールシステムクラスを使用することを知らせます
variable_set('mail_system', array('default-system' => 'ExampleMailSystem'));
Content-Typeヘッダーを「text/plain」から「html/plain」に設定します
_$message['headers']['Content-Type'] = 'text/html; charset=UTF-8; format=flowed';
_
このd.oのドキュメント。ソリューションを説明し、例を提供するのに良い仕事をします。