--- a/src/utils/mimeparse.cpp
+++ b/src/utils/mimeparse.cpp
@@ -600,8 +600,8 @@
 
 // Convert rfc822 date to unix time. A date string normally looks like:
 //  Mon, 3 Jul 2006 09:51:58 +0200
-// But there are many common variations
-//
+// But there are many close common variations
+// And also hopeless things like: Fri Nov  3 13:13:33 2006
 time_t rfc2822DateToUxTime(const string& dt)
 {
     // Strip everything up to first comma if any, we don't need weekday,
@@ -617,7 +617,24 @@
 	string date = dt.substr(idx+1);
 	stringToTokens(date, toks, " \t:");
     } else {
+        // No comma. Enter strangeland
 	stringToTokens(dt, toks, " \t:");
+        // Test for date like: Sun Nov 19 06:18:41 2006
+        //                      0   1  2   3 4  5  6
+        // and change to:      19 Nov 2006 06:18:41
+        if (toks.size() == 7) {
+            list<string>::iterator it0 = toks.begin();
+            if (it0->length() == 3 &&
+                it0->find_first_of("0123456789") == string::npos) {
+                list<string>::iterator it2 = it0;
+                for (int i = 0; i < 2; i++) it2++;
+                list<string>::iterator it6 = it2;
+                for (int i = 0; i < 4; i++) it6++;
+                iter_swap(it0, it2);
+                iter_swap(it6, it2);
+                toks.erase(it6);
+            }
+        }
     }
 
 #if DEBUGDATE
@@ -627,17 +644,17 @@
     DATEDEB((stderr, "\n"));
 #endif
 
+    if (toks.size() < 6) {
+	DATEDEB((stderr, "Bad rfc822 date format (toks cnt): [%s]\n", 
+		 dt.c_str()));
+	return (time_t)-1;
+    }
+
     if (toks.size() == 6) {
 	// Probably no timezone, sometimes happens
 	toks.push_back("+0000");
     }
 
-    if (toks.size() < 7) {
-	DATEDEB((stderr, "Bad rfc822 date format (toks cnt): [%s]\n", 
-		 dt.c_str()));
-	return (time_t)-1;
-    }
-	
     struct tm tm;
     memset(&tm, 0, sizeof(tm));
 
@@ -670,8 +687,15 @@
     }
     it++;
 
-    // Year. Struct tm counts from 1900
+    // Year. Struct tm counts from 1900. 2 char years are quite rare
+    // but do happen. I've seen 00 happen so count small values from 2000
     tm.tm_year = atoi(it->c_str());
+    if (it->length() == 2) {
+        if (tm.tm_year < 10)
+            tm.tm_year += 2000;
+        else
+            tm.tm_year += 1900;
+    }
     if (tm.tm_year > 1900)
 	tm.tm_year -= 1900;
     it++;