Two merges from the mimelib project:

    _split_header(): Split on folding whitespace if the attempt to split
    on semi-colons failed.

    _split_header(): Patch by Matthew Cowles for fixing SF bug # 471918,
    Generator splitting long headers.
diff --git a/Lib/email/Generator.py b/Lib/email/Generator.py
index c31dc80..12b9fdf 100644
--- a/Lib/email/Generator.py
+++ b/Lib/email/Generator.py
@@ -15,10 +15,12 @@
 import Message
 import Errors
 
+EMPTYSTRING = ''
 SEMISPACE = '; '
 BAR = '|'
 UNDERSCORE = '_'
 NL = '\n'
+NLTAB = '\n\t'
 SEMINLTAB = ';\n\t'
 SPACE8 = ' ' * 8
 
@@ -171,18 +173,47 @@
             # Short lines can remain unchanged
             if len(line.replace('\t', SPACE8)) <= maxheaderlen:
                 rtn.append(line)
+                SEMINLTAB.join(rtn)
             else:
+                oldlen = len(text)
                 # Try to break the line on semicolons, but if that doesn't
-                # work, then just leave it alone.
+                # work, try to split on folding whitespace.
                 while len(text) > maxheaderlen:
                     i = text.rfind(';', 0, maxheaderlen)
                     if i < 0:
-                        rtn.append(text)
                         break
                     rtn.append(text[:i])
                     text = text[i+1:].lstrip()
-                rtn.append(text)
-        return SEMINLTAB.join(rtn)
+                if len(text) <> oldlen:
+                    # Splitting on semis worked
+                    rtn.append(text)
+                    return SEMINLTAB.join(rtn)
+                # Splitting on semis didn't help, so try to split on
+                # whitespace.
+                parts = re.split(r'(\s+)', text)
+                # Watch out though for "Header: longnonsplittableline"
+                if parts[0].endswith(':') and len(parts) == 3:
+                    return text
+                first = parts.pop(0)
+                sublines = [first]
+                acc = len(first)
+                while parts:
+                    len0 = len(parts[0])
+                    len1 = len(parts[1])
+                    if acc + len0 + len1 < maxheaderlen:
+                        sublines.append(parts.pop(0))
+                        sublines.append(parts.pop(0))
+                        acc += len0 + len1
+                    else:
+                        # Split it here, but don't forget to ignore the
+                        # next whitespace-only part
+                        rtn.append(EMPTYSTRING.join(sublines))
+                        del parts[0]
+                        first = parts.pop(0)
+                        sublines = [first]
+                        acc = len(first)
+                rtn.append(EMPTYSTRING.join(sublines))
+                return NLTAB.join(rtn)
 
     #
     # Handlers for writing types and subtypes