diff --git a/includes/simplenews.source.inc b/includes/simplenews.source.inc
index 763c125..ef1a705 100644
--- a/includes/simplenews.source.inc
+++ b/includes/simplenews.source.inc
@@ -602,6 +602,10 @@ class SimplenewsSourceEntity implements SimplenewsSourceEntityInterface {
         $GLOBALS['language_content'] = $languages[$language];
       }
     }
+
+    // Temporarily change the theme if one is set.
+    $mail_theme = function_exists('mailsystem_get_mail_theme') ? mailsystem_get_mail_theme() : $GLOBALS['theme'];
+    simplenews_change_theme($mail_theme);
   }
 
   /**
@@ -622,6 +626,8 @@ class SimplenewsSourceEntity implements SimplenewsSourceEntityInterface {
         $GLOBALS['language_content'] = $this->original_language;
       }
     }
+
+    simplenews_revert_theme();
   }
 
   /**
diff --git a/simplenews.module b/simplenews.module
index 75ec6fa..48307bf 100644
--- a/simplenews.module
+++ b/simplenews.module
@@ -2963,6 +2963,64 @@ function simplenews_revert_user() {
 }
 
 /**
+ * Changes the theme.
+ *
+ * Each time this function is called, the active theme is saved and $new_theme
+ * becomes the active theme. Multiple calls to this function can be nested.
+ *
+ * @param $new_theme
+ *   Name of the theme to change to.
+ *
+ * @return
+ *   Name of the new theme.
+ *
+ * @see simplenews_revert_theme()
+ */
+function simplenews_change_theme($new_theme = NULL) {
+  global $theme, $theme_key;
+  $theme_original = &drupal_static(__FUNCTION__);
+
+  // drupal_theme_initialize() uses menu_get_custom_theme() to get the current
+  // theme name. Luckily for us, the theme name is stored with drupal_static()
+  // so we can change it here.
+  $custom_theme = &drupal_static('menu_get_custom_theme');
+
+  if (!isset($new_theme)) {
+    if(isset($theme_original) && !empty($theme_original)) {
+      // Restore the previous theme from the stack.
+      $custom_theme = array_pop($theme_original);
+    }
+  }
+  else {
+    $theme_original[] = $theme_key;
+    $custom_theme = $new_theme;
+  }
+  
+  // Reinitializing is only necessary if the new theme differs from the theme
+  // that is currently the active theme.
+  if ($custom_theme != $theme_key) {
+    // drupal_theme_initialize() doesn't do anything if $theme is set, so
+    // clear it first.
+    $theme = NULL;
+    drupal_theme_initialize();
+  }
+
+  return $custom_theme;
+}
+
+/**
+ * Reverts to the previous theme after changing it.
+ *
+ * @return
+ *   Current theme name
+ *
+ * @see simplenews_change_theme()
+ */
+function simplenews_revert_theme() {
+  return simplenews_change_theme();
+}
+
+/**
  * Starts combining confirmation mails.
  *
  * If combining mails is enabled, it is mandatory to call
