Expédier des e-mails à partir du contenu d’une table

Comment expédier des e-mails à différentes personnes dont l’adresse électronique est contenue dans une table ?

Dans le billet Déclencher une alerte avec Access, vous avez pu voir comment afficher une liste de clients à recontacter, à l’ouverture d’une base de données Access. Le formulaire obtenu était de cette forme :

capture

Dans cet article, nous allons compléter le formulaire en programmant le code du deuxième bouton (Rappel par e-mail). Le principe est simple : extraire tous les clients qui sont affichés dans la liste ET qui ont une adresse e-mail, et leur expédier un e-mail de rappel.

Réalisation du bouton

Le bouton est dessiné sans assistant, car il nécessite une action personnalisée (et pas une de celles proposées par Access). Voici ce qu’il faut pour le mettre en place :

  1. Ouvrez le formulaire en mode Création.
  2. Faites apparaître les propriétés du bouton, onglet Autres.
  3. Donnez un nom clair à votre bouton (ici : btnEmail).
  4. Activez l’onglet Evénement, toujours dans la fenêtre Propriétés.
  5. Réglez l’événement Sur clic du bouton sur [Procédure événementielle].
  6. Cliquez ensuite sur les points de suspension à droite pour accéder au code VB de l’événement.
  7. Recopiez-y ce qui suit :

Un peu d’explications

  • Le début du code commence par renseigner 2 variables : strTitre contient le titre de l’e-mail, strMessageType… le message type. Il ne s’agit pas du message final, mais d’une chaîne dans laquelle les codes comme {Titre} seront remplacés plus tard. Ca nous évitera quelques concaténations laborieuses 🙂
  • On crée ensuite une chaîne SQL qui va servir à extraire les clients qui n’ont pas ramené leur vidéo, et qui ont une adresse e-mail. Cette chaîne repose sur la requête rqt Vidéos non ramenées, qui existe déjà dans la base de données (elle a servi à afficher la liste des clients à rappeler). On rajoute simplement un test sur l’adresse e-mail, ce qui donne :
    strSQL = "SELECT * FROM [rqt Vidéos non ramenées] WHERE [Email] IS NOT NULL"
  • On ouvre un Recordset DAO à partir de cette requête. Ce Recordset contient autant de lignes que de clients, on le parcourt en boucle jusqu’au dernier enregistrement.
  • Pour chaque client, on crée un message personnalisé (strMsg) à partir du message type du départ (strMessageType). Il suffit de remplacer les codes du type {Titre} par les champs équivalents du Recordset, par exemple rst("Titre").
  • Une fois le mail construit, on l’envoie par la procédure SendMail.
    SendMail n’est pas une commande d’Access : je réutilise le code donné dans l’article Envoyer des e-mails avec Access. Je suppose donc que vous avez lu ce billet, et que vous avez recopié le code dans un module standard de votre base de données.
    SendMail
    reçoit, dans l’ordre, l’adresse e-mail du destinataire, le titre du message, puis le corps du message. Réglez le dernier argument sur True si vous voulez modifier le mail manuellement avant son envoi.
    Je suppose également que vous avez configuré au moins un compte de messagerie sur votre machine.
Important
L’exemple de code ci-dessus fait appel à la bibliothèque DAO (Microsoft DAO Object Library). Cette bibliothèque doit être associée à votre base de données pour que le programme fonctionne.Pour plus de détails sur les références, consultez cette page.

Vous aimerez aussi...

57 réponses

  1. Thierry dit :

    Merci bcp pout ce super boulot !
    Grace a toi j’ai enfin pu gerer mon probleme de mails.

    Par contre 2 questions:

    Est il possble d’integrer la signature auto de Outlook dans ton code ?
    Et j’ai lu plus haut de que parlais d’amenager la fonction « SendMail » pour mettre des dest en copie… Pourrais tu m’en dire un peu plus stp ?

    Etant debutant sur VB je m’y perds facilement

    • Hervé Inisan dit :

      Pour la signature, une approche consiste :

      • A afficher le mail (True sur le dernier paramètre de la fonction SendMail).
      • A compléter le corps du mail (pour conserver la signature), et donc à ne pas le remplacer.
      • A envoyer le message au format HTML et non pas au format Texte brut.
        Pas si simple que ça… 🙂

        Pour les destinataires en copie (cc) ou copie cachée (bcc), il faut renseigner certains autres paramètres de la commande SendObject, utilisée par ma fonction SendMail(). Cette page du site MSDN donne le détail de la commande, au cas où.

  2. Fred dit :

    CA Y EST !!!

    Je m’en suis sorti ! pas très doué le gars, mais avec de la patience et de bon conseil tout est ok.

    Merci encore.

    Pour finaliser ma base je souhaite maintenant comme le demande gyf pouvoir envoyer un autre message regroupant plusieurs info concernant un même destinataire.

    quelle serait la solution

    merci d’avance

  3. Fred dit :

    J’essaie désespérément, mais mon n° de dossier reste toujours identique et ne se rattache pas au dossier contenu dans le message. En fait, il n’y a que le 1er n° qui s’insère dans l’objet de tous les message.

    Je dois pas être loin pourtant.

    Merci

  4. Hervé Inisan dit :

    Fred > Dans ce cas, il faut utiliser faire varier strTitre dans la boucle (avant le SendMail). Du genre :

  5. Fred dit :

    De ce coté pas de pb mais ce que je veux c’est intégrer ce n° dans l’objet du message et qu’il corresponde au dossier auquel je fais référence dans le mail.

    J’ai essayé tout un tas de méthode et je seche.
    S’il y a une solution je suis prenuer.

    Merci d’avance

  6. Hervé Inisan dit :

    Fred > Dans ce cas, au lieu de faire référence à un champ du formulaire, il faut faire référence à un champ de la table sous-jacente, de la même manière que dans l’article :

    … en aménageant le corps du message pour qu’il contienne un marqueur {Numéro Dossier}. Je suppose aussi que la table contient un champ « Numéro Dossier » (tu adaptes en fonction de tes besoins).

    Ouala !

  7. Fred dit :

    Bonjour,

    dans l’intégration de mon champs de formulaire, je souhaite aller un peu plus loin. en effet, ce champs dois changer à chaque message car il reprend un n° de dossier.

    Si j’utilise la methode indiqué, le n° correspond au 1er dossier pour tous les messages qui suivent.

    Y a t il un moyen de reprendre cette info.

    Merci d’avance.

  8. Hervé Inisan dit :

    gyf >

    1. C’est effectivement possible, ça demande juste quelques retouches dans le code (la partie boucle).
    2. S’il s’agit de formatage dans le corps du mail, c’est possible aussi. 🙂 Ça suppose dans ce cas que le mail est expédié au format HTML (et non plus en texte brut). Il faut alors ajouter des balises HTML dans le corps du message.

    C’est un peu compliqué à détailler ici, mais ça peut faire l’objet d’un autre tuto. Je note l’idée…

  9. gyf dit :

    Bonjour,
    1/si un client a plusieurs videos en retard est il possible d envoyer 1 seul mail indiquant dans le corps du message la liste des videos plutot que 1 mail par video?
    2/est il possible d ajouter un peu de formattage ( couleur, police..)
    un grand merci pour ce site tres utile

  10. Hervé Inisan dit :

    Fred > You’re welcome! 🙂

  11. Fred dit :

    Super MERCI,

    C’est exactement ce dont j’avais besoin.

    Merci encore

  12. Hervé Inisan dit :

    Fred > Pour intégrer un champ du formulaire, tu peux remplacer la ligne qui alimente strTitre par quelque chose comme :

    Ou, si tout le code est tapé dans le module du formulaire :

  13. Fred dit :

    Bonjour,
    Ce site est l’un des plus accessible pour la compréhension d’access.
    J’ai testé les codes dans cet article et tout fonctionne parfaitement. Je souhaite juste améliorer un point pour la base que je développe en insérant les données d’un champ dans le titre du message.

    Comment doit on faire ?

    merci d’avance

  14. Hervé Inisan dit :

    Kisty > You’re welcome! 🙂

  15. Kisty dit :

    D’accord, merci pour l’explication et pour ton temps consacrer a aider les gens:)

  16. Hervé Inisan dit :

    Kisty > Si toutes les adresses sont en To:, tu exposes les adresses de tout le monde à tout le monde. Ce n’est pas une bonne pratique en termes de confidentialité (il faut placer tout le monde en Bcc/Cci).

    D’autre part, le nombre d’adresses toléré par Access est (sans doute) important ; pour la technique ça va passer. Mais ton fournisseur d’accès risque de voir un gros envoi comme un spam. Donc à bien doser (évite notamment de rater un envoi de 300 personnes et de le recommencer dans la foulée).

    Pour de très gros envois, il faut envisager de travailler par tranches… ou de passer par des prestataires spécialisés.

  17. Kisty dit :

    Merci Hervé ça marche bien 🙂
    T’as raison pour l’amélioration dans SendMail, je vais la changer; mais est ce que ça pose un problème si tout le monde en (To)? est ce qu’il y a des limites pour le nombre de destinataire principale?

  18. Hervé Inisan dit :

    Kisty > En fait, il faudrait plutôt aménager la boucle comme ceci :

  19. Kisty dit :

    Merci pour ton article sur les liens hypertexte 😉
    Concernant mon deuxième problème, voila ce que j’ai fait :

    While Not rst.EOF

    Dim valeur As String
    Dim valeur1 As String

    ‘Concaténation des adresses mail
    valeur = rst(« Email »)
    valeur1 = valeur &  »  » & « ; » &  »  » & valeur1

    ‘ Client suivant
    rst.MoveNext
    Wend

    ‘ Expédier le mail
    SendMail valeur1, strTitre, strMsg, True

    j’ai exécuté la boucle pas à pas et je constaté que j’ai bien récupérer mes adresses mail dans (valeur1), mais le problème il m’affiche directement le message de confirmation!!! et pas windows live pour que je puisse taper mon mail.
    PS: j’ai laissé SendMail sans changement.

  20. Kisty dit :

    Ok,Merci je vais voir ton article, et comment régler mon deuxième problème aussi 😉

  21. Hervé Inisan dit :

    Kisty > Voici quelques pistes concernant les 2 problèmes :

    1. Le lien hypertexte contient effectivement plus d’informations que ce qu’on voit à l’utilisation. Une solution consiste à le « nettoyer » avant de l’exploiter. Je viens de poster un article là-dessus, avec une fonction qui fera l’affaire. Un deuxième article complémentaire paraitra demain, si tout va bien. 🙂
    2. Dans l’exemple donné, un SendMail est fait à chaque « tour de boucle » (entre While et Wend). Ceci permet d’expédier des e-mails personnalisés à chaque personne. Si ce n’est pas ton cas, il est possible de faire autrement, en concaténant les adresses à chaque tour de boucle, et en appelant le SendMail après la boucle (après le Wend).

    Par contre, si tu pars là-dessus, il vaut mieux aussi aménager SendMail pour passer les destinataires en Cci (ou Bcc) plutôt qu’en destinataires principaux (To).

  22. Kisty dit :

    Merci ça marche.
    mais j’ai deux problèmes:
    1- j’ai mis le type du champ mail (lien hypertexte) donc quand je clique sur le bouton pour envoyer les mails, mon windows live mail récupère l’adresse mail comme suit  » alexandra@live.fr#mailto:alexandra@live.fr# »
    2- quand j’ai cliqué sur le bouton (envoyer mail) mon widows live mail s’ouvre pour chaque adresse! mais moi je veux envoyer un mail unique a tout les membres de se genre (alexandra@live.fr; juliana@gmail.com; …)

    PS : Désolé pour le retard, j’ai postulé ma réponse le samedi a partir de mon téléphone – c’est sur il y avais un problème et j’ai pas fait attention- donc je reposte.

  23. Hervé Inisan dit :

    Kisty > Est-ce que tu as bien recopié la fonction SendMail dans un module de ta base ? Voir le paragraphe qui dit « SendMail n’est pas une commande Access… ». Le code de SendMail est donné dans l’article « Envoyer des mails avec Access » (dont tu trouveras le lien dans le paragraphe). Reposte par ici en cas de souci. 🙂

  24. Kisty dit :

    Bonjour,
    Cet article date de 2007 mais il est toujours d’actualité, tout d’abord merci pour ton travaille ça aide beaucoup de gens (moi même).

    Bon j’ai adapté ton code a ma problématique ( j’ai changé la requete biensur et j’ai mis en commentaire le message personnalisé, parce que je veux envoyer un message unique non personnalisé à tous les membres).

    Quand j’ai cliqué sur le bouton pour envoyer le mail, j’ai eu cette erreur « sub ou function non définie » et « sendmail » souligner,
    Je voulais activer la référence : « Microsoft DAO 3.6 Object Library », pour résoudre le problème, mais il me dit : « nom de module, de projet ou de bibliothèque d’objet déjà utilisé ».

    Donc je ne vois pas c’est ou exactement l’erreur!!!

  25. Hervé Inisan dit :

    Reynald > Ces articles du blog peuvent t’intéresser : Expédier des mails avec pièces jointes via Outlook, et libMail : une bibliothèque VBA pour expédier des emails. D’une manière générale, toute cette rubrique !

  26. Reynald dit :

    Le code est parfait il me manque une dernière chose : je dois ajouter une pièce jointe qui est au format pdf et je ne sais comment m’y prendre ? quelqu’un peut-il m’aider ?
    D’avance merci

  27. Hervé Inisan dit :

    Gwendoline > Est-ce que ta requête aurait des critères paramétrés ? Notamment, la date d’anniversaire ? Parce que ces critères ne sont pas applicables (ou doivent être alimentés) lorsqu’on ouvre la même requête en VB.

  28. Gwendonline dit :

    Bonjour tout le monde!
    J’ai essayé de mettre en place le code ci dessus dans ma base de données et malheureusement celà n’a pas fonctionné. Qu’est ce que j’ai mal fait, j’en sais trop rien et c’est pour ça que je vous demande votre aide…J’ai une requète « rqt Anniv du jour » qui me donne la liste des clients dont c’est l’anniversaire et avec votre code je souhaitais leur envoyer un mail.
    J’ai un message d’erreur: « erreur d’exécution 3061 » qui apparaît et l’info « Trop peu de paramètres 1 attendu ». Lorsque je clic sur débogage j’ai la ligne « Set rst = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot) » surlignée en jaune qui apparait. Qu’est ce qui ne va pas?
    Merci d’avance (je suis sous Access2003 et WinXP)

    Code complet entré dans ma base:
    Option Compare Database

    Private Sub btnEmail_Click()
    Dim rst As DAO.Recordset
    Dim strSQL As String
    Dim strMessageType As String
    Dim strTitre As String
    Dim strMsg As String

    ‘ Titre du message
    strTitre = « C’est votre anniversaire! »

    ‘ Message type à expédier
    ‘ Les signes {…} seront remplacés plus loin par
    ‘ les infos Client
    strMessageType = « Bonjour {Prénom} {Nom}, » _
    & vbCrLf & vbCrLf _
    & « Le {Anniv}, c’est votre anniversaire  » _
    & « A cette occasion, » _
    &  » Lamour des fleurs souhaite vous faire un petit cadeau en vous » _
    & « offrant 10% de réduction sur l’article le plus cher de votre » _
    & « prochain passage dans son magasin » _
    & vbCrLf & « Merci de… blah blah 🙂 » _
    & vbCrLf & vbCrLf & « — Blandine – Lamour des fleurs. »

    ‘ Ouverture de la requête
    ‘ (seuls les clients ayant un email sont concernés ici)
    strSQL = « SELECT * FROM [rqt Anniv du jour] » _
    &  » WHERE [Email] IS NOT NULL »
    Set rst = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)

    ‘ Parcourir la liste des clients
    While Not rst.EOF
    ‘ Construire un message personnalisé
    ‘ (on remplace chaque {…} du message par les champs
    ‘ équivalents de la requête
    strMsg = Replace(strMsg, « {Nom} », rst(« Nom »))
    strMsg = Replace(strMsg, « {Prénom} », rst(« Prénom »))
    strMsg = Replace(strMsg, « {Anniv} », rst(« Anniv »))

    ‘ Expédier le mail
    SendMail rst(« Email »), strTitre, strMsg, False

    ‘ Client suivant
    rst.MoveNext
    Wend

    ‘ On libère les ressources
    rst.Close
    Set rst = Nothing

    ‘ Un petit message de confirmation
    MsgBox « Opération terminée ! », vbInformation, « Lamour des fleurs »

    End Sub

    Public Sub SendMail(ByVal strEmail As String, _
    ByVal strObj As String, _
    ByVal strMsg As String, _
    ByVal blnEdit As Boolean)
    On Error Resume Next
    DoCmd.SendObject acSendNoObject, , , strEmail, , , strObj, strMsg, blnEdit
    End Sub
    End Sub

  29. papillondunord dit :

    Un blog est un journal personnel en effet mais surtout un lieu dechange et de partage d idees (tout comme je fais actuellement sur le sujet) Bref, Merci pour les tuyaux, cest tres enrichissant.

  30. Hervé Inisan dit :

    I agree 🙂 Dans la précipitation, l’autre jour, j’ai posté un peu vite. Effectivement, les formes standard sont plutôt :

    • "Prénom Nom" <untel@provider.com>
    • <untel@provider.com>
    • untel@provider.com

    (les guillemets pouvant généralement être omis dans la forme 1)

  31. JJ29 dit :

    de JJ29 à Hervé ;
    J’ai fait des essais. La syntaxe que vous mentionnez n’a pas marché ni sur outlook express ni sur windows mail

    La syntaxe qui marche est
    Prénom Nom <email@fournisseur.com>
    et non
    email@fournisseur.com <Prénom Nom>

    Le résultat est spectaculaire du moins sur Outlook express car le destinataire n’apparait que par son nom en clair.

    Do you agree ?

  32. Hervé Inisan dit :

    JJ29 > Il est possible d’utiliser comme destinataire le format email@fournisseur.com <Prénom Nom> par exemple. Entre les < >, le nom en clair du destinataire. Du style :

    Si la table contient des champs du style [Nom Personne] et [Prénom Personne], on peut donc aménager le code plus haut en :

  33. JJ29 dit :

    Notre appli (wndows XP, access 2002, outlook express) d’envoi des mails avec Pièces jointes etc etc continue à marcher superbement.
    Un petit pb :
    La macro sendmail nécessite le champ stremail contenant l’adresse email et pas plus. La syntaxe exacte peut-elle permettre d’ajouter en clair le nom du destinataire

    Cette demande est liée au fait que beaucoup de nos mails sont adressés à des étudiants étrangers dont l’adresse email n’a pas de rapport direct évident avec leur nom et que donc l’analyse de leurs réponses fait perdre du temps à nos bénévoles.

    Merci

  34. Hervé Inisan dit :

    Pour qu’Access puisse expédier des mails, il faut qu’il y ait forcément quelque part une liste d’emails 🙂
    Dans l’exemple, cette liste est stockée dans une table Access. Mais si elle n’est pas dans la base, il me faut d’autres précisions…
    Notamment : quelle est l’idée de standardiser le code ?

    PS : Merci de ne pas poster en style SMS, ce sera plus facile pour tout le monde… 😉

  35. informatico dit :

    slt, mais pour que le code sa marche il fo que j’ai la base de sonnées ou il y a les client et leurs mail…, moi jai une autre base de donnees est ce qu il y a ps une possibilité que le code soit standarisé et jattends votre reponse , merci davance

  36. Hervé Inisan dit :

    JJ > L’article sur les logiciels de messagerie est maintenant en ligne, à cette adresse :  Messagerie par défaut.

  37. Hervé Inisan dit :

    JJ > Il n’y a rien à modifier dans Access pour utiliser Windows Mail, Microsoft Outlook, ou même des logiciels « non Microsoft » comme Mozilla Thunderbird. Je prépare un billet bientôt pour détailler tout ça…

  38. JJ dit :

    Passage de XP à Vista

    Notre application Acces sous XP nous permet maintenant d’envoyer la quasi totalité de nos mails des mails à partir des tables Access à la grande satisfaction de tous.

    Le code utilise doCmd.sendobject

    Lors du passage inévitable sous Vista que nous aurons à faire un jour, devrons-nous modifier quelque chose. Le code doCmd.sendobject éxécuté sous Vista fait-il appel sans problàme à Windows Mail.

    Le premier essai que j’ai fait sur mon portable personnel semble le montrer , mais ..

    Autre sujet : comment ce code fait -il appel à outlook express (Windows Mail dans Vista) plutot que Outlook ? Doit-on opérer autrement avec Outlook ?

    Merci de votre aide

  39. chris dit :

    ok, c’est compris, en tout cas je te remercie pour ta précieus aide, qui me sauve la vie et qui je pense rends service a beaucoup de monde. Continue de mettre tes astuces sur ce site, merci encore et bravo à toi!

  40. Hervé Inisan dit :

    Vu que la requête finale est construite dynamiquement par une chaîne SQL, dans le code VBA, il ne faut pas qu’il y ait de paramètres dans la requête de départ (celle enregistrée dans la base). Sinon, tous ces paramètres seront attendus à l’ouverture du Recordset (d’où le message d’erreur). Il faut donc gérer les paramètres dans la chaîne SQL, comme dans mon dernier exemple. Ouala !

  41. chris dit :

    Si tu veux, ton code marche trés bien, si je rentre ta ligne de code (ci dessus) toute seule sa marche nikel, mais par contre quand je rajoute dans mon formulaire une zone de liste qui permet de faire une seléction, et de n’afficher que ceux qui m’interessent ça ne marche plus. J’ai ajouté dans ma requete, dans les critères du champs qui m’interesse: Comme « * » & [forms]![nom du formulaire]![nom de la zone de liste] & « * » et c’est a cause de ça qu’il me met erreur 3061 etc…

  42. chris dit :

    lol J’avoue mon cerveau et tout petit mais j’ai quand même la place pour deux trois petites neurones lol; J’avais compris que je devais remplacer le nom et j’ai essayé mais il me met le message erreur d’exécution ‘3061’ Trop peu de parametres. 1 attendu. pourtant j’ai bien écrit le nom ! Ce que j’ai pas compris c’est ton autre article. Par contre je te remercie pour ta réponse super rapide. Ca fais super plaisir!

  43. chris dit :

    Je te remercie vraiment de m’aider, ça fait vraiment super plaisir. La solution qui me conviendrait serait Si la valeur DVD vient d’une zone du formulaire. Mais quand j’utilise ton code il me met le message : erreur d’exécution ‘3061’…SNIF. Quant à ta solution pour ouvrir la requête en gardant des paramètres simples .Je ne suis pas assez intelligent pour la comprendre…désolé. Sérieux ça dépasse les compétences de mon ptit cerveau..SNIF… Ce serait pas possible de plublier ton code modifié ? s’il te plait…

  44. Hervé Inisan dit :

    Donc, si c’est cette ligne qui t’intéresse :

    … il faut remplacer [Nom de la zone de saisie] par le nom de la zone de texte qui peut contenir DVD ou VHS (dans l’exemple), en conservant les crochets. S’il y a erreur, c’est que ce nom est sans doute mal écrit…

  45. Hervé Inisan dit :

    Pas eu le temps effectivement, faut travailler aussi 😉
    Si on doit aménager le code ci-dessus, c’est plutôt dans la chaîne SQL qu’il faut ajouter le filtre, puisque c’est elle qui sert pour obtenir les clients concernés.
    Donc il faudrait aménager la chaîne :

    …en ajoutant d’autres critères. Du style :

    Si la valeur DVD vient d’une zone du formulaire, ça devient :

    Ceci a pour effet de construire la requête qui est ouverte par le OpenRecordset.
    Une autre approche consisterait à ouvrir la requête en gardant des paramètres simples (voir cet article du blog).

  46. Chris dit :

    Ca fait un moment que j’ai posté mon message mais t’as toujours pas répondu…Peut être que t’as pas le temps…mais si tu pouvais m’aider sur ce coup là je t’en serais vraiment trés trés reconnaissant…Ca pourrait bien me changer la vie et celle de mon boulot…Alors si tu pouvais me faire un petit miracle…pleeeeeeease.
    Le message d’erreur c’est : erreur d’execution ‘3061’

  47. chris dit :

    Tout dabord merci beaucoup pour cet article il est fantastique. J’aimerai rajouter à mon formulaire une etiquette de recherche qui permeterai par exemple de trouver ceux qui ont loué un film en particulier ou seulement ceux qui ont loué des dvd. Une sorte de critère de tri qui selectionnerai dans ma requete, ceux à qui j’ai envie d’envoyer un mail.Pour ça c’est simple il suffit d’ajouter dans ma requete,dans les critères du champs support : Comme « * » & [Forms]![Liste des clients n’ayant pas ramené leur vidéo]![Recherche] & « * » en supposant bien sur que l’etiquette crée dans le formulaire s’appellerai Recherche. Et aussi, je renouvelle les etiquettes autant de fois que je veux pour autant de critère que je veux. Le seul problème c’est que dans ce cas votre code ne marche plus il me met un message d’erreur ! Pouvez vous m’aider ? A part ça votre site est superbe et je vous remercie pour toutes vos astuces.

  48. JJ dit :

    J’ai adapté votre code pour envoyer un état en utilisant la syntaxe de « sendobject acsendreport ».
    L’état arrive chez le destinataire sous un nom qui est celui inscrit dans le champ ‘légende » de l’état.
    Peut-on modifier dynamiquement ce nom en y ajoutant soit la date du jour ou mieux une date d’un évènement contenu dans le corps de l’état ?
    Si oui, comment ? Cette solution serait d’ailleurs plus performante que celle de PDF Creator qui ne retient que la date de l’envoi sans aucune donnée descriptive en clair.
    Tous mes voeux pour 2008 et longue vie à votre site

  49. Hervé Inisan dit :

    Pour ce qui est des champs vides, il y a plusieurs approches possibles :

    • Ne pas les utiliser dans le mail (c’est-à-dire ne pas les injecter dans le message par les Replace() VBA). Dans ce cas, fatalement, plus de problème 🙂
    • Filtrer la requête d’origine sur les champs en question, si on considère qu’un destinataire doit être ignoré lorsqu’une info est manquante.
      Ca peut se faire en plaçant le critère « <> Null » (ou « Est Pas Null« ), sans les guillemets, sous chaque champ « éliminatoire ».
      Ca peut se faire aussi en aménageant le code SQL, notamment le WHERE [Email] IS NOT NULL, qui pourrait devenir WHERE ([Email] IS NOT NULL) AND ([Nom Client] IS NOT NULL). Ainsi de suite pour chaque champ important.
    • Remplacer les champs vides par une valeur par défaut, si le vide n’est pas « éliminatoire ». Par exemple, on peut remplacer le champ [Nom Client] par Nz([Nom Client], "Valeur de remplacement"). Il y a d’autres articles sur la fonction Nz() sur le site. Mais ici, l’utilisation de Nz() me semble moins justifiée.

    Pour ce qui est des images, des pièces jointes en général, ou même des e-mails en HTML, je tâcherai d’écrire un article spécifique un de ces jours.

  50. JJ dit :

    1 Lorsque un des champs est vide (ce pourrait être dans votre application le nom de l’éditeur, la date de parution ..,) l’application s’arrêts sur une erreur mentionnant un Champ Nul
    Actuellemnt, je crée dans la requête de départ pour chaque champ pouvant renconter ce cas de figure un champ annexe Y a-t-il une manière plus élégante de contourner ce problème ?
    2 Peut -on insérer dans le corps du message du mail une image jpg (ex ; le logo de la bibliothèque …) ? Quelle est la syntaxe à utiliser ? Peut-on mettre cette image à un autre endroit ?

    Merci pour votre site – Tou smes voeux pour 2008

  51. Hervé Inisan dit :

    Voici mon mail : webmaster[arobase]self-access[point]com
    J’essaierai de jeter un oeil au code si j’ai un peu de temps.
    Bon week-end !

    Un complément :
    Pour envoyer un message strictement identique à tous les interlocuteurs, il suffit de simplifier la chaîne strMessageType, notamment en enlevant les codes du type {Titre}. Ensuite, les remplacements de chaînes, dans la boucle d’envoi, deviennent inutiles. Il faut donc enlever toutes les lignes avec strMsg = Replace(...).

  52. JJ dit :

    J’ai rencontré (et contourné) un petit problème dans la mise en place de l’envoi d’un message unique à tous les membres d’une table, que j’ai créé à partir de votre code.

    J’aimerais vous le présenter afin de simplifier mon code . Auriez vous l’amabilité de me transmettre exceptionnellement votre email ?

    Merci encore

  53. JJ dit :

    Merci beaucoup pour cet article intitulé Expédier des e-mails à partir du contenu d’une table.
    A partir de ce texte , j’ai pu réaliser également d’autres types d’envoi , notamment envoyer un même message unique non personnalisé à tous les membres de la table
    Merci encore

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *