Question : Envoyer les email dans le processus en arrière plan (et continuer de travailler)

Bonjour, le

As que je personilize les email par client, je doit les envoyer l'email 1000 d'one-by-one.
When sont envoient de cette façon, l'utilisateur de mon $$etAPP devra attendre jusqu'à ce que le tout ait fini. Si des attachements lui sont ajoutés prendront même beaucoup de longer.

What que je recherche est une manière d'envoyer l'email dans un envoi facultatif de backgroudprocess.
During des email, l'utilisateur peut-il décider de l'attendre tout pour se produire, ou pour l'envoyer au fond et continuer l'autre travail avec l'app.

Can quiconque me fournir un certain codesample sur la façon dont accomplir ceci ?
class= > " clair " de
> de " codeSnippet " de class= de
class= " lineNumbers " de
class= de
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 " de l'id= " codeSnippet948361 de
           
class= de

Réponse : Envoyer les email dans le processus en arrière plan (et continuer de travailler)

il crée un nouveau fil pour envoyer des email.

>> Peut-il l'utilisateur à partir de ce moment dorénavant faire quelque chose dans l'application ?

sure. mais il y a deux choses que vous devez commander :

1. l'utilisateur veulent stopper de votre application mais les email envoient toujours. Dans ce cas-ci vous pouvez terminer le fil ou attendre son finissage

2. ne pas changer query1, edit1, edit2 parce que le fil les emploie

>> Ce qui si une erreur se produit. L'utilisateur pourra-t-il toujours obtenir ceci ?

Oui, votre essai/excepté/showmessage fonctionnent toujours :

        essai
          IdSMTP.Connect ;
          IdSMTP.Send (IdMsg) ;
        excepté
          Showmessage (« erreur en envoyant l'email ") ;
        extrémité ;

Il vaudrait mieux d'envelopper tout exécutent la méthode dans l'essai/excepté trop comme ceci :

procédé TEmailThread.Execute ;
variété IdSMTP : TIdSMTP ;
     IdMsg : TIdMessage ;
     I : Nombre entier ;
commencer
  essai
    IdSMTP : =TIdSMTP.Create (zéro) ;
    IdSMTP.Host : = ' my.domain.nl'; // remplacent par votre serveur sortant
    IdSMTP.Port : =25 ;
    IdSMTP.Username : = « MyUserName » ;
    IdSMTP.Password : = « MyPassword » ;
    essai
      sinon IdSMTP.Connected alors
        IdSMTP.Connect ;

      Pour I : = 0 à Query1.Recordcount -1 font
      commencer
        si terminé alors sortir ;
 
        essai
          IdMsg : =TIdMessage.Create (zéro) ;
          IdMsg.From.Address : = edit1.Text ;
          IdMsg.Subject : = edit2.text ;
          IdMsg.Recipients.EMailAddresses : = Query1.FieldByName (« email ").Text ;
 
          Début de // une certaine fonction pour personnaliser le corps par client
          IdMsg.Body.Text : = PersonalizeEmailForCustomer ;
         essai
            IdSMTP.Connect ;
            IdSMTP.Send (IdMsg) ;
          excepté
             sur E : L'exception font
               Showmessage (« erreur en envoyant l'email :  » + E.Message) ;
          extrémité ;
        finalement
          IdMsg.Free ;
        extrémité ;
        Query1.Next ;
      extrémité ;
    finalement
      s'IdSMTP.Connected alors
        IdSMTP.Disconnect ;
      IdSMTP.Free ;
    extrémité ;
  excepté
    sur E : L'exception font
      Showmessage (« erreur en envoyant l'email :  » + E.Message) ;
  extrémité ;
extrémité ;

>> Est-ce qu'est-il il encore possible d'informer l'utilisateur que l'envoi a fini, donnent un certain résultat ?

Vous pouvez employer le message d'OnTerminate ou

 avec TEmailThread.Create (vrai) faire
 commencer
   OnTerminate : = ThreadOnTerminate ;
   FreeOnTerminate : = rectifier ;
   Résumé ;
 extrémité ;

procédé TMainForm.ThreadOnTerminate (ASender : TObject) ;
commencer
  ShowMessage (le « travail est réalisé ") ;
extrémité ;

>> Par conséquent je dois passer ce contenu au fil de façon ou d'autre

vous pouvez passer au fil tous les paramètres que vous aimez par l'intermédiaire de son constructeur. Par exemple :

  TEmailThread = classe (TThread)
  privé
    FSubject : corde ;
  protégé
    le procédé s'exécutent ; dépassement ;
  public
    le constructeur créent (const ASubject : corde) ;
  extrémité ;

constructeur TEmailThread.Create (const ASubject : corde) ;
commencer
  hérité créer (rectifier) ;
  FSubject : = ASubject ;
extrémité ;

procédé TEmailThread.Execute ;

        // using la variété locale
        IdMsg.Subject : = FSubject ; // était IdMsg.Subject : = edit2.text ;
Autres solutions  
  •  MS Excel 2007 et pdf - l'exportation vers le pdf prend de longues heures !
  •  Dans le Perl, comment j'ajoute une valeur à la liste, puis le contrôle pour voir si la valeur existent avant d'ajouter une nouvelle valeur
  •  Comment fais j'initialiser de la HP BL460c G6 de san et de la HP XP 240000
  •  Comment fais j'employer une clef de permis de volume sur un ordinateur de HP avec du CD de restauration
  •  Emplacement primaire de deux SCCM dans l'annuaire actif
  •  L'initiateur et la HP D2D de l'iSCSI R2 du serveur 2008 de Windows GERCENT l'issue
  •  Stocker le dossier dans le mysql using connector.net et le champ de goutte
  •  Carte vidéo d'USB - bit 32 sur le matériel travaillant au niveau du bit 64 ?
  •  asp.net que j'essaye de convertir une forme de HTML en forme d'aspx ou ? ce qui jamais. Aide du besoin sur la façon dont à à elle.
  •  Winzip 12 issues de secours du travail ?
  •  
    programming4us programming4us