AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Mit ICS (TSmtpCli) mehrere Mails direkt nacheinander verschicken
Thema durchsuchen
Ansicht
Themen-Optionen

Mit ICS (TSmtpCli) mehrere Mails direkt nacheinander verschicken

Ein Thema von baurat · begonnen am 8. Dez 2011 · letzter Beitrag vom 9. Dez 2011
Antwort Antwort
baurat

Registriert seit: 20. Jan 2007
34 Beiträge
 
#1

Mit ICS (TSmtpCli) mehrere Mails direkt nacheinander verschicken

  Alt 8. Dez 2011, 17:58
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
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#2

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

  Alt 8. Dez 2011, 18:14
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
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
baurat

Registriert seit: 20. Jan 2007
34 Beiträge
 
#3

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

  Alt 8. Dez 2011, 18:52
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
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

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

  Alt 8. Dez 2011, 19:11
logisch kann man mit synapse per cc versende
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
baurat

Registriert seit: 20. Jan 2007
34 Beiträge
 
#5

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

  Alt 8. Dez 2011, 19:21
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?
  Mit Zitat antworten Zitat
baurat

Registriert seit: 20. Jan 2007
34 Beiträge
 
#6

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

  Alt 8. Dez 2011, 19:29
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

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

  Alt 8. Dez 2011, 20:42
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
baurat

Registriert seit: 20. Jan 2007
34 Beiträge
 
#8

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

  Alt 9. Dez 2011, 18:06
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?)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:35 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