我希望保留邮箱中电子邮件对话的存档,但删除不必要的附件(通常是图形和文本文件),以缩小存档。我编写了一个简单的解析器,可以对文件夹中所有下载的邮箱进行解析,以删除任何看似附件的内容。
代码非常简单,我认为可以做得更好。此外,我不知道我是否犯了错误或破坏了mbox文件结构。也许有更简单的方法?谁能看看我写的东西?
-
有没有更简单的方法(也许在delphi之外,也许是一些现成的库)?
-
这样的代码会对mbox格式造成不可逆转的损害吗?
-
我会因为这样的密码而丢失一些电子邮件吗?
谢谢你的建议。
program ParseMailToClearTXT;
{$APPTYPE CONSOLE}
uses
SysUtils, StrUtils, Classes;
const mboxpath = 'e:\Downloads\Takeout\';
var FileIn, FileOut: TextFile;
FileList: TstringList;
Line, N_tmp: String;
i: integer;
{ this is just a part for use to all files in directory }
procedure ListFileDir(Path: string; FileList: TStrings);
var
SR: TSearchRec;
begin
if FindFirst(Path + '*.*', faAnyFile, SR) = 0 then
begin
repeat
if (SR.Attr <> faDirectory) then
begin
FileList.Add(SR.Name);
end;
until FindNext(SR) <> 0;
FindClose(SR);
end;
end;
begin
FileList := TStringList.Create;
ListFileDir(mboxpath,FileList);
{ ==== here starts parser ==== }
for i := 0 to FileList.Count - 1
do if pos('.mbox',FileList.Strings[i]) > 0
then begin
N_tmp := mboxpath+Trim(FileList.Strings[i]);
Assign(FileIn, N_tmp);
Assign(FileOut, N_tmp+'out.txt');
Reset(FileIn);
Rewrite(FileOut);
repeat
ReadLn(FileIn,Line);
if (Pos('Content-Type: image',Line) > 0)
or (Pos('Content-Type: application',Line) > 0)
or (Pos('Content-Type: text/plain; charset=utf-8',Line) > 0)
or (Pos('Content-Type: text/plain; charset="UTF-8"',Line) > 0)
or (Pos('Content-Type: audio/mpeg',Line) > 0)
or (Pos('Content-Type: application',Line) > 0)
then begin
WriteLn(FileOut, Line);
repeat
ReadLn(FileIn,Line);
until (Length(Line) < 3) or (Eof(FileIn));
ReadLn(FileIn,Line);
WriteLn(FileOut, Line);
repeat
ReadLn(FileIn,Line);
until (Length(Line) < 3) or (Eof(FileIn));
end;
if Pos('------',Line) > 0
then begin
WriteLn(FileOut, Line);
repeat
ReadLn(FileIn,Line);
until {(Pos('From ',Line) > 0)
or (Pos('filename',Line) > 0)}
((Pos('------',Line) > 0) and (RightStr(Line,2) = '--'))
or (Eof(FileIn));
end;
WriteLn(FileOut, Line);
until EOF(FileIn);
CloseFile(FileIn);
CloseFile(FileOut);
end;
FileList.Free;
end.