![]() |
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:
und auch noch die function zum Senden der fertigen Email
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;
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; |
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...
|
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. |
Re: Indy SMTP/Indy Message hat Probleme mit großen Emails ?!
Habe mein Problem gelöst.
Delphi-Quellcode:
Es war das SaveToStream. Das ist grottenlangsam.
//Calculate Size
MS := TMemoryStream.Create; msgSend.SaveToStream(MS); 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 03:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz