Einzelnen Beitrag anzeigen

PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Plaintext aus .EML-Datei extrahieren?

  Alt 8. Apr 2016, 07:30
Die Sache ist doch um einiges komplexer als ich dachte: "multi-part" oder "multipart", unterschiedliche Ebenen.

Delphi-Quellcode:
procedure TForm1.ExtractPlainTextFromEMLFile;
// Drop a TIdMessage component on the form and name it "IdMessage"
var
  IndyStringList: TStringList;
  IndyStream: TMemoryStream;
  I: Integer;
  HTMLBody, PlaintextBody: string;
const
  CRLF = #13#10;
begin
  IndyStringList := TStringList.Create;
  IndyStream := TMemoryStream.Create;
  try
    IndyStringList.LoadFromFile(Trim(Edit1.Text));
    IndyStringList.Add(CRLF + '.' + CRLF);
    IndyStringList.SaveToStream(IndyStream);
    IndyStream.Position := 0;
    IdMessage.Clear;
    IdMessage.LoadFromStream(IndyStream);
    Memo1.Clear;
    Memo1.Lines.Assign(IdMessage.Headers);
    Memo2.Clear;
    Memo2.Lines.Add(IdMessage.From.Text);
    Memo2.Lines.Add(IdMessage.Recipients.EMailAddresses);
    Memo2.Lines.Add(IdMessage.Subject);
    Memo2.Lines.Add(DateTimeToStr(IdMessage.Date));
    Memo2.Lines.Add('');

    if (Pos('multi-part', IdMessage.ContentType) > 0) or (Pos('multipart', IdMessage.ContentType) > 0) then
    begin
      for I := 0 to IdMessage.MessageParts.Count - 1 do
      begin
        if IdMessage.MessageParts.Items[I] is IdText.TidText then
        begin
          if Pos('text/plain', IdText.TidText(IdMessage.MessageParts.Items[I]).ContentType) > 0 then
          begin
            PlaintextBody := IdText.TidText(IdMessage.MessageParts.Items[I]).Body.Text;
            BREAK;
          end
          else if IdText.TidText(IdMessage.MessageParts.Items[I]).ContentType = 'text/htmlthen
            HTMLBody := IdText.TidText(IdMessage.MessageParts.Items[I]).Body.Text;
        end;
      end;

      if PlaintextBody <> 'then
        Memo2.Lines.Add(Trim(PlaintextBody))
      else if HTMLBody <> 'then
        Memo2.Lines.Add(ExtractTextFrom(HTMLBody))
      else Memo2.Lines.Add('The body could not be extracted from the .EML file. Please report this error and attach your .EML file');
    end
    else
    begin
      Memo2.Lines.Add(Trim(IdMessage.Body.Text));
    end;
  finally
    IndyStringList.Free;
    IndyStream.Free;
  end;
end;
Ich stelle jetzt mal das ganze Projekt online (s. Anhang) mit der Bitte, das mit euren .EML-Dateien zu verifizieren. Ich habe es mit einer großen Menge von .EML-Dateien verwendet und bisher hat es mit allen funktioniert. Solltet ihr eine .EML-Datei finden, die nicht funktioniert, so bitte ich euch, diese zu anonymisieren und hier online zu stellen, damit ich den Code ggf. anpassen kann.
Angehängte Dateien
Dateityp: zip OpenEMLFiles.zip (49,5 KB, 41x aufgerufen)
  Mit Zitat antworten Zitat