Index: notify_by_views.module
===================================================================
--- notify_by_views.module	(revision 2869)
+++ notify_by_views.module	(working copy)
@@ -155,6 +155,12 @@
       '#default_value' => variable_get('notify_by_views_default_schedule','never'),
       '#required' => TRUE,      
     );
+
+    $form['notify_by_views_set']['notify_by_views_send_html_mail'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Send HTML e-mails'),
+      '#default_value' => variable_get('notify_by_views_send_html_mail', FALSE),
+    );
     
     $form['notify_send']['#description'] = $form['notify_send']['#description'] . t(" If using Notify_by_Views, you can set this to 'Never' because user selected settings will be used.");
   }
@@ -299,6 +305,8 @@
     return;
   }
   
+  $html = variable_get('notify_by_views_send_html_mail', FALSE);
+
   if (!is_array($nodes)) {
     $nodes = array($nodes->nid => $nodes);
   }
@@ -320,6 +328,7 @@
     if ($frequency == 'weekly' && $user->last_mailing + 604800 > time()) {
       continue;
     }
+
     // Switch current user to this account to use node_access functions, etc.
     _notify_switch_user($user->uid);
     
@@ -337,16 +346,16 @@
     $comment_body = '';
     $included_nodes = notify_by_views_included($user, $view_name);
 
+    // Get a template.
+    $template = variable_get("notify_by_views_{$view_name}_template", _notify_by_views_default_text()); 
+    // Break up template into its parts.
+    $tpl = explode('!section',$template);
+    
     // Write new node content to e-mail if user has permissions and nodes are
     // ready to be sent.
     if (user_access('access content') && count($included_nodes)) {
       $node_count = 0;
       
-      //get a template
-      $template = variable_get("notify_by_views_{$view_name}_template", _notify_by_views_default_text()); 
-      //break up template into its parts
-      $tpl = explode('!section',$template);
-      
       foreach ($included_nodes as $nid) {
         $node = $nodes[$nid];
         // Skip to next if this user is NOT allowed to view this node.
@@ -454,12 +463,31 @@
       $from_name = variable_get('site_name', 'Drupal');
       $subject = t('@sitename new content notification for @username', array('@username' => $user->name, '@sitename' => variable_get('site_name', 'Drupal')));
 
-      $body = strtr($tpl[0], array('!uname' => $user->name)) . $body; //add template header
+      // Get replacement tokens from other modules.
+      $tokens['!uname'] = $user->name;
+      $tokens = array_merge($tokens, module_invoke_all('notify_by_views_template_tokens', $html, $user->last_mailing));
+
+      // Set up the message header.
+      $header = $tpl[0];
+      $header = strtr($header, $tokens);
+      // Set up the message footer.
+      $footer = $tpl[3];
+      $footer = strtr($footer, $tokens);
+      
+      // Set up the complete message body.
+      $body = $header . $body; // Add template header.
+      $body .= "\n". $footer; // Add on the footer.
       $body .= "\n". t('This is an automatic e-mail from @sitename.', array('@sitename' => variable_get('site_name', 'Drupal')))."\n";
       $body .= t('To stop receiving these e-mails, change your notification preferences at @notify-url', array('@notify-url' => url("user/$user->uid/notify" , NULL, NULL, TRUE)))."\n";
 
       $headers = array();//'From' => "$from_name <$from>");
-      
+      if ($html) {
+        $body = strtr($body, array("\r\n" => '<br>', "\n" => '<br>'));
+        $headers = array(
+          'Content-Type' => 'text/html; charset=UTF-8; format=flowed',
+        );
+      }
+
       //Here's where we really send it, unless test is True
       $success = $test ? TRUE : drupal_mail('notify_by_views_'. $view_name, $user->mail, $subject, wordwrap($body, 72), $from, $headers);
       
