Jeśli próbujesz wysłać wiadomości e-mail za pośrednictwem niestandardowego modułu, możesz postępować zgodnie z poniższym przewodnikiem. Powiedzmy, że miałem jeden moduł o nazwie „Commerce Canvas (commerce_canvas)” 1. Najpierw zmień funkcję poczty Drupala, aby obsługiwała łącza i dodawała inne typy kodowania
/**
* 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;
}
}
- Następnie zaczep HOOK_mail w swoim module jako
/**
* 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;
}
}
- Następnie musisz utworzyć funkcję opakowania, aby wywołać pocztę z modułu.
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;
}
}
Ta funkcja wyśle wiadomość e-mail, a także utworzy wiadomości debugowania, jeśli coś stanie się źle. Ale nadal nie będziesz mógł wysyłać wiadomości HTML, ponieważ musisz rozszerzyć domyślny DefaultMailSystem Drupala 7 o własny. Więc wykonaj następujące czynności,
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)
);
}
}
Następnie musisz zarejestrować nową funkcję motywu, która wywoła niestandardowy plik szablonu w funkcji 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',
),
);
}
}
Na koniec musisz wywołać tę funkcję motywu w momencie wysyłania wiadomości e-mail jako,
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);
}
Są to pełny fragment kodu do prawidłowej obsługi wiadomości e-mail HTML w Drupal 7, dlatego w hook_theme możesz podać własny szablon.
But still you won't be able to send the HTML mail...
, dobrze.Jeśli chcesz utworzyć motyw do wychodzących wiadomości e-mail za pomocą niestandardowych szablonów, powinieneś użyć modułu HTML Mail .
Działa dobrze z innymi modułami, takimi jak Print , Mail Mime itp.
Musisz zainstalować moduł systemu pocztowego , aby móc korzystać z poczty HTML.
źródło
Przykładowe użycie:
źródło
drupal_mail()
a nie$system->mail(..
w celu korzystania zhook_mail_alter
funkcji (która działa tylko w przypadku wiadomości wysyłanych za pomocądrupal_mail()
.drupal_mail
itp., Ale i tak dziękujęAby wysłać wiadomość e-mail w formacie HTML, możesz użyć modułu Mimemail . Po skonfigurowaniu i skonfigurowaniu możesz po prostu przygotować szablon, nazwać go
mimemail-message.tpl.php
, upuścić w katalogu motywów, a zostanie on automatycznie zastosowany do wszystkich wychodzących wiadomości e-mail (zakładając, że skonfigurowałeś całą pocztę do wysłania przez Mimemail) .Konfiguracja modułu jest prawdopodobnie łatwiejsza niż przesłanianie
drupal_mail()
.źródło