代码之家  ›  专栏  ›  技术社区  ›  kwadratens

如何解析。使用delphi的mbox格式删除邮件附件?

  •  0
  • kwadratens  · 技术社区  · 4 年前

    我希望保留邮箱中电子邮件对话的存档,但删除不必要的附件(通常是图形和文本文件),以缩小存档。我编写了一个简单的解析器,可以对文件夹中所有下载的邮箱进行解析,以删除任何看似附件的内容。

    代码非常简单,我认为可以做得更好。此外,我不知道我是否犯了错误或破坏了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.
    
    0 回复  |  直到 4 年前