2012-12-20 4 views
10

Ich benutze TMimeMess zum Entschlüsseln von eingehenden E-Mails meines SMTP-Servers basierend auf auf Synapse.Wie kann man den riesigen RAM-Verbrauch bei der Dekodierung von MIME mit Synapse TMimeMess reduzieren?

Ich entdeckte, dass für die Decodierung 50MB MIME-Nachricht (einfacher Text mit Anhänge), verwendete TMimeMess 600-800MB Speicher.

Decodierung Code hier:

FMimeMsg.Header.DecodeHeaders(FMimeMsg.MessagePart.Lines); 
FMimeMsg.MessagePart.DecomposeParts; 
ExtractPartsFromMess(FMimeMsg.MessagePart); 
... 
procedure ExtractPartsFromMess(AMimePart: TMimePart); 
var i: integer; 
begin 
    if AMimePart.GetSubPartCount = 0 then 
    Begin 
     if (AMimePart.PrimaryCode = MP_TEXT) then 
     Begin 
      AMimePart.DecodePart;   
      FBody.Add(string(ReadStrFromStream(AMimePart.DecodedLines,AMimePart.DecodedLines.Size))); 
    end 
    else if (AMimePart.PrimaryCode = MP_BINARY) then 
    Begin 
     if AMimePart.FileName <> '' then 
     Begin 
      AMimePart.DecodePart; 
      AMimePart.DecodedLines.SaveToFile(FPathToIncomingFolder+AMimePart.FileName); 
     end; 
    end; 
end 
else 
Begin 
    for i:=0 to AMimePart.GetSubPartCount-1 do 
    Begin 
     ExtractPartsFromMess(AMimePart.GetSubPart(i)); 
    end; 
end; 
end; 

Dank.

+1

Haben Sie die Synspse-Autoren wegen dieses Problems kontaktiert? –

+0

Ich habe diese Nachricht an synalist-public gepostet, aber niemand hat darauf geantwortet. – krtl

+0

ist es möglich, stattdessen Indy MIME-Decoder zu verwenden? – krtl

Antwort

0

Indy verfügt über TIdSMTP- und TIdMessage-Komponenten für diesen Zweck. Sie dekodieren die SMTP-Daten dynamisch, während sie vom Server heruntergeladen werden, die Daten werden nicht im Cache zwischengespeichert, und Anhänge werden standardmäßig in temporären Dateien auf der Festplatte gespeichert.

Sie können auch versuchen, die Synspse-Autoren über ihre E-Mail-Adresse oder Website zu kontaktieren.