Index: src/orca/scripts/Evolution.py
===================================================================
--- src/orca/scripts/Evolution.py	(revision 2257)
+++ src/orca/scripts/Evolution.py	(working copy)
@@ -329,6 +329,30 @@
 
         return True
 
+    def presentMessageLine(self, obj, string):
+        """Speak/braille the given string to the user.
+
+        Arguments:
+        - obj: the object this action is associated with.
+        - string: the mail message line to speak/braille.
+        """
+
+        braille.displayMessage(string)
+        if settings.enableSpeechIndentation:
+            self.speakTextIndentation(obj, string)
+        line = self.adjustForRepeats(string)
+
+        if self.speakNewLine(obj):
+            speech.speak(chnames.getCharacterName("\n"), None, False)
+
+        if self.speakBlankLine(obj):
+            # Translators: "blank" is a short word to mean the
+            # user has navigated to an empty line.
+            #
+            speech.speak(_("blank"), None, False)
+        else:
+            speech.speak(line, None, False)
+
     # This method tries to detect and handle the following cases:
     # 1) Mail view: current message pane: individual lines of text.
     # 2) Mail view: current message pane: "standard" mail header lines.
@@ -385,22 +409,7 @@
 
             [string, caretOffset, startOffset] = \
                 self.getTextLineAtCaret(event.source)
-            braille.displayMessage(string)
-            if settings.enableSpeechIndentation:
-                self.speakTextIndentation(event.source, string)
-            line = self.adjustForRepeats(string)
-                
-            if self.speakNewLine(event.source):
-                speech.speak(chnames.getCharacterName("\n"), None, False)
- 
-            if self.speakBlankLine(event.source):
-                # Translators: "blank" is a short word to mean the
-                # user has navigated to an empty line.
-                #
-                speech.speak(_("blank"), None, False)
-            else:
-                speech.speak(line, None, False)
-
+            self.presentMessageLine(event.source, string)
             return
         
 
@@ -1026,6 +1035,11 @@
                           "evolution.locusOfFocusChanged - mail view: " \
                           + "current message pane: initial focus.")
             allTexts = self.findByRole(event.source, rolenames.ROLE_TEXT)
+
+            # The mail message could be plain text or HTML. Check if it's
+            # plain text first. If so, then speak/braille the first line
+            # of the message and return.
+            #
             rolesList = [rolenames.ROLE_TEXT, \
                          rolenames.ROLE_PANEL, \
                          rolenames.ROLE_UNKNOWN, \
@@ -1036,10 +1050,24 @@
                         self.getTextLineAtCaret(textObj)
                     focusGrabbed = textObj.component.grabFocus()
                     caretSet = textObj.text.setCaretOffset(0)
-                    braille.displayMessage(string)
-                    speech.speak(string)
+                    self.presentMessageLine(textObj, string)
                     return
 
+            # Check if the message is HTML.
+            #
+            rolesList = [rolenames.ROLE_TEXT, \
+                         rolenames.ROLE_PANEL, \
+                         rolenames.ROLE_PANEL, \
+                         rolenames.ROLE_SCROLL_PANE]
+            for textObj in allTexts:
+                if self.isDesiredFocusedItem(textObj, rolesList):
+                    [string, caretOffset, startOffset] = \
+                        self.getTextLineAtCaret(textObj)
+                    focusGrabbed = textObj.component.grabFocus()
+                    caretSet = textObj.text.setCaretOffset(0)
+                    self.presentMessageLine(textObj, string)
+                    return
+
         # For everything else, pass the focus event onto the parent class
         # to be handled in the default way.
         #
