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 !
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;
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 ----
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.
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)
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;
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;
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..
Synes godt om
Ny brugerNybegynder
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.