Как конвертировать mboxo / mboxrd в mboxcl / mboxcl2

1389
Hamish Downer

Я пытаюсь экспортировать электронную почту из Thunderbird, чтобы я мог прочитать ее в Mutt. Я начал с экспорта в формат mbox, используя дополнение thunderbird ImportExportTools . Затем я скопировал файл на сервер, но Mutt сказал, что в этом файле нет сообщений.

После еще одного исследования выясняется, что существует несколько вариантов mbox . Экспортируемый файл выглядит как mboxo или mboxrd - во всяком случае, я нашел a >Fromв тексте файла, и там нет заголовков Content-Length (как было бы в файле mboxcl / mboxcl2).

Теперь по ссылке выше на вариантах mbox: «MUA Mutt пытается преобразовать почтовые ящики« mboxo »и« mboxrd »в формат« mboxcl ».» Но этого, очевидно, не произошло в этом случае.

Так кто-нибудь знает, как конвертировать mboxo / mboxrd в mboxcl? Есть ли инструменты? Или я собираюсь написать код для этого ...

Отредактировано, чтобы добавить: я экспортировал из Thunderbird 3.0 с помощью ImportExportTools 2.3.1.1. Я попытался использовать Mutt 1.5.20 (в Ubuntu 9.04) и 1.5.18 (в Debian Lenny).

2

1 ответ на вопрос

1
dubiousjim

Вы можете попробовать этот скрипт. Я обнаружил, что мне нужно помассировать некоторые файлы mbox, которые я скачал из архивов почтовых рассылок, чтобы получить их в признанном формате. Я думаю, что это самый требовательный формат даты. Я еще не сталкивался с более легким исправлением. Но это работает для меня.

#!/usr/bin/env python """ Usage: ./mailman2mbox.py infile outfile default-to-address """ import sys from time import strftime,strptime,mktime,asctime from email.utils import parseaddr,formatdate  if len(sys.argv) not in (3,4): print __doc__ sys.exit()  out = open(sys.argv[2],"w") listid = None if len(sys.argv)==4: listid = sys.argv[3]  date_patterns = ("%b %d %H:%M:%S %Y", "%d %b %H:%M:%S %Y", "%d %b %Y %H:%M:%S", "%d %b %H:%M:%S", "%d %b %y %H:%M:%S", "%d %b %Y %H.%M.%S",'%m/%d/%y %H:%M:%S %p')  class HeaderError(TypeError): pass   def finish(headers, body): body.append("\n") for n,ln in enumerate(headers): if ln.startswith("Date:"): break else: raise HeaderError("No 'Date:' header:\n" + "".join(headers)+"\n") if listid is not None: for ln2 in headers: if ln2.lower().startswith("list-id:"): break else: headers.append("List-Id: <%s>\n" % (listid,)) date_line = ln[5:].strip() if date_line.endswith(')'): date_line = date_line[:date_line.rfind('(')].rstrip() if date_line[-5] in "+-": date_line, tz = date_line[:-5].rstrip(), int(date_line[-5:])//100 else: tz = -5 if date_line[:3] in ("Mon","Tue","Wed","Thu","Fri","Sat","Sun"): if date_line[3:5] == ', ': prefix = "%a, " elif date_line[3] == ',': prefix = "%a," else: prefix = "%a " else: prefix = "" while True: for p in date_patterns: try: date_struct = strptime(date_line, prefix+p) except ValueError: pass else: break else: if not date_line: raise ValueError(headers[n]) date_line = date_line[:date_line.rfind(' ')] continue break  date_struct = list(date_struct) try: headers[n] = 'Date: %s\n' % (formatdate(mktime(date_struct),True)) headers[0] = "%s %s\n" % (headers[0][:-25].rstrip(), asctime(date_struct), ) except ValueError: raise ValueError(headers[n])  for w in headers, body: for s in w: out.write(s)   message = 0 headers, body = None, None for line in open(sys.argv[1]): if line.startswith("From "): message+=1 header = True if headers is not None: try: finish(headers, body) except HeaderError: message -= 1 out.write('>') for w in headers, body: for s in w: out.write(s) headers, body = [], [] line = line.replace(" at ", "@") elif line == '\n': header = False elif header and line.startswith('From:'): line = line.replace(" at ","@") (headers if header else body).append(line)  try: finish(headers, body) except HeaderError: out.write('>') for w in headers, body: for s in w: out.write(s)  out.close() 
Спасибо за попытку, но я боюсь, что это не решило мою проблему :( Hamish Downer 14 лет назад 0
Жалость. Вы можете попробовать изготовить заголовки Content-Length. Я согласен, что это должно быть более простым, хотя. dubiousjim 14 лет назад 0

Похожие вопросы