Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy SMTP/Indy Message hat Probleme mit großen Emails ?! (https://www.delphipraxis.net/76284-indy-smtp-indy-message-hat-probleme-mit-grossen-emails.html)

Nighthawk1310 1. Sep 2006 11:31


Indy SMTP/Indy Message hat Probleme mit großen Emails ?!
 
Liste der Anhänge anzeigen (Anzahl: 1)
Habe in einem meiner Programme einen Email-Part und beim Erstellen der eigentlichen
Mail, genauer beim Hinzufügen von Anhängen (jenseits 30 MB) gibt es merkliche
Einbußen in der Geschwindigkeit. Das Program steht wie eine Salzsäule und ackert.
Aktuell habe ich einen Anhang von 39MB Größe und er braucht mehr als 15 min.

Ein Thread kommt auch nicht in Frage, da zum Zeitpunkt des "Eintütens" der Benutzer
eh nichts machen soll. Es ist halt nur diese lange Zeit die er dafür braucht.

Das System:
Dual Pentium Xeon 3.06 GHz
4 GB RAM
200 GB Harddisk.

Also am System sollte es nicht liegen. Hat jemand schonmal diese
Erfahrung mit der Indy SMTP Komponente gemacht?

Gruß und danke im Voraus für irgendeinen Hinweis.
Nighthawk1310

Hier noch meine Routine zum Vorbereiten der Email.

Delphi-Quellcode:
function TfrmSearch.BuildMail: Integer;
 var iCount: Integer;
     sReceipientsAddresses : WideString;
     iCutPos, ReceipientCount : Integer;
     MS : TMemoryStream;
begin
 msgSend.Clear;

     try
       //Setup MailBody
       with TIdText.Create(msgSend.MessageParts, memoText.Lines) do
            begin
            ContentType := 'text/plain';
            end;

       msgSend.Body.Assign(memoText.Lines);

       //Setup MailAttachments
       if lstMA.Count > 0 then
          begin
          msgSend.ContentType := 'multipart/mixed';

          for iCount := 0 to lstMA.Count -1 do
              TIdAttachmentFile.Create(msgSend.MessageParts, lstMA.Items[iCount]);
          end;

       //Setup Sender
       msgSend.From.Text := frmPanel.xUser.sMailAdr;
       msgSend.ReplyTo.EMailAddresses := frmPanel.xUser.sMailAdr;

       //Setup Receipients
       //vst ist ein VirtualTreeView
       sReceipientsAddresses := PrepareReceipients(txtTo.Text, vst, ReceipientCount);

       if ReceipientCount = 1 then
          msgSend.Recipients.EMailAddresses := sReceipientsAddresses
       else
          begin
          iCutPos := Pos(';', sReceipientsAddresses);
          msgSend.Recipients.EMailAddresses := Copy(sReceipientsAddresses, 1, iCutPos - 1);
          msgSend.BccList.EMailAddresses := Copy(sReceipientsAddresses, iCutPos + 1, Length(sReceipientsAddresses));
          end;

       msgSend.CCList.EMailAddresses := '';
       
       //Setup Subject
       msgSend.Subject := txtSubject.Text;

       //Setup Priority
       msgSend.Priority := TIdMessagePriority(2);

       //Calculate Size

       MS := TMemoryStream.Create;
       msgSend.SaveToStream(MS); //Könnte er hier solange brauchen?

       msgSend.Tag := MS.Size;

       Result := msgSend.Tag;

     finally
        MS.free;      
        if msgSend.Tag = 0 then
           Result := -1;
     end;
end;
und auch noch die function zum Senden der fertigen Email

Delphi-Quellcode:
function TfrmSearch.SendMail(Email : TIDMessage) : Boolean;
begin
    result := False;

    //Username and Password
    SMTP.Username := frmPanel.xUser.sMailUser;
    SMTP.Password := frmPanel.xUser.sMailPass;

    //Host and Port
    SMTP.Host := frmPanel.xUser.sSmtp;
    SMTP.Port := 25;

    //Sending
    bSending := True; //Hier sage ich das ich beim Senden bin. wird im Disconnect
                      //der SMTP Kompo abgefragt
    SMTP.Connect;
    try
       SMTP.Send(Email);
       bSending := False;
       
       SMTP.Disconnect;
       result := True;
    except
       result := False;
       bSending := False;
       SMTP.Disconnect;
    end;
end;

DGL-luke 1. Sep 2006 11:40

Re: Indy SMTP hat Probleme mit großen Emails ?!
 
Wie lange brauchst du denn sonst für den Upload (!) von 39MB? Irgendwie müssen die ja aus deinem PC raus auf die gegenseite...

Nighthawk1310 1. Sep 2006 12:19

Re: Indy SMTP hat Probleme mit großen Emails ?!
 
Es geht nicht ums Senden, sondern ums Eintüten
[Edit] Jedenfalls geht es nicht direkt ums Senden.

Bei Indy benötige ich ja die TIdMessage und die TIdSMTP.
Und beim Erstellen der Nachricht und dem Hinzufügen der Attachments gibts
das Problem. Und bis dann die SMTP Kompo anfangen kann zu arbeiten dauerts halt.

Mein "Empfangs"-Programm für Emails hat da nicht solche Probleme.
Es arbeitet übrigens auch mit den Indys (dort aber mit POP3).
Gut er braucht dort auch, selbst im Netzwerk, 2-3 min um die Mail zu empfangen,
aber das ist ja nichts im Vergleich dazu die Mail einzutüten und zu senden.

Meine Routinen zum Erstellen und zum Senden der Mail habe ich mit an den ersten Beitrag gehängt.

Nighthawk1310 2. Sep 2006 08:39

Re: Indy SMTP/Indy Message hat Probleme mit großen Emails ?!
 
Habe mein Problem gelöst.


Delphi-Quellcode:
       //Calculate Size

       MS := TMemoryStream.Create;
       msgSend.SaveToStream(MS);
Es war das SaveToStream. Das ist grottenlangsam.
Habe jetzt SaveToFile benutzt und das ist im Gegensatz zu
SaveToStream sehr viel schneller. Habe für das Eintüten eines
130 MB Anhangs, mit Speicherung zur Größenermittlung und kopieren des
Anhangs in ein Backupverzeichnis, keine 3 Minuten auf meinem
Testrechner (PIII 1,3GHz; 384 MB RAM) gebraucht.

Das Thema hat sich also hiermit erledigt.
Trotzdem danke...


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz