diff --git a/mimemail.module b/mimemail.module
index 8b42fa7..1e253d7 100644
--- a/mimemail.module
+++ b/mimemail.module
@@ -146,6 +146,7 @@ function mimemail_mail($key, &$message, $params) {
  *   The $message array structure containing all details of the message.
  */
 function mimemail_prepare_message($sender, $recipient, $subject, $body, $plaintext = NULL, $headers = array(), $text = NULL, $attachments = array(), $mailkey = '') {
+  global $language;
   module_load_include('inc', 'mimemail');
 
   $site_name = variable_get('site_name', 'Drupal');
@@ -171,24 +172,30 @@ function mimemail_prepare_message($sender, $recipient, $subject, $body, $plainte
     }
   }
 
+  // Load the recipient's account if possible.
+  if (is_string($recipient) && valid_email_address($recipient)) {
+    $recipient = user_load(array('mail' => $recipient));
+  }
+  // Recipient may be an empty user object.
+  elseif (is_object($recipient) && empty($recipient->uid)) {
+    $recipient = user_load(array('mail' => $recipient->mail));
+  }
+
   // Body is empty, this is a plaintext message.
   if (empty($body)) {
     $plaintext = 1;
   }
- // Try to determine recpient's text mail preference.
-  elseif (is_null($plaintext)) {
-    if (is_object($recipient)) {
-      if (isset($recipient->mimemail_textonly)) {
-        $plaintext = $recipient->mimemail_textonly;
-      }
-    }
-    elseif (is_string($recipient) && valid_email_address($recipient)) {
-      if (is_object($r = user_load(array('mail' => $recipient))) && isset($r->mimemail_textonly)) {
-        $plaintext = $r->mimemail_textonly;
-        $recipient = $r; // Pass the user object to the address function.
-      }
-    }
+  // Try to determine recipient's text mail preference.
+  elseif (is_null($plaintext) && is_object($recipient) && isset($recipient->mimemail_textonly)) {
+    $plaintext = $recipient->mimemail_textonly;
+  }
+
+  // Temporarly switch language to the user's preferred language if needed.
+  if(is_object($recipient) && isset($recipient->language) && $recipient->language !== $language->language) {
+    $language_original = $language;
+    $language = user_preferred_language($recipient);
   }
+
   $subject = str_replace("\n", '', trim(drupal_html_to_text($subject)));
   $body = theme(array('mimemail_message__'. $mailkey, 'mimemail_message'), $subject, $body, $mailkey, $recipient);
   foreach (module_implements('mail_post_process') as $module) {
@@ -209,6 +216,11 @@ function mimemail_prepare_message($sender, $recipient, $subject, $body, $plainte
     'headers' => mimemail_headers($headers, $sender),
   );
 
+  // Switch back to the original language.
+  if(isset($language_original)) {
+    $language = $language_original;
+  }
+
   return $message;
 }
 
