カスタムモジュールから送信される送信メールをHTML形式にしたいのですが、方法がわかりません。
これは私の送信機能です:
//create an array from the companies in the db in a comma separated list
$companies = db_query("SELECT companies FROM {offer} WHERE id = $id")->fetchField();
$companies = explode(',', $companies);
// Set some variables
$from = '[email protected]';
$subject = 'Sent mail';
$module = 'mymodule';
$key = 'mykey';
$language = language_default();
$params = array();
$send = TRUE;
// the data
$question = db_query("SELECT message FROM {offer} WHERE id = $id")->fetchField();
$name = db_query("SELECT name FROM {offer} WHERE id = $id")->fetchField();
$mail = db_query("SELECT mail FROM {offer} WHERE id = $id")->fetchField();
$phone = db_query("SELECT phone FROM {offer} WHERE id = $id")->fetchField();
$compname = db_query("SELECT compname FROM {offer} WHERE id = $id")->fetchField();
$comptype = db_query("SELECT comptype FROM {offer} WHERE id = $id")->fetchField();
// Sort the companies
foreach($companies as $company) {
$message = drupal_mail($module, $key, $company, $language, $params, $from, $send);
// Create the mail content
$message['subject'] = $subject;
$message['body'] = array();
$message['body'][] = 'THe HTML MAIL HERE';
// Retrieve the responsible implementation for this message.
$system = drupal_mail_system($module, $key);
// Format the message body.
$message = $system->format($message);
// Send e-mail.
$message['result'] = $system->mail($message);
// Update table where sent to 1
$update = db_update('offer')
->fields(array(
'sent' => '1',
))
->condition('id', $id, '=')
->execute();
// Set message of performed action
drupal_set_message('Done');
$form_state['redirect'] = 'admin/content/offer';
cache_clear_all();
}
drupal_mail()はデフォルトでtext/plainヘッダーを追加します。ここには3つのオプションがあります。
class YourMailSystem implements MailSystemInterface {
/**
* Concatenate and wrap the e-mail body for plain-text mails.
*
* @param $message
* A message array, as described in hook_mail_alter().
*
* @return
* The formatted $message.
*/
public function format(array $message) {
$message['body'] = implode("\n\n", $message['body']);
if ($message['module'] == 'your_module') {
$body = $message['body'];
$message['body'] = array();
// Convert any HTML to plain-text.
$message['body']['plain'] = drupal_html_to_text($body);
$message['body']['plain'] = drupal_wrap_mail($message['body']['plain']);
// Wrap the mail body for sending.
$message['body']['html'] = drupal_wrap_mail($body);
} else {
$message['body'] = drupal_wrap_mail($message['body']);
}
return $message;
}
/**
* Send an e-mail message, using Drupal variables and default settings.
*
* @see <a href="http://php.net/manual/en/function.mail.php
" title="http://php.net/manual/en/function.mail.php
" rel="nofollow">http://php.net/manual/en/function.mail.php
</a> * @see drupal_mail()
*
* @param $message
* A message array, as described in hook_mail_alter().
* @return
* TRUE if the mail was successfully accepted, otherwise FALSE.
*/
public function mail(array $message) {
$mimeheaders = array();
if ($message['module'] == 'your_module') {
$separator = md5(time());
// carriage return type (we use a PHP end of line constant)
$eol = PHP_EOL;
// main header
$message['headers']['From'] = $message['from'];
$message['headers']['Sender'] = $message['from'];
$message['headers']['Return-Path'] = $message['from'];
$message['headers']['Reply-to'] = $message['from'];
$message['headers']['Errors-To'] = $message['from'];
$message['headers']['Content-Type'] = "multipart/alternative; boundary=\"".$separator."\"";
// message
$body = "--".$separator.$eol;
$body .= "Content-Type: text/plain; charset=\"UTF-8\"; format=\"flowed\"; delsp=\"yes\"".$eol;
$body .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
$body .= $message['body']['plain'].$eol;
// message
$body .= "--".$separator.$eol;
$body .= "Content-Type: text/html; charset=\"UTF-8\"; format=\"flowed\"; delsp=\"yes\"".$eol;
$body .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
$body .= $message['body']['html'].$eol;
$body .= "--".$separator."--";
foreach ($message['headers'] as $name => $value) {
$mimeheaders[] = $name . ': ' . mime_header_encode($value);
}
$line_endings = variable_get('mail_line_endings', MAIL_LINE_ENDINGS);
$sendM = mail(
$message['to'], mime_header_encode($message['subject']),
preg_replace('@\r?\n@', $line_endings, $body),
join("\n", $mimeheaders)
);
return $sendM;
} else {
$message['headers']['From'] = $message['from'];
$message['headers']['Sender'] = $message['from'];
$message['headers']['Return-Path'] = $message['from'];
$message['headers']['Reply-to'] = $message['from'];
$message['headers']['Errors-To'] = $message['from'];
$message['headers']['Content-Type'] = 'text/html; charset=UTF-8; format=flowed; delsp=yes';
if(isset($message['customMode']) && $message['customMode'] == 1) {
$message['headers']['Content-Type'] = 'text/plain; charset=UTF-8; format=flowed; delsp=yes';
}
foreach ($message['headers'] as $name => $value) {
$mimeheaders[] = $name . ': ' . mime_header_encode($value);
}
$line_endings = variable_get('mail_line_endings', MAIL_LINE_ENDINGS);
$heads = join("\n", $mimeheaders);
$sendM = mail(
$message['to'], mime_header_encode($message['subject']),
// Note: e-mail uses CRLF for line-endings. PHP's API requires LF
// on Unix and CRLF on Windows. Drupal automatically guesses the
// line-ending format appropriate for your system. If you need to
// override this, adjust $conf['mail_line_endings'] in settings.php.
preg_replace('@\r?\n@', $line_endings, $message['body']),
// For headers, PHP's API suggests that we use CRLF normally,
// but some MTAs incorrectly replace LF with CRLF. See #234403.
$heads
);
return $sendM;
}
}
}
次に、モジュールに次のようなmailSystemの使用法を実装する必要があります。
function hook_install() {
variable_set('mail_system', array_merge(
variable_get('mail_system', array('default-system' => 'DefaultMailSystem')), // Previously set mail_system variable
array('your_module' => 'YourMailSystem') // My new key(s) which ADD to the previous keys
)
);
}
function hook_uninstall() {
// Unset module keys in variable mail_system
$mail_system = variable_get('mail_system', array('default-system' => 'DefaultMailSystem'));
unset($mail_system['your_module']);
variable_set('mail_system', $mail_system);
}
function hook_mail($key, &$message, $params) {
global $language;
// We can define more then one email template, naming is by key
//global $language;
switch ($key) {
case 'registration':
// note: data can be passed to this function in the $params array
$body = ''; // GET YOUR BODY CONTENT
$subject = ''; // YOUR SUBJECT HERE
break;
case 'remind_pass':
// note: data can be passed to this function in the $params array
$body = ''; // GET YOUR BODY CONTENT
$subject = ''; // YOUR SUBJECT HERE
break;
}
$message['subject'] = $subject;
$message['body'] = array();
$message['body'][] = '<html><body>';
$message['body'][] = $body;
$message['body'][] = '</body></html>';
return $message;
}
このmailSystemを使用するには、次のようにモジュールからdrupal_mailを呼び出します。
drupal_mail('your_module', 'remind_pass', '[email protected]', language_default(), $params, '[email protected]', true);
注意事項:この実装は、複数の電子メールタイプ、つまり、プレーンとHTMLを一度に送信します。添付ファイルをサポートするために、これをさらに改善することもできます。
この実装は、カスタムモジュールコンテンツを探してplain/htmlとして処理します。取得されない場合は、すべてのものをデフォルトとして送信します:text/plain。
Mime Mail モジュールを試すことができます。
これはMime Mailコンポーネントモジュールです(他のモジュールで使用するため)。
- これにより、ユーザーはHTMLメールを受信でき、他のモジュールで使用できます。メール機能は、HTMLメッセージ本文を受け入れ、mime-endcodeして送信します。
- HTMLにグラフィックが埋め込まれている場合、これらのグラフィックはMIMEエンコードされ、メッセージの添付ファイルとして含まれます。
- テーマ設定可能なHTMLメッセージ形式でテーマのスタイルシートファイルを自動的に含めることにより、サイトのスタイルを採用します
- 受信者の設定が利用可能であり、プレーンテキストを好む場合、HTMLはプレーンテキストに変換され、そのまま送信されます。それ以外の場合、メールはプレーンテキストの代替を含むテーマ化可能なHTMLで送信されます。
- 特定のメールキーでメッセージのテーマを設定できます。
- CSSスタイルをインラインスタイル属性に変換します。
- 画像と添付ファイルが埋め込まれたHTMLメールを送信するための簡単なシステムアクションとルールアクションを提供します。
私はDrupalとSwift Mailer PHPライブラリ)をつなぐ、HTML、添付ファイル、インライン画像、テーマなど。デフォルトでは、電子メールをHTMLまたはプレーンテキストとして送信するかどうかを定義できます。
現在、承認待ちですが、私は自分で本番サイトで使用しており、問題なく動作しています。 http://drupal.org/sandbox/sbrattla/1163884 をご覧ください。