Avatar billede azs Nybegynder
23. november 2000 - 23:15 Der er 13 kommentarer og
1 løsning

François PIETTE - SMTP Comp !

Hvordan bruger man François PIETTE SMTP component ?

Jeg har prøvet med det eks. som er med componenten men jeg kan ikke få det til at virke med mit program !

Jeg får denne fejl :
SMTP component not ready
Hvis jeg så trykker på send knappen igen får jeg denne fejl :
SMTP component already connected

Er der nogen som kan hjælpe mig ?

Måske en kode til hvordan jeg skal gøre ?

Min koden til SEND knapper er :

  SMTP.Host := Host.Text;
  SMTP.Port := \'smtp\';
  SMTP.Connect;
    SMTP.SignOn          := Fra.Text;
    SMTP.HdrFrom        := Mail.Text;
    SMTP.HdrTo          := nummer;
    SMTP.HdrSubject      := Fra.Text;
    SMTP.FromName        := Fra.Text;
    SMTP.MailMessage    := Tekst.Lines;
    SMTP.Host            := Host.Text;
    SMTP.Port            := \'smtp\';
    SMTP.Mail;
  SMTP.Quit;

PS : Den skal både connecten og disconnecte når trykker på Send knappen og hvis man ikke er på nettet skal den komme med en fejl om at man ikke er på nettet !
Avatar billede borrisholt Novice
23. november 2000 - 23:26 #1
hvis du starter med at lave dig en funktion der kan konvetere en smtpState til en streng så kan du se hvad der foregår :

Function SmtpStateToString (State : TSmtpState) : String;
begin
  case State of
  smtpReady : result :=  \'Ready\';
  smtpDnsLookup : result:= \'Dns Lookup\';
  smtpConnecting : result:= \'Connecting ...\';
  smtpConnected : result:= \'Connected !\';
  smtpInternalReady : result:= \'Ready\';
  smtpWaitingBanner : result:= \'Waiting for Banner\';
  smtpWaitingResponse : result:= \'Waiting for Response\';
  smtpAbort : result:= \'Abort\';
  else  result:= \'None\';
  end
end;


når så du skal send så skal du klappe hesten lidt
prøv at studere det følgende kode :

procedure TForm1.EMailList1Click(Sender: TObject);
  function ListItemToString(const ListItem : TListItem) : String;
  begin
    result := \'\';
    result := result + ListItem.Caption;
    result := result + \',\';
    result := result + ListItem.SubItems[0];
    result := result + \',\';
    result := result + ListItem.SubItems[1];
  end;
var
  i : Integer;
  Strings : TStringList;
begin
    SmtpClient.Host            := FormSetup.EditSMTPServer.Text;
    SmtpClient.Port            := FormSetup.EditSMTPPort.Text;

    SmtpClient.Open;

    While SmtpClient.State <> smtpReady do
    begin
      StatusBar1.SimpleText := SmtpStateToString (SmtpClient.State);
      Application.ProcessMessages;
    end;

    BuildRcptList;


    if SmtpClient.State <> smtpReady then
      exit;

    SmtpClient.HdrTo          := FormSetup.EditRecpient.Text;
    SmtpClient.HdrSubject      := \'CD List from \' + FormSetup.SMTPName.Text;
    SmtpClient.FromName        := FormSetup.SMTPName.Text;
    SmtpClient.HdrFrom        := FormSetup.SMTPName.Text;


    SmtpClient.Host            := FormSetup.EditSMTPServer.Text;
    SmtpClient.Port            := FormSetup.EditSMTPPort.Text;


  Strings := TStringList.Create;

  for i:= 0 to pred(Listview1.Items.Count) do
  begin
    if Listview1.Items[i].Checked then
      Strings.Add(ListItemToString(Listview1.Items[i]));
  end;

    SmtpClient.MailMessage.Assign(Strings);

    SmtpClient.Mail;

    While SmtpClient.State <> smtpReady do
    begin
      StatusBar1.SimpleText := SmtpStateToString (SmtpClient.State);
      Application.ProcessMessages;

    end;

    SmtpClient.Quit;

    Strings.free;
end;


Som det ses er det dit eget ansvar at vente på at din socket (SMTP komponent) bliver klar ....

Kodeen er taget fra et lille program der kan sende en liste pr. email til en 3. part ... Hvis du vil have hele programmer må du lige skrive til mig ----

Jens B
Avatar billede azs Nybegynder
23. november 2000 - 23:30 #2
OK hvad er din Email ?
Avatar billede borrisholt Novice
23. november 2000 - 23:31 #3
Jens@Borrisholt.com
Avatar billede azs Nybegynder
23. november 2000 - 23:41 #4
Jeg ser lige på det og kommer tilbage her imorgen, når jeg har set om jeg kan få det til at virke!
Avatar billede pellelil Nybegynder
24. november 2000 - 07:35 #5
Jeg gætter på at du måske connecter \"for tidligt\". Selv har jeg valgt at bruge componentet på denne måde:

<SNIP>
  if MessageText.Count > 0 then begin  // if there is no lines to mail then...
    with GlobalPollFrame.NMSMTP_Message do begin
      PostMessage.Body.Clear;
      PostMessage.Body.Assign(MessageText);
      szSubject := AnsiUppercASE(AS400LoggedRecord.Table.TableName) + \'/\';
      case AS400LoggedRecord.TriggerType of
        0 : szSubject := szSubject + \'CREATE: \';
        1 : szSubject := szSubject + \'UPDATE: \';
        2 : szSubject := szSubject + \'DELETE: \';
      end;
      szSubject := szSubject + MessageName;
      szSubject := AS400LoggedRecord.ReplaceFieldNamesWithValue(szSubject);
      PostMessage.Subject := szSubject;
      UserQuery := TQuery.Create(Nil);
      try
        UserQuery.DatabaseName := \'FccSoft\';
        UserQuery.SQL.Clear;
        UserQuery.SQL.Add(\'SELECT u.EMailAddress \');
        UserQuery.SQL.Add(\'FROM MessageUsers mu, FccSoft.dbo.Users u\');
        UserQuery.SQL.Add(\'WHERE (mu.MessageID = \' + Chr(39) + MessageID + Chr(39) + \')\');
        UserQuery.SQL.Add(\'AND  (mu.UserId = u.UserId)\');
        UserQuery.Open;
        if not((UserQuery.EOF) and (UserQuery.BOF)) then begin
          UserQuery.First;
          PostMessage.ToAddress.Clear;
          while not UserQuery.EOF do begin
            szUser := UserQuery.FieldByName(\'EMailAddress\').AsString;
            PostMessage.ToAddress.Add(szUser);
            UserQuery.Next;
            GlobalPollFrame.PollMails := GlobalPollFrame.PollMails + 1;
          end;
          try
            Connect;
            SendMail;
          finally
            Disconnect;
          end;
        end;
      finally
        UserQuery.Close;
        UserQuery.Free;
      end;
    end;
  end;
</SNIP>

Som du kan se har jeg taget et direkte \"klip\" fra et af mine programmer. Den \"inderste\" Try..finally viser at jeg først connecter når jeg har sat alle mine parametre, hvorefter jeg køre en SendMail og så Disconnect\'er jeg igen.
Foruden hvad jeg sætter i koden så har jeg i designfasen sat: Host, Port, UserID.

Jeg har ikke prøvet men logisk burde du nu nok kunne connecte lige så snart du har sat server-adr, port og bruger.
Avatar billede azs Nybegynder
24. november 2000 - 20:19 #6
borrisholt -> Det som du sendte kunne jeg ikke få til at virke !
Det connecter og alt det der men den sender ikke noget !

pellelil -> Det er ikke NMSMTP Componentet men FPIETTE\'s SMTP component. Den man kan få her http://users.swing.be/francois.piette/smtpcliuk.htm.

Hvis du vil lave det om til FPIETTE\'s SMTP Client så kan får du pointne !
Avatar billede azs Nybegynder
25. november 2000 - 18:16 #7
hmm... Vil i ikke hjælpe mig mere ?

I kan da godt få 100 point hvis i vil hjælpe mig med det !
Avatar billede azs Nybegynder
26. november 2000 - 15:29 #8
hm.. kan i ikke bare skrive noget tilbage ???
Avatar billede phansen Nybegynder
26. november 2000 - 21:26 #9
Brug en sniffer for at se, hvad der sker.
Jeg tror du mangler at sende HELO til mailserveren - prøv en
  SMTP.Helo;
før din
  SMTP.Mail;
...

Eller brug SMTP.Open i stedet for SMTP.Connect - så skal du dog sætte helo var\'en før du connecter. Hvorfor sætter du egentlig først variablene efter du er connected?

Hvis det ikke virker, så er det muligvis fordi at komponenten er asynkron - altså at den f.eks. returnerer fra et kald til connect med det samme, mens den i baggrunden begynder at connecte.. Så kan det være at du når til at bede den om at sende noget, før den har connectet... Ved ikke om den er asynkron tho..

Prøv det med helo og smid en kommentar hvis det ik\' virker :o)
Avatar billede azs Nybegynder
27. november 2000 - 10:36 #10
phansen -> Vil du ikke prøve at lave et eks. ???
Avatar billede phansen Nybegynder
28. november 2000 - 12:12 #11
Ack, kan ikke lige finde min ICS, så jeg kan altså ikke checke om det virker.. let me know..
Lav en form, smid en knap og en TSyncSMTPCli på og prøve det her..
Hvis det virker kan du jo evt. prøve og fjerne sync fra alle procedure kaldene og skifte tsyncsmtpcli ud med en tsmtpcli og se om det også virker..


procedure Form1.Button1Click(Sender: TObject);
var i: integer;
begin
  with SMTP do
  begin
    ConnectSync;

    SignOn:=\'mig.worldonline.dk\';
    HeloSync;

    FromName:=\'mig@worldonline.dk\';
    MailFromSync;

    RcptName.Clear;
    RcptName.Add(\'dig@worldonline.dk\');
    RcptToSync;

    HdrFrom:=\'Mig!! <mig@worldonline.dk>\';
    HdrTo:=\'Dig?! <dig@worldonline.dk>\';
    HdrSubject:=\'test!!\';
    MailMessage.Clear;
    i:=0;
    while i < Memo1.Lines.Count do
    begin
      SMTP.MailMessage.Add(Memo1.Lines.Strings[i]);
      Inc(i);
    end;
    EmailFiles.Clear;
    // evt. contenttype og charset.
    DataSync;

    QuitSync;
  end;
end;
Avatar billede phansen Nybegynder
28. november 2000 - 12:13 #12
smid også lige en memo1 på den form, ik\'..
Avatar billede azs Nybegynder
01. december 2000 - 17:08 #13
phansen  -> Hvad er forskellen på en SyncSMTPcli og en SMTPcli ??
Avatar billede phansen Nybegynder
09. december 2000 - 13:54 #14
Alle de metoder i sync\'en der har Sync i procedurenavnet er bare en indkapsling af de asynkrone procedurer. Indkapslingen består af en funktion, der tjekker om proceduren er færdig, før den returnerer kontrollen til dit program.
Hvis du vil bruge den asynkrone version, så skal du sende en kommando til kontrollen ad gangen, og så vente på at den tilsvarende \'done\' event bliver kaldt, før du kan sende den næste. Hermed spares noget processortid, men det er også besværligere at kode..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester