Avatar billede kennethv Nybegynder
23. september 2009 - 11:17 Der er 10 kommentarer og
1 løsning

Hvordan opretter man en tråd med en SMTP

Jeg har en tråd som løber igennem en db. Hvis der er ændringer i den skal den sende mig en mail.

Hvordan klares dette?
Avatar billede kroning Nybegynder
23. september 2009 - 12:06 #1
Indy har en SMTP komponent der virker ganske fint.
Avatar billede kennethv Nybegynder
23. september 2009 - 12:21 #2
Det er osse den jeg har haft kigget på, men jeg ved ikke hvordan man sætter det sammen med en tråd.

Jeg har denne:

constructor TMyThread2.Create;
begin
  inherited Create(true); // Start med at sove
  fValue := 0; // Standard værdier
  fIdSMTP := TIdSMTP.Create(nil);
  fIdSMTP.Host := 'smtp.company.org';
end;

Jeg har bare de steder, i min tråd, hvor jeg brug for at sende puttet dette ind:

            with fIdSMTP do
            begin
              try
                Connect;
                Send(IdMessage);
                Disconnect;
              except on E: Exception do
                begin
                  if connected then try disconnect; except end;
                end;
              end;
            end;

Jeg får denne fejl "EIdSMTPReplyError" på den måde jeg gør.
Avatar billede kroning Nybegynder
23. september 2009 - 12:41 #3
Nu er det nok ikke hele koden du viser, der er f.eks. ingen Create af din IdMessage?
Jeg har lavet denne tråd som jeg bruger når programmet skal sende en mail.

TMailThread = class(TThread) //mail thread
  private
    { Private declarations }
    IdSMTP: TIdSMTP;
    IdMessage: TIdMessage;
  protected
    procedure Execute; override;
  public
    ErrorStr : string;
    Emne,ModtagerNavn,ModtagerMail : string;
    constructor Create(aEmne,aBodyText,aModtagerNavn,aModtagerMail,aAfsenderNavn,aAfsenderMail,aSMTPServer,aSMTPUsername,aSMTPPassword : string);
//    destructor Destroy; override;
  end;

.
.

{ TMailThread }

constructor TMailThread.Create(aEmne,aBodyText,aModtagerNavn,aModtagerMail,aAfsenderNavn,aAfsenderMail,aSMTPServer,aSMTPUsername,aSMTPPassword : string);
begin
    inherited Create(False);
    FreeOnTerminate:=true;

  Emne:=aEmne;
  ModtagerNavn:=aModtagerNavn;
  ModtagerMail:=aModtagerMail;

  IdSMTP:=TIdSMTP.Create(nil);

  if aSMTPUsername<>'' then
  begin
        IdSMTP.Username:=aSMTPUsername;
        IdSMTP.Password:=aSMTPPassword;
  end;

//    IdSMTP.PipeLine:=false;
//  IdSMTP.AuthType:=satNone;

  IdMessage:=TIdMessage.Create(nil);
  IdMessage.ContentType:='text/html';
    IdMessage.Encoding:=meMIME;

  IdMessage.Recipients.Add.Address:=aModtagerMail;
  IdMessage.Body.Text:=aBodyText;
  IdMessage.From.Address:=aAfsenderMail;
  IdMessage.From.Name:=aAfsenderNavn;
  IdMessage.From.Text:=IdMessage.From.Name+' <'+IdMessage.From.Address+'>';
  IdMessage.Sender.Address:=IdMessage.From.Address;
    IdMessage.Sender.Name:=IdMessage.From.Name;
  IdMessage.Sender.Text:=IdMessage.From.Text;
  IdMessage.Subject:=aEmne;
  IdSMTP.ConnectTimeout:=5000;
  IdSMTP.Host:=aSMTPServer;
  ErrorStr:='';
end;

procedure TMailThread.Execute;
begin
  try
      IdSMTP.Connect;
        IdSMTP.Send(IdMessage);
        IdSMTP.Disconnect;
    except
    on E:Exception do
    begin
      ErrorStr:=E.Message;
    end;
  end;

  IdMessage.Free;
  IdSMTP.Free;
end;

procedure TDataForm.MailOnTerminate(Sender: TObject);
var
    ModtagerNavn : string;
begin
  if (Sender as TMailThread).ErrorStr<>'' then
  begin
      ModtagerNavn:=(Sender as TMailThread).ModtagerNavn+' ('+(Sender as TMailThread).ModtagerMail+')';
    ShowMessageBox('Der opstod en fejl ved afsendelse af email.'#13#13'Emne: '+(Sender as TMailThread).Emne+#13'Modtager: '+ModtagerNavn+#13'Fejl tekst: '+(Sender as TMailThread).ErrorStr,'Fejl',MB_OK or MB_ICONERROR);
    end;
end;
Avatar billede kennethv Nybegynder
23. september 2009 - 13:05 #4
Men i din execute er det, det samme jeg gør, men jeg får bare en fejl i idSMTP.Send(IdMessage);

Det er korrekt at det ikke var hele koden. Jeg opretter IdMessage i starten af den procedure jeg kører i min tråd. I selvsamme procedure putter jeg indhold i min IdMessage, hvor jeg så tilsidst sender det afsted.
Avatar billede kroning Nybegynder
23. september 2009 - 19:40 #5
Du kan jo prøve at lave en test med min kode, hvis det heller ikke virker så er det måske fordi du bruger en ældre Indy version, jeg benytter version 10.2.3
Avatar billede kennethv Nybegynder
23. september 2009 - 21:03 #6
Hmm, jeg ved ikke hvordan man skal bruge din kode. Er ikke så skrap til arbejde med tråde.

Den tråd jeg har er blevet lavet med hjælp herinde fra.

Jeg har en procedure hvor jeg laver en select til db og løber alle mine records igennem for om der er nogen ændringer. Hvis der er, opdater databasen og send mail. Det er stortset det min procedure gør.
Avatar billede kroning Nybegynder
23. september 2009 - 21:20 #7
Alt kode er der så du skal blot kopiere det ind i et nyt test program og så oprette en Mail Tråd således:


Emne:='En test';
BodyText:='Dette er en test';
ModtagerNavn:='Hans';
ovs. osv.


TMailThread.Create(Emne,BodyText,ModtagerNavn,ModtagerMail,AfsenderNavn,AfsenderMail,SMTPServer,SMTPUsername,SMTPPassword).OnTerminate:=MailOnTerminate;

Men ellers er det ikke let at se hvorfor du får fejlen med mindre du poste hele koden fra din tråd.
Avatar billede kennethv Nybegynder
28. september 2009 - 12:29 #8
Er der mulighed for at sende det til dig?
Avatar billede kroning Nybegynder
28. september 2009 - 13:36 #9
Ja hvis du ikke vil poste det her. Kan du ikke på den tråd jeg postede til at virke?
Avatar billede kennethv Nybegynder
21. november 2011 - 09:22 #10
Du må ligge et svar.
Avatar billede kroning Nybegynder
21. november 2011 - 09:29 #11
svar
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