Vraag : Verzend E-mail in achtergrondproces (en blijf werkend)

Hallo,

As ik personilize E-mail per klant, moet ik hen één-door-one.
When 1000 E-mail verzenden ben verzend deze manier, zal de eindgebruiker van mijn app moeten wachten tot iedereen heeft geëindigd. Als de gehechtheid wordt toegevoegd zal het zelfs veel longer.

What nemen ik ben een manier zoek om E-mail te verzenden in het facultatieve verzenden backgroudprocess.
During van E-mail, kan de eindgebruiker op het allen, of het naar de achtergrond ander werk met app.

Can om het even wie me van wat codesample op hoe te om dit te verwezenlijken voorziet?
" codeBody "
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
procedure SendEmails;
var IdSMTP: TIdSMTP;
     IdMsg: TIdMessage;
     I: Geheel;
begin
  IdSMTP: =TIdSMTP.Create (nul);
  IdSMTP.Host: = ' my.domain.nl'; // vervangen door uw uitgaande server
  IdSMTP.Port: =25;
  IdSMTP.Username: = „MyUserName“;
  IdSMTP.Password: = „MyPassword“;
  probeer
    als NIET IdSMTP.Connected toen
      IdSMTP.Connect;

    Voor I: = 0 aan Query1.Recordcount -1
    begin
      probeer
        IdMsg: =TIdMessage.Create (nul);
        IdMsg.From.Address: = edit1.Text;
        IdMsg.Subject: = edit2.text;
        IdMsg.Recipients.EMailAddresses: = Query1.FieldByName („E-mail“). Tekst;

        // Begin één of andere functie om lichaam per klant te personaliseren
        IdMsg.Body.Text: = PersonalizeEmailForCustomer;
        probeer
          IdSMTP.Connect;
          IdSMTP.Send (IdMsg);
        behalve
          Showmessage („Fout wanneer het verzenden van E-mail“);
        eind;
      tot slot
        IdMsg.Free;
      eind;
      Query1.Next;
    eind;
  tot slot
    als IdSMTP.Connected toen
      IdSMTP.Disconnect;
    IdSMTP.Free;
  eind;
eind;

Antwoord : Verzend E-mail in achtergrondproces (en blijf werkend)

het leidt tot een nieuwe draad voor het verzenden van e-mail.

>> Kan de gebruiker vanaf dat ogenblik om het even wat binnen de toepassing doen?

zeker. maar er zijn twee dingen die u moet controleren:

1. de gebruiker wil van uw toepassing ophouden met maar e-mail verzenden nog. In dit geval kunt u de draad eindigen of op zijn het eindigen wachten

2. verander geen query1, edit1, edit2 omdat de draad hen gebruikt

>> Wat als een fout voorkomt. Zal de gebruiker nog dit kunnen krijgen?

Ja, uw poging/behalve/showmessage nog werk:

        probeer
          IdSMTP.Connect;
          IdSMTP.Send (IdMsg);
        behalve
          Showmessage („Fout wanneer het verzenden van E-mail“);
        eind;

Het zou beter zijn om allen te verpakken uitvoert methode in poging/behalve te gelijkaardig dit:

procedure TEmailThread.Execute;
var IdSMTP: TIdSMTP;
     IdMsg: TIdMessage;
     I: Geheel;
begin
  probeer
    IdSMTP: =TIdSMTP.Create (nul);
    IdSMTP.Host: = ' my.domain.nl'; // vervangen door uw uitgaande server
    IdSMTP.Port: =25;
    IdSMTP.Username: = „MyUserName“;
    IdSMTP.Password: = „MyPassword“;
    probeer
      als NIET IdSMTP.Connected toen
        IdSMTP.Connect;

      Voor I: = 0 aan Query1.Recordcount -1
      begin
        indien Geëindigde$ dan Uitgang;
 
        probeer
          IdMsg: =TIdMessage.Create (nul);
          IdMsg.From.Address: = edit1.Text;
          IdMsg.Subject: = edit2.text;
          IdMsg.Recipients.EMailAddresses: = Query1.FieldByName („E-mail“). Tekst;
 
          // Begin één of andere functie om lichaam per klant te personaliseren
          IdMsg.Body.Text: = PersonalizeEmailForCustomer;
         probeer
            IdSMTP.Connect;
            IdSMTP.Send (IdMsg);
          behalve
             op E: De uitzondering
               Showmessage („Fout wanneer het verzenden van E-mail: “ + E.Message);
          eind;
        tot slot
          IdMsg.Free;
        eind;
        Query1.Next;
      eind;
    tot slot
      als IdSMTP.Connected toen
        IdSMTP.Disconnect;
      IdSMTP.Free;
    eind;
  behalve
    op E: De uitzondering
      Showmessage („Fout wanneer het verzenden van E-mail: “ + E.Message);
  eind;
eind;

>> Is het nog mogelijk om de eindgebruiker dat het verzenden mee te delen heeft geëindigd, show wat voortvloeit?

U kunt bericht gebruiken OnTerminate of

 met (Ware) TEmailThread.Create
 begin
   OnTerminate: = ThreadOnTerminate;
   FreeOnTerminate: = Waar;
   Hervat;
 eind;

procedure TMainForm.ThreadOnTerminate (ASender: TObject);
begin
  ShowMessage (het „Werk wordt gedaan“);
eind;

>> Daarom moet ik die inhoud tot de draad op de een of andere manier overgaan

u kunt tot de draad om het even welke parameters overgaan u via zijn aannemer houdt van. Bijvoorbeeld:

  TEmailThread = klasse (TThread)
  privé
    FSubject: koord;
  beschermd
    de procedure voert uit; opheffing;
  openbaar
    de aannemer cre�ërt (const ASubject: koord);
  eind;

aannemer TEmailThread.Create (const ASubject: koord);
begin
  geërftn cre�ër (Waar);
  FSubject: = ASubject;
eind;

procedure TEmailThread.Execute;

        // gebruikend lokale var
        IdMsg.Subject: = FSubject; // was IdMsg.Subject: = edit2.text;
Andere oplossingen  
 
programming4us programming4us