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é.
But still you won't be able to send the HTML mail...
, droite.Si vous souhaitez thématiser les e-mails sortants à l'aide de modèles personnalisés, vous devez utiliser le module HTML Mail .
Il fonctionne bien avec d'autres modules, comme Print , Mail mime , etc.
Vous devez installer le module Mail System pour utiliser la messagerie HTML.
la source
Exemple d'utilisation:
la source
drupal_mail()
plutôt que$system->mail(..
pour utiliser lahook_mail_alter
fonction (qui ne fonctionne que pour les mails envoyés en utilisantdrupal_mail()
.drupal_mail
etc, mais merci quand mêmePour envoyer des e-mails HTML, vous pouvez utiliser le module Mimemail . Une fois qu'il est installé et configuré, vous pouvez simplement préparer le modèle, le nommer
mimemail-message.tpl.php
, le déposer dans votre répertoire de thèmes et il sera automatiquement appliqué à tous les e-mails sortants (en supposant que vous avez configuré tous les e-mails à envoyer par Mimemail) .La configuration du module est probablement plus facile que de remplacer
drupal_mail()
.la source