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 :
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 :
- Ouvrez le formulaire en mode Création.
- Faites apparaître les propriétés du bouton, onglet Autres.
- Donnez un nom clair à votre bouton (ici : btnEmail).
- Activez l’onglet Evénement, toujours dans la fenêtre Propriétés.
- Réglez l’événement
Sur clic
du bouton sur[Procédure événementielle]
. - Cliquez ensuite sur les points de suspension à droite pour accéder au code VB de l’événement.
- Recopiez-y ce qui suit :
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 42 43 44 45 46 47 48 49 50 51 52 53 54 |
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 = "7ème Art VidéoClub - Rappel" ' Message type à expédier ' Les signes {...} seront remplacés plus loin par ' les infos Client strMessageType = "Bonjour {Titre} {Prénom Client} {Nom Client}," _ & vbCrLf & vbCrLf _ & "Le {Date de location}, vous avez loué dans notre vidéoclub " _ & "le film : " & vbCrLf _ & "'{Titre du film}'." & vbCrLf & vbCrLf _ & "Sauf erreur de notre part," _ & " vous ne nous avez pas ramené cette vidéo à ce jour." _ & vbCrLf & "Merci de... blah blah :-)" _ & vbCrLf & vbCrLf & "-- L'équipe 7ème Art Vidéoclub." ' Ouverture de la requête ' (seuls les clients ayant un email sont concernés ici) strSQL = "SELECT * FROM [rqt Vidéos non ramenées]" _ & " 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(strMessageType, "{Titre}", rst("Titre")) strMsg = Replace(strMsg, "{Nom Client}", rst("Nom Client")) strMsg = Replace(strMsg, "{Prénom Client}", rst("Prénom Client")) strMsg = Replace(strMsg, "{Date de location}", rst("Date de location")) strMsg = Replace(strMsg, "{Titre du film}", rst("Titre du film")) ' 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, "VidéoClub" End Sub |
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 exemplerst("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.
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
SendMailTrue
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.
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
Pour la signature, une approche consiste :
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ù.
Désolé pour ce retard je n’avais pas vu votre réponse…
Merci beaucoup pour votre aide.
Je vais voir ce que je peux trouver sur votre lien MSDN.
Pas de souci. 🙂
Bons tests !
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
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
Fred > Dans ce cas, il faut utiliser faire varier
strTitre
dans la boucle (avant leSendMail
). Du genre :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
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 !
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.
gyf >
C’est un peu compliqué à détailler ici, mais ça peut faire l’objet d’un autre tuto. Je note l’idée…
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
Fred > You’re welcome! 🙂
Super MERCI,
C’est exactement ce dont j’avais besoin.
Merci encore
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 :
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
Kisty > You’re welcome! 🙂
D’accord, merci pour l’explication et pour ton temps consacrer a aider les gens:)
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.
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?
Kisty > En fait, il faudrait plutôt aménager la boucle comme ceci :
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.
Ok,Merci je vais voir ton article, et comment régler mon deuxième problème aussi 😉
Kisty > Voici quelques pistes concernant les 2 problèmes :
SendMail
est fait à chaque « tour de boucle » (entreWhile
etWend
). 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 leSendMail
après la boucle (après leWend
).Par contre, si tu pars là-dessus, il vaut mieux aussi aménager
SendMail
pour passer les destinataires enCci
(ouBcc
) plutôt qu’en destinataires principaux (To
).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.
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 deSendMail
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. 🙂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!!!
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 !
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
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.
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
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.
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)
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 ?
Ok
Merci ++
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 :
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
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… 😉
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
JJ > L’article sur les logiciels de messagerie est maintenant en ligne, à cette adresse : Messagerie par défaut.
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…
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
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!
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 !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…
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!
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…
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…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).
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’
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.
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
Pour ce qui est des champs vides, il y a plusieurs approches possibles :
Replace()
VBA). Dans ce cas, fatalement, plus de problème 🙂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 devenirWHERE ([Email] IS NOT NULL) AND ([Nom Client] IS NOT NULL)
. Ainsi de suite pour chaque champ important.[Nom Client]
parNz([Nom Client], "Valeur de remplacement")
. Il y a d’autres articles sur la fonctionNz()
sur le site. Mais ici, l’utilisation deNz()
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.
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
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 avecstrMsg = Replace(...)
.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
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