Si vous essayez d'envoyer les e-mails via votre module personnalisé, vous pouvez suivre le guide mentionné ci-dessous. Disons, j'avais un module appelé "Commerce Canvas (commerce_canvas)" 1. Tout d'abord, modifiez la fonction de messagerie de Drupal pour prendre en charge les liens et ajouter d'autres types d'encodage
/**
* Implements hook_mail_alter()
* @param string $message
*/
function commerce_canvas_mail_alter(&$message) {
$headers = array(
'MIME-Version' => '1.0',
'Content-Type' => 'text/html; charset=iso-8859-1; format=flowed',
'Content-Transfer-Encoding' => '8Bit',
'X-Mailer' => 'Drupal',
);
foreach ($headers as $key => $value) {
$message['headers'][$key] = $value;
}
}
- Ensuite, connectez le HOOK_mail dans votre module comme
/**
* Implements hook_mail()
* @param string $key
* @param string $message
* @param unknown_type $params
*/
function commerce_canvas_mail($key, &$message, $params) {
//Language Selection
$options = array(
'langcode' => $message['language']->language,
);
switch($key) {
case "user_payment_notification" :
$message['subject'] = isset($params['subject']) ? $params['subject'] : $message['subject'] = t('Payment recieved @site-name', array('@site-name' => variable_get('site_name', 'Express Canvas')), $options);
$message['body'][] = isset($params['body']) ? $params['body'] : NULL;
if (isset($params['headers']) && is_array($params['headers'])) {
$message['headers'] += $params['headers'];
}
break;
}
}
- Ensuite, vous devez créer une fonction wrapper pour appeler le courrier à partir de votre module.
function commerce_canvas_mail_send(array $values = array()) {
$module = $values['module'];
$key = $values['key'];
$to = $values['to'];
$from = $values['form'];
$language = isset($values['lang']) ? $values['lang'] : language_default();
$params = array(
'subject' => $values['subject'],
'body' => $values['body'],
);
if(array_key_exists('headers', $values)) {
$params['headers'] = $values['headers']; //Assumed as an array
}
$send = TRUE;
$mail = drupal_mail($module, $key, $to, $language, $params, $from, $send);
if($mail['result']) {
return TRUE;
} else {
$error_msg = 'Failed to send the email in commerce_canvas Module';
watchdog('canvas-email', $error_msg, array(), WATCHDOG_ALERT);
return FALSE;
}
}
Cette fonction enverra l'e-mail et créera des messages de débogage en cas de problème. Mais vous ne pourrez toujours pas envoyer le courrier HTML car vous devez étendre le DefaultMailSystem par défaut de Drupal 7 avec le vôtre. Il faut donc faire comme suit,
class CommerceCanvasMailSystem extends DefaultMailSystem {
/**
* 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']);
return $message;
}
/**
* Send an e-mail message, using Drupal variables and default settings.
*
* @see http://php.net/manual/en/function.mail.php
* @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();
foreach ($message['headers'] as $name => $value) {
$mimeheaders[] = $name . ': ' . mime_header_encode($value);
}
$line_endings = variable_get('mail_line_endings', MAIL_LINE_ENDINGS);
return 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.
join("\n", $mimeheaders)
);
}
}
Ensuite, vous devez enregistrer une nouvelle fonction de thème qui appellera votre fichier de modèle personnalisé dans votre hook_theme ().
/**
* Implements hook_theme();
*/
function commerce_canvas_theme($existing, $type, $theme, $path) {
if($type == 'module') {
return array(
'tracking_code_email' => array(
'variables' => array(
'image_path' => NULL,
'user' => NULL,
'page' => NULL,
),
'template' => 'commerce-canvas-tracking-code',
'path' => drupal_get_path('module', 'commerce_canvas').'/theme',
),
);
}
}
Enfin, vous devez appeler cette fonction de thème au moment d'envoyer l'e-mail en tant que,
function a_custom_function($params) {
$email_text_user = theme('tracking_code_email', array(
'image_path' => $base_url . '/' . drupal_get_path('module', 'commerce_canvas') . '/images',
'user' => null,
'page' => array(
'greet_text' => t('Thank you for your order at Express Canvas. Your order is ready and has shipped. You may track your order using FedEx tracking with your tracking number: '.$order->field_tracking_number['und']['0']['value'].''),
),
));
$sent_to_user = commerce_canvas_mail_send($email_values_user);
}
Ce sont l'extrait complet pour gérer correctement l'e-mail HTML dans Drupal 7, ainsi dans le hook_theme, vous pouvez donner votre modèle personnalisé.