2012-12-20 37 views
10

我使用TMimeMess解碼基於Synapse的基於 的SMTP服務器的傳入電子郵件。如何減少使用Synapse TMimeMess解碼MIME時巨大的RAM使用量?

我發現對於解碼50MB MIME消息(簡單文本與 附件),TMimeMess使用了600-800MB的內存。

解碼代碼在這裏:

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; 

感謝。

+1

您是否就此問題聯繫了Synpse作者? –

+0

我把這封郵件發給了synalist-public,但沒有人沒有回答。 – krtl

+0

可以使用indy MIME解碼器嗎? – krtl

回答

0

Indy具有TIdSMTP和TIdMessage組件用於此目的。它們在從服務器下載數據時動態解碼SMTP數據,數據不會預先緩存在內存中,並且附件默認情況下會存儲在HDD上的臨時文件中。

您也可以嘗試通過他們的電子郵件地址或網站聯繫Synpse作者。