Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   IdSMTP und bcc Fehler (https://www.delphipraxis.net/173416-idsmtp-und-bcc-fehler.html)

josefkoller 23. Feb 2013 13:52

IdSMTP und bcc Fehler
 
Hallo,

ich versende einen News Letter mit Indy (IdMessage und IdSMTP) mittels bcc.

Das Ganze funktionierte auch mit ein paar Test-Mailadressen.

Wenn ich nun die Procedure mit allen Adressen, an die die Mail verschickt werden soll starte, kommt es zu folgender Fehlermeldung:

Delphi-Quellcode:
Im Projekt .... ist eine Exception der Klasse EIdProtocolReplyError aufgetreten.
Meldung: '5.52 <keine>: Recipient adress rejected: need fully-qualified adress'. Prozess wurde angehalten ...
In bcc werden an die 100 Mailadressen eingefügt. Irgendeine löst die genannte Fehlermeldung aus.

Gibt es eine Möglichkeit, zu prüfen, bei welcher Adresse es zu der Fehlermeldung kommt oder gibt es eine Möglichkeit, daß die "falsche" eMailadresse in der bcc-Liste einfach übersprungen wird?

Vielen Dank.

Josef

Klaus01 23. Feb 2013 19:39

AW: IdSMTP und bcc Fehler
 
Guten Abend,

Du könntest vor dem Einfügen überprüfen ob die Adresse in Ordnung ist.
z.B. mit einem regulärem Ausdruck.

Wenn die Adressen in Ordnung sind - aber die Domain eventuell nicht
existiert und deshalb vom Mailserver nicht behandelt wird, dann wird es schwieriger.

Auf den Mailserver hast Du keinen Zugriff?

Grüße
Klaus

josefkoller 23. Feb 2013 21:17

AW: IdSMTP und bcc Fehler
 
Hallo,

vielen Dank für die Antwort.

Zugriff auf den Mailserver??? Was meinst du damit?

Ich benutze den Mailserver meines Hosters. Da was zu manipulieren wird nicht gehen.

Und ich hab den ganzen Nachmittag mit Googlen verbracht.

So wie es ausschaut, funktioniert das mit meiner INDY Version nicht (INDY 9).

In INDY 10 gibt es ein entsprechendes Event beim Versand. In diesem Event kann man den "Fehler" dann abfangen und reagieren, also abbrechen oder weitermachen, usw.

Ich häng immer noch an meinen Delphi Versionen 6 und 7. Ich hab zwar mal versucht Indy 10 zu intallieren, aber es hagelte nichts als Fehlermeldungen. Ich bleib deswegen bei INDY 9.


Mein Problem hab ich jetzt dadurch gelöst, daß ich keine bcc Liste fülle, sondern an alle Empfänger in meiner Liste mittels einer Schleife eine normale EMails schicke.

Die Exception ist in der while Schleife und bei Fehlern wird die Liste weiter abgearbeitet. Evtl. Fehler sehe ich dann in meinem EMailpostfach oder in einem Memofeld und kann die Adressen korrigieren oder aus der Liste streichen.

Ist zwar etwas umständlich aber was soll's.

Hier noch meine Prozedur:

Delphi-Quellcode:
      fDMIMKER.ZQAdressenmailbcc.First;
      while not fDMIMKER.ZQAdressenmailbcc.Eof do
      begin
        try
          IdMessage1.ContentType := 'text/html';
          IdSMTP1.AuthenticationType := atlogin;
          IdMessage1.Body := sdbMemo1.Lines;
          IdMessage1.From.Text :=
            fDMIMKER.ZQMailverbindungMAILMAILADRESSE.AsString;
          IdMessage1.From.Address :=
            fdmimker.ZQMailverbindungMAILMAILADRESSE.AsString;
          IdMessage1.subject := sdbedit1.text;
          IdMessage1.Recipients.EMailAddresses :=
            fDMIMKER.ZQAdressenmailbccADRMAILBCCEMPFAENGER.AsString;
          IdMessage1.Priority := mpNormal;
          Application.ProcessMessages;
          IdSMTP1.Username :=
            fDMIMKER.ZQMailverbindungMAILMAILADRESSE.AsString;
          IdSMTP1.Password := fdmimker.ZQMailverbindungMAILPASSWORT.AsString;
          IdSMTP1.Host :=
            fdmimker.ZQMailverbindungMAILAUSGANGSSERVER.AsString;

          IdSMTP1.Connect;
          Application.ProcessMessages;
          IdSMTP1.Send(IdMessage1);
          Application.ProcessMessages;
        except
          on E: Exception do
          begin
           sMemo1.Text:= sMemo1.Text + 'Fehler bei EMailadresse:        
             '+fdmimker.ZQAdressenmailbccADRMAILBCCEMPFAENGER.AsString+#10#13+e.Message+#10#13;
          end;
        end;
        fDMIMKER.ZQAdressenmailbcc.Next;
        IdSMTP1.Disconnect;
      end;
Ciao

Josef

Sir Rufo 23. Feb 2013 21:44

AW: IdSMTP und bcc Fehler
 
Nun dann hast du doch auch die fehlerhaften mail-Adressen.

Aber was hindert dich, die mail-Adressen vorher zu prüfen und die schlechten zu filtern?

josefkoller 23. Feb 2013 23:35

AW: IdSMTP und bcc Fehler
 
Hallo,

diese Mailliste ist ja nicht statisch, sondern sie verändert sich laufend. Soll heißen neue Adressen kommen hinzu, alte, die funktionierten können aufgegeben werden oder was auch immer.

Ich muß also immer erst Mal "normal", also jede EMailadresse einzeln, abschicken, um Bescheid zu wissen.

Und wenn die Mail dann schon abgeschickt ist, brauch ich anschließend nicht nochmal mit bcc zu verschicken.

Ciao

Josef

Sir Rufo 24. Feb 2013 01:26

AW: IdSMTP und bcc Fehler
 
Also wenn der Fehler "need fully qualified address" ist, dann entsprechen die mail-Adressen nicht dem Standard und können auch vorher rausgefiltert werden.

Hast du mal eine solche mail-Adresse als Beispiel da?
Alle Buchstaben kannst du ja mit x ersetzen und alle Ziffern mit 0.

josefkoller 24. Feb 2013 09:19

AW: IdSMTP und bcc Fehler
 
Hallo,

danke Dir, daß Du Dich meines Problems annimmst.

Beim Abschicken (IdSMTP1.Send(IdMessage1) einzeln mittels while schleife passiert folgendes:

"Falsche" Emailaddressen werden auch abgeschickt. In diesem Fall kommt eine Returnmessage vom Server in mein EMailpostfach.

Diese "falschen" EMailadressen lösen keine Exception aus. Ich kann sie aber eben mit dieser Returnmessage korrigieren oder streichen.

Aber eine Adresse löst eine Exception aus. Die entsprechende Fehlermeldung siehe ganz oben im Eingangspost wird in mein Memofeld eingetragen.

Bei der Exceptionbehandlung hab ich auch noch stehen, daß der Datensatz mit in das Memofeld geschrieben wird.

Das passiert aber nicht. Ich weiß also immer noch nicht, wer diesen Fehler auslöst.

Du schreibst:
Zitat:

Also wenn der Fehler "need fully qualified address" ist, dann entsprechen die mail-Adressen nicht dem Standard und können auch vorher rausgefiltert werden.
Wie geht denn das? Der Fehler wird bei IdSMTP1.Send ausgelöst. Wie komm ich denn vor dem Send an die falsche Adresse?

Danke.

Josef

Sir Rufo 24. Feb 2013 11:16

AW: IdSMTP und bcc Fehler
 
Ok, da du uns die verfremdeten Adressen nicht geben möchtest ...

versuche doch mal die Adressen nicht komplett, sondern in Blöcken zu versenden (z.B. max 10 Stück)
Da wo der Fehler auftaucht ist dann die fehlerhafte Adresse.

Es kann natürlich auch sein, dass die BCC Liste zu lang wird ... alles ist möglich ... und dann wirst du die auf jeden Fall eben kürzen müssen.

Union 24. Feb 2013 11:24

AW: IdSMTP und bcc Fehler
 
Zitat:

Zitat von josefkoller (Beitrag 1204841)
Hallo,
ich versende einen News Letter mit Indy (IdMessage und IdSMTP) mittels bcc.

Und wieso schreibst Du dann die EMail-Adressen in Recipients und nicht in BccList?

Delphi-Quellcode:
IdMessage1.Recipients.EMailAddresses := fDMIMKER.ZQAdressenmailbccADRMAILBCCEMPFAENGER.AsString;

josefkoller 24. Feb 2013 12:26

AW: IdSMTP und bcc Fehler
 
Hallo,

blöd....
Da kommt was durcheinander.
Die Behlszeile, die Du zitierst, stammt aus der Procedure mit der ich die Mails einzeln durch eine While schleife verschicke.

Davor wollte ich eben mit bcc verschicken und da wird der ganze Versand eben wegen dieser Exception abgebrochen.

Mit bcc sah die Procedure so aus:

Delphi-Quellcode:
//bcc Part

  fDMIMKER.ZQAdressenmailbcc.First;
  while not fDMIMKER.ZQAdressenmailbcc.Eof do
  begin
    IdMessage1.BccList.Add.Address :=
       fdmimker.ZQAdressenmailbccADRMAILBCCEMPFAENGER.AsString;
    fDMIMKER.ZQAdressenmailbcc.Next;
  end;
Emailadressenbeispiele kann ich schon geben:

Die erzeugte bcc Liste sieht so aus :

Code:
'info@josefkoller.de,bubiii@web.de, baerbelmeier@t-online.de, ....usw'.
Es sind weit über 100 momentan.

Der Vorteil mit bcc zu verschicken wäre, daß nur eine EMail versandt wird. Würde ruckzuck gehen.

Bei meiner jetzigen Methode werden über 100 Mails verschickt und das dauert.

Ich bräucht halt irgendwas, um vor dem Send schon zu prüfen, welche den die Exception auslöst.

Und wenn's an der Anzahl der Adressen liegt, müßt ich auch irgendwie wissen, wieviele ich denn reinpacken kann.

Ich kann schlecht blockweise mit den vorhandenen Wirkadressen rumhantieren. Die würden sich wundern, wenn dauernd Mails von mir bei Ihnen auftauchen oder auch nicht.

Ich könnt die bcc Liste auch 100 mal mit meiner eigenen Adresse füllen. Da käm ich dann dahinter, ob es an der Anzahl der Einträge liegt.

Aber wenn die Exception durch eine "falsche" Wirkemailadresse verursacht wird ....

Irgendwas zum Prüfen vor dem Send, daß wär's.

danke nochmal.

Josef

Sir Rufo 24. Feb 2013 12:42

AW: IdSMTP und bcc Fehler
 
Eventuell solltest du von Indy weg und zu Ararat Synapse hin.

Da hast du dem Mail-Versand wesentlich besser im Griff ...

Delphi-Quellcode:
LSmtp : TSmtpSend;
LReceivers : TStringList;
LMail : TStringList;

// Wer sendet
if not LSmtp.MailFrom( LFromAddress, LMailSize ) then
  raise Exception.CreateFmt('SMTP.MailFrom(%s,%d) > %s ',[LFromAddress,LMailSize,LStmp.ResultString]);

// An wen wird gesendet
for LReceiver in LReceivers do
  // Jede Empfänger-Adresse wird einzeln an den Server gesendet
  // Somit bekommt man auch für jede Adresse eine Rückmeldung,
  // ob dieser Empfänger akzeptiert wird
  if not LSmtp.MailTo( LReceiver ) then
    begin
      // Mail-Adresse merken, oder was auch immer machen
    end;

// Was wird gesendet
if not LSmtp.MailData( LMail ) then
  raise Exception.CreateFmt( 'SMTP.MailData > %s',[LSmtp.ResultString] );
BTW: Wer und an wen gesendet wird muss nichts mit dem zu tun haben, was in der Mail selber drin steht.

Union 24. Feb 2013 12:49

AW: IdSMTP und bcc Fehler
 
Wenn das beim Send auftritt und Du diese meinst:
Code:
Meldung: '5.52 <keine>: Recipient adress rejected: need fully-qualified adress'.
Dann ist das keine Meldung von Indy, sondern vom eingesetzten SMTP Server. Auf die Prüfungen die dort durchgeführt werden, hast Du keinen Zugriff und auch kein Wissen darüber. Einige Server prüfen z.b. die Erreichbarkeit der Domain, andere sogar die Zustellbarkeit. Es könnte auch sein dass durch die große BCC Liste eine fest eingestellte maximale Headergröße des Servers überschritten wird etc. Wenn es sich tatsächlich um Fehler in den Mailadressen handelt, dann wirst Du ja die entsprechenden Einzelmails rejected bekommen und kannst dann evtl. wie bereits vorgeschlagen eine Prüfroutine über die Adressliste laufen lassen.

Sir Rufo 24. Feb 2013 13:34

AW: IdSMTP und bcc Fehler
 
Hier mal ein angepasster Quelltext mit synapse für deine Umgebung. Damit solltest du die fehlerhaften Mails besser herausfinden können.
Delphi-Quellcode:
type
  TForm1 = class( TForm )
    Button1 : TButton;
    sdbMemo1 : TMemo;
    ListBox1 : TListBox;
    procedure Button1Click( Sender : TObject );
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1 : TForm1;

implementation

{$R *.dfm}

uses
  smtpsend, mimemess, // ararat synapse units
  DMIMKER;

procedure TForm1.Button1Click( Sender : TObject );
var
  LMail : TMimeMess;
  LSmtp : TSMTPSend;
begin
  fDMIMKER.ZQMailverbindung.Open;
  try

    fDMIMKER.ZQAdressenmailbcc.Open;
    try

      LSmtp := TSMTPSend.Create;
      try

        LSmtp.TargetHost := fDMIMKER.ZQMailverbindungmailausgangsserver.AsString;
        LSmtp.TargetPort := '25';
        LSmtp.UserName  := fDMIMKER.ZQMailverbindungmailmailadresse.AsString;
        LSmtp.Password  := fDMIMKER.ZQMailverbindungmailpasswort.AsString;

        LMail := TMimeMess.Create;
        try

          // Header
          LMail.Header.From    := fDMIMKER.ZQMailverbindungmailmailadresse.AsString;
          LMail.Header.Subject := 'Test-Mail';
          LMail.Header.Priority := MP_normal;

          // Body
          LMail.AddPartHTML( sdbMemo1.Lines, nil );

          // Mail codieren
          LMail.EncodeMessage;

          if not LSmtp.Login
          then
            raise Exception.CreateFmt( 'SMTP.Login > %s', [LSmtp.ResultString] );

          try

            if not LSmtp.MailFrom( fDMIMKER.ZQMailverbindungmailmailadresse.AsString, 0 )
            then
              raise Exception.CreateFmt( 'SMTP.MailFrom > %s', [LSmtp.ResultString] );

            fDMIMKER.ZQAdressenmailbcc.First;

            while not fDMIMKER.ZQAdressenmailbcc.Eof do
              begin

                if not LSmtp.MailTo( fDMIMKER.ZQAdressenmailbccadrmailbccempfaenger.AsString )
                then
                  // fehlerhafte Mailadressen werden in eine Listbox ausgegeben
                  ListBox1.Items.Add( fDMIMKER.ZQAdressenmailbccadrmailbccempfaenger.AsString + ' > ' + LSmtp.ResultString );

                fDMIMKER.ZQAdressenmailbcc.Next;
              end;

            if not LSmtp.MailData( LMail.Lines )
            then
              raise Exception.CreateFmt( 'SMTP.MailData > %s', [LSmtp.ResultString] );

          finally

            if not LSmtp.Logout
            then
              raise Exception.CreateFmt( 'SMTP.Logout > %s', [LSmtp.ResultString] );

          end;

        finally
          LMail.Free;
        end;

      finally
        LSmtp.Free;
      end;

    finally
      fDMIMKER.ZQAdressenmailbcc.Close;
    end;

  finally
    fDMIMKER.ZQMailverbindung.Close;
  end;
end;

end.

josefkoller 24. Feb 2013 17:22

AW: IdSMTP und bcc Fehler
 
Hallo,

ich glaub, ich hab den Fehler.

Ich hab in der bcc Liste auch meine EMailadresse mit eingetragen. Diese Adresse ist identisch mit der Adresse, die ich in

IdMessage1.From.Address :=

stehen habe.

Meine eigene Adresse hab ich deswegen mit rein, weil ich das Ergebnis der Mail sehen wollte.
Das scheint die Exception auszulösen.

ich hab meine eigene Adresse aus der bcc-Liste raus und schon funktioniert es.

Delphi-Quellcode:
      try
        try
          IdMessage1.ContentType := 'text/html';
          IdSMTP1.AuthenticationType := atlogin;
          IdMessage1.Body := sdbMemo1.Lines; // Text
          IdMessage1.From.Address :=
            fdmimker.ZQMailverbindungMAILMAILADRESSE.AsString; // eigene EMailadresse
          IdMessage1.subject := sdbedit1.text; // Betreff
          IdMessage1.Priority := mpNormal;
          Application.ProcessMessages;

          //bcc Part
          s := '';
          fDMIMKER.ZQAdressenmailbcc.First;
          while not fDMIMKER.ZQAdressenmailbcc.Eof do
          begin
            s := s + IdMessage1.BccList.EMailAddresses +
              fdmimker.ZQAdressenmailbccADRMAILBCCEMPFAENGER.AsString+' ,';
            fDMIMKER.ZQAdressenmailbcc.Next;
          end;

          IdMessage1.BccList.EMailAddresses := s;
          IdMessage1.ReceiptRecipient.Address:= '';//wird autom mit'undisclosed-recipients' gefüllt;
 
          IdSMTP1.Username :=
            fDMIMKER.ZQMailverbindungMAILMAILADRESSE.AsString;
          IdSMTP1.Password := fdmimker.ZQMailverbindungMAILPASSWORT.AsString;
          IdSMTP1.Host :=
            fdmimker.ZQMailverbindungMAILAUSGANGSSERVER.AsString;

          IdSMTP1.Connect;
          Application.ProcessMessages;
          IdSMTP1.Send(IdMessage1);
        except
          on E: Exception do
          begin
           showmessage(e.Message);
          end;
        end;
     finally
       IdSMTP1.Disconnect;
     end;
Die vielen Application.Processmessages sind nur drin, damit mein Fortschrittsbalken zwischendurch "aktualisiert" wird.

Also die IdMessage1.From.Address nicht mit in die bcc-Liste.

Vielleicht braucht diesen Hinweis ja mal wer. (funktioniert so mit Indy 9);

Ciao

Josef

Sir Rufo 24. Feb 2013 18:39

AW: IdSMTP und bcc Fehler
 
Sieht so aus als ob Indy bei Mailadressen in der gleichen Domain (wie der Sender) diese abtrennt.
Das erklärt dann auch die Fehlermeldung :)

josefkoller 24. Feb 2013 20:48

AW: IdSMTP und bcc Fehler
 
Hallo,

bevor ich es wieder vergessen:

Hast einen tollen Spruch in Deiner Signatur. In meinem Fall trifft es nun ja tatsächlich den Kern der Sache.

Danke auch für den "Ausweich Code" mit Synapse. Ich hab auch schon daran gedacht, von Indy wegzugehen.

Synapse oder ICS würde sich anbieten. Ich scheu mich aber, wegen der Umstellerei.

Ich hab alles (Datenimport aus einer Web DB, die Mailverschickerei und solche Sachen) über Indy realisiert.

Deine Vermutung, daß die SMpt Komponente was aus den übergebenen Mailstrings rausschneidet, scheint tatsächlich der Grund meines Übels zu sein.

Wenn man z. b. die Eigenschaft:

IdMessage1.ReceiptRecipient.Address := mit dem Wert 'undisclosed-recipients' belegt, wird dieser String ebenfalls bei einer existierenden bcc-Liste entfernt.

Wahrscheinlich wurde auch in der bcc-Liste der doppelte info@josefkoller.de entfernt. Dann bleibt ein Komma am Anfang des Strings stehen. Und schon passiert es.

Z. b. bei meiner rumprobierei von mir so zusammen gestellt:
Code:
'info@josefkoller.de,test@t-online.de,test@gmx.de'
Mit breakpoint in der smpt.pas bei der Send Procedure nochmals überprüft:
Code:
',test@t-online.de, test@gmx.de'
Das Komma bleibt am Anfang stehen. Das kann ja nicht funktionieren.

Nochmals besten Dank für Deine Mühe.

ciao

Josef


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