Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Mit ICS (TSmtpCli) mehrere Mails direkt nacheinander verschicken (https://www.delphipraxis.net/164986-mit-ics-tsmtpcli-mehrere-mails-direkt-nacheinander-verschicken.html)

baurat 8. Dez 2011 16:58


Mit ICS (TSmtpCli) mehrere Mails direkt nacheinander verschicken
 
Hallo zusammen,

ich hätte da mal wieder eine Frage :)

Ich hab ein Programm, dass bei bestimmten Useraktionen automatisch Emails verschickt, entwickelt mit Delphi 6 prof auf Vista.

Dazu hab ich mir die ICS (die letzte für D6) runtergeladen (TSmtpCli).

Verschicke ich eine einzelne Mail, klappts problemlos.
Wenn ich aber in einer Schleife mehrere Vorgänge automatisch ablaufen lasse, bekomm ich einen Fehler (SMTP Component not ready). So wie ich das interpretiere, ist der SmtpClient noch damit beschäftigt, die erste Mail zu verschicken, und dann kommt aber sofort die nächste rein, will connecten und dann kommts zur Fehlermeldung. Baue ich nach jedem Durchgang ne Pause von 5 sek. ein, klappts.

Fragen: Interpretiere ich das richtig? Wenn ja - wie bringe ich mein Programm dazu, die neuen Mails so lange warten zu lassen, bis die Mailkomponente wieder frei ist? (sowas wie ne Queue?).
Oder liege ich mit meiner Vermutung falsch und es liegt an was ganz anderem?

Ich brauch keinen "Massenversand", es sind maximal vielleicht 20 Mails die nacheinander rausgehen (an unterschiedliche Empfänger mit unterschiedlichem Inhalt).

Vielen Dank schon mal für die Hilfe!

LG Heiko

mjustin 8. Dez 2011 17:14

AW: Mit ICS (TSmtpCli) mehrere Mails direkt nacheinander verschicken
 
Zitat:

Zitat von baurat (Beitrag 1140341)
So wie ich das interpretiere, ist der SmtpClient noch damit beschäftigt, die erste Mail zu verschicken, und dann kommt aber sofort die nächste rein, will connecten und dann kommts zur Fehlermeldung. Baue ich nach jedem Durchgang ne Pause von 5 sek. ein, klappts.

Das ist wahrscheinlich kein client- sondern ein serverseitiger "Fehler": der Client versucht die nächste Mail zu senden, während der Server noch etwas Zeit benötigt. Der Server kann dies auch tun, um Spamversand zu begrenzen, also das "not ready" nur vortäuschen. (d.h. er könnte schon, will aber noch nicht)

Wenn der Server im eigenen Einflussbereich ist, kann man das Limit heraufsetzen lassen - also zum Beispiel einen Versand pro Sekunde erlauben lassen. Ich würde es bei lediglich zwanzig Mails aber nicht als dramatisch empfinden, und den Admin nicht wecken :)

baurat 8. Dez 2011 17:52

AW: Mit ICS (TSmtpCli) mehrere Mails direkt nacheinander verschicken
 
Hm, daran hab ich noch gar nicht gedacht - Danke. Versand läuft über popeligen 1&1 SMTP. Aber wenn ich mir im Logfenster die ganze Kommunikation zwischen Server und Client anschaue, hab ich schon den Eindruck, dass es so lang dauert, bis jede Mail durch ist - meine DSL-Anbindung ist wahrlich nicht die schnellste, dann kann ich sogar beim Mailen aus Thunderbird zuschauen, wie der Fortschrittsbalken zunimmt.

Ich hab mir jetzt nen roten Button gemalt, der an ist, solange die Mailkomponente sendet. Vorm Verschicken der nächsten Mail kommt ein MessageDialog, den ich halt erst dann klicken darf, der Button wieder aus ist. Willkommen in der Steinzeit! Aber grad fällt mir nichts andres ein.

Hab auch mal die Synapse Mailkomponente versucht, die macht den Fehler nicht, kann aber eine Mail nicht mit cc verschicken, so dass es damit noch länger dauern würde :(

Sir Rufo 8. Dez 2011 18:11

AW: Mit ICS (TSmtpCli) mehrere Mails direkt nacheinander verschicken
 
logisch kann man mit synapse per cc versende

baurat 8. Dez 2011 18:21

AW: Mit ICS (TSmtpCli) mehrere Mails direkt nacheinander verschicken
 
Zitat:

logisch kann man mit synapse per cc versende
In meiner Doku steht:
Delphi-Quellcode:
Class TSMTPSend    Implementation of SMTP and ESMTP procotol
Functions and Procedures
function SendToRaw(const MailFrom, MailTo, SMTPHost: string; const MailData: TStrings; const Username, Password: string): Boolean;
function SendTo(const MailFrom, MailTo, Subject, SMTPHost: string; const MailData: TStrings): Boolean;
function SendToEx(const MailFrom, MailTo, Subject, SMTPHost: string; const MailData: TStrings; const Username, Password: string): Boolean;
Hmmm.... MailTo ist ein einfacher String!?! Hast du dir da was eigenes gebastelt?

baurat 8. Dez 2011 18:29

AW: Mit ICS (TSmtpCli) mehrere Mails direkt nacheinander verschicken
 
Autsch. Einfach mit Komma aufzählen. Warum komm ich da nicht von allein drauf...?

Danke Rufo ;)

PS: Es dauert einfach bis zu 2 Sekunden, bis eine Mail rausgegangen ist - egal ob mit Synapse oder ICS.

Sir Rufo 8. Dez 2011 19:42

AW: Mit ICS (TSmtpCli) mehrere Mails direkt nacheinander verschicken
 
Schau dir doch mal an, wie die das mit dem Versenden machen:
Delphi-Quellcode:
function SendToEx(const MailFrom, MailTo, Subject, SMTPHost: string;
  const MailData: TStrings; const Username, Password: string): Boolean;
var
  t: TStrings;
begin
  t := TStringList.Create;
  try
    t.Assign(MailData);

    // Header

    t.Insert(0, '');
    t.Insert(0, 'X-mailer: Synapse - Delphi & Kylix TCP/IP library by Lukas Gebauer');
    t.Insert(0, 'Subject: ' + Subject);
    t.Insert(0, 'Date: ' + Rfc822DateTime(now));
    t.Insert(0, 'To: ' + MailTo);
    t.Insert(0, 'From: ' + MailFrom);

    // Mail-Versand

    Result := SendToRaw(MailFrom, MailTo, SMTPHost, t, Username, Password);

  finally
    t.Free;
  end;
end;
Jetzt mal eine procedure mit CC und BCC

Delphi-Quellcode:
function SendToExtended(const MailFrom, MailTo, MailCC, MailBCC, Subject, SMTPHost: string;
  const MailData: TStrings; const Username, Password: string): Boolean;
var
  t: TStrings;
  Receiver : string;
begin
  t := TStringList.Create;
  try
    t.Assign(MailData);

    // Header

    t.Insert(0, '');
    t.Insert(0, 'X-mailer: Synapse - Delphi & Kylix TCP/IP library by Lukas Gebauer');
    t.Insert(0, 'Subject: ' + Subject);
    t.Insert(0, 'Date: ' + Rfc822DateTime(now));
    t.Insert(0, 'CC: ' + MailCC);
    t.Insert(0, 'To: ' + MailTo);
    t.Insert(0, 'From: ' + MailFrom);

    // Empfänger zusammenbauen

    Receiver := MailTo;
    if ( Receiver <> '' ) and ( MailCC <> '' ) then
      Receiver := Receiver + ',';
    Receiver := Receiver + MailCC;

    if ( Receiver <> '' ) and ( MailBCC <> '' ) then
      Receiver := Receiver + ',';
    Receiver := Receiver + MailBCC;

    // Mail-Versand

    Result := SendToRaw(MailFrom, Receiver, SMTPHost, t, Username, Password);

  finally
    t.Free;
  end;
end;
Und jetzt rate mal, warum die BCC-Empfänger trotzdem die Mail empfangen, obwohl diese im Mail-Header gar nicht enthalten sind ;)

baurat 9. Dez 2011 17:06

AW: Mit ICS (TSmtpCli) mehrere Mails direkt nacheinander verschicken
 
Hab ich sogar reingekuckt, das wär dann der nächste Versuch gewesen, die Empfängerliste einfach zu erweitern.

Hatte anfangs bereits Synapse, dann wg. CC und vermeintlich zu lahmer Performance beim Senden zu ICS, jetzt wieder Synapse mit der Erkenntnis, dass die Dauer zum Versenden einfach leitungsabhängig ist und egal mit welchem Client einfach eine oder mehr Sekunden braucht. Das muss man einfach mal abwarten (oder ich lager das in nen extra Thread aus?).

Wieder mal besten Dank für den entscheidenden Tipp!

(Ach so und als Antwort auf deine Frage: der Mailheader ist ja bekanntlich geduldig und glaubt einem alles... das ist also klar, dass die BCC-Leute die Mail bekommen, wenn sie in der Empfängerliste stehen. Aber Gegenfrage: sind ihre Adressen bei den anderen dann wirklich nicht sichtbar?)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:03 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