libMail : une bibliothèque VBA pour expédier des emails avec ou sans pièces jointes
Dans la série : « comment, à partir d’Access, expédier un email avec ou sans pièces jointes ?« , voici une méthode alternative proposée par Denis Scheidt (également contributeur sur les forums self-access.com)…
La bibliothèque libMAIL fournie par Denis implémente ce qu’il faut de la RFC821 pour permettre l’envoi de mails à partir d’Access. Le tout en pur VBA et sous licence LGPL… Ca vous dit d’essayer ?
http://www.self-access.com/cms/access/assistants/libmail
La bibliothèque évoluant régulièrement, il vous sera maintenant plus facile de retrouver sa page dédiée.La page que vous lisez actuellement contient la documentation jusqu’à la version 1.10 uniquement.
Présentation de libMAIL
Je cite directement l’introduction de libMAIL :
Il arrive régulièrement que l’on ait besoin d’envoyer un état ou un fichier (résultat d’une requête, par exemple) par messagerie électronique à partir d’une application Access.
Access n’offre que deux méthodes pour effectuer cette action : la méthode
SendObject
de l’objetDoCmd
ou l’utilisation d’un objetOutlook.Application
(si Outlook est le client de messagerie utilisé par le poste).Ces deux solutions présentent l’avantage de la simplicité, mais ont également quelques inconvénients non négligeables :
- La méthode
SendObject
ne permet d’envoyer que des objets Access (formulaire, état, module, etc…). Il n’est pas possible de joindre un fichier externe. De plus, la mise en page est perdue, seules les données étant transmises.- Lorsqu’une application est diffusée chez plusieurs clients, par exemple, rien ne permet d’être sûr qu’un poste disposera de MS-Outlook. Il peut utiliser un autre client de messagerie (qui ne sera peut-être pas compatible MAPI), ou même ne disposer d’aucun logiciel de messagerie électronique. Écrire un code tenant compte de tous les cas possibles peut vite devenir très compliqué.
- Piloter une application tiers pose également des problèmes : il faut s’assurer que l’application existe sur le poste, éventuellement l’inclure dans le jeu d’installation de l’application Access. Cette application risque d’être mise à jour par ailleurs, et perturber ainsi le déroulement de l’application Access.
Ces différentes contraintes peuvent nous faire préférer une solution plus souple et efficace : avoir un mini-serveur SMTP, écrit en VBA, donc utilisable directement depuis une application Access, et ne dépendant d’aucun composant ou logiciel externe.
Avantages de libMAIL
La bibliothèque libMail présente plusieurs avantages :
- Vous pouvez expédier des messages avec ou sans pièces jointes ;
- Vous n’avez besoin d’aucun logiciel externe (la bibliothèque est développée en VBA) ;
- Vous n’aurez pas d’avertissement de sécurité, comme c’est le cas lorsque vous utilisez Outlook Automation.
La bibliothèque est sous licence LGPL : le code source est donc public et ré-exploitable librement.
Téléchargement
La version stable actuelle est numérotée 1.10
.
Vous trouverez le changelog en bas de cette page.
- Téléchargez libMAIL.
- Une fois le fichier Zip téléchargé, cliquez sur son icône du bouton droit de la souris, puis sélectionnez Extraire tout.
Vous obtenez un dossier contenant lui-même 3 sous-dossiers :
–code
: le code VBA et tout ce qui constitue la bibliothèque libMAIL.
–doc
: la documentation de la bibliothèque, sous plusieurs formats (PDF, OpenOffice).
–licence
: la licence LGPL. - Consultez la documentation pour bien comprendre le fonctionnement et l’installation de libMAIL.
Installation express
Si vous êtes pressé, voici une idée générale de l’installation :
- Créez une base de données vide que vous nommerez par exemple
libMAIL.mdb
. - Copiez dans le même dossier tous les fichiers du sous-dossier
code
fourni avec libMAIL. - Importez le module
Outils.MOD
. - Vérifiez que la bibliothèque DAO est activée dans votre projet (voir plus bas).
- Dans la fenêtre Exécution, tapez :
ChargeVB
puis appuyez sur la touche[Entrée]
.
Vous pouvez aussi placer le curseur dans la procédureChargeVB
, et cliquer sur l’icône Exécuter Sub/UserForm.
Pour plus de détails sur les références, consultez cette page.
Pensez aussi à compiler votre code VBA, après l’installation, pour vérifier que tout est correct.
Une fois la bibliothèque créée…
… il faut l’ajouter à votre projet (donc à votre base de données principale).
Pour cela, vous avez aussi plusieurs possibilités :
- Vous pouvez transformer votre bibliothèque
libMAIL.mdb
en un complément Access (libMAIL.mda
), et l’installer ensuite sur votre machine. Le processus est un peu long et sort du cadre de cet article. - Vous pouvez lier la bibliothèque
libMAIL.mdb
comme n’importe quelle référence VBA.
Et si on expédiait un mail ?
Ce qu’il faut bien comprendre avant de démarrer, c’est que l’envoi de mails se fait en 2 étapes :
- Vous devez d’abord préparer vos messages (normal, non ?).
- Vous devez ensuite démarrer le serveur SMTP qui va se charger de l’envoi des messages.
Exemple #1 : envoi de messages simples
Commençons par un cas simple : on souhaite expédier un message sans pièce jointe. Recopiez le code ci-dessous dans un module standard de votre base de données :
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub EnvoiMailSimple() ' Préparation du message CreeMail "destinataire@fournisseur.fr", _ "Test de libMAIL", _ "Ceci est un message envoyé par Access+libMAIL...", _ "emetteur@provider.com", _ CurrentUser ' Démarrage du serveur SMTP ' (et envoi du message) SMTPLance "smtp.provider.com", "provider.com" End Sub |
Sachant que :
- L’adresse
destinataire@fournisseur.fr
doit bien sûr être remplacée par celle de votre destinataire réel. Vous pouvez écrire plusieurs adresses, séparées par des virgules ou des points-virgules. - Le second paramètre est le sujet du message.
- Le troisième paramètre est le corps du message.
- L’adresse
emetteur@provider.com
est en principe votre propre adresse e-mail. CurrentUser
donne le nom d’utilisateur Access qui expédie le message (généralement :Admin
). Ce paramètre n’est pas utilisé dans le message, mais seulement dans les journaux de suivi.
Nouveauté de la version 1.01 : ce paramètre est facultatif (si vous l’omettez, c’est le nom de l’utilisateur Windows qui est pris en comp
te).
Une fois le message créé, la procédure SMTPLance
démarre le serveur proprement dit. Elle accepte au minimum 2 paramètres :
- Le nom du serveur SMTP à utiliser pour l’envoi des messages. En général, celui de votre fournisseur d’accès.
Par exemple, si vous êtes abonné Free, vous utiliserez :smtp.free.fr
- Le nom de domaine avec lequel libMAIL va s’identifier auprès du serveur SMTP. Ca peut être votre nom de domaine si vous en avez un, sinon celui de votre fournisseur d’accès.
Toujours pour Free, vous pouvez utiliser :free.fr
CreeMail
et SMTPLance
proposent de nombreuses autres options, notamment la prise en charge des destinataires en copie simple ou cachée (Cc
et Bcc
). Vous trouverez plus de détails dans la documentation de libMAIL.Exemple #2 : envoi de pièces jointes
Le principe est le même si vous devez joindre des documents à votre message. Il va falloir en plus :
- Stocker la liste des pièces jointes dans un tableau VBA.
- Transmettre ce tableau à la procédure
CreeMail
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Sub EnvoiMailAvecPJ() ' Initialiser la liste des pièces jointes Dim tblPJ(1, 2) As String tblPJ(0, 0) = "Manuel_libMAIL.pdf" tblPJ(1, 0) = "C:Documents and Settings...Manuel_libMAIL.pdf" tblPJ(0, 1) = "Hiver.jpg" tblPJ(1, 1) = "C:Documents and Settings...Collines.jpg" tblPJ(0, 2) = "Coucher de soleil.jpg" tblPJ(1, 2) = "C:Documents and Settings...Coucher de soleil.jpg" ' Préparation du message CreeMail "destinataire@fournisseur.fr", _ "Test de libMAIL", _ "Ceci est un message envoyé par Access+libMAIL...", _ "emetteur@provider.com", _ CurrentUser, , , tblPJ ' Démarrage du serveur SMTP ' (et envoi du message) SMTPLance "smtp.provider.com", "provider.com" End Sub |
SMTPLance
, vous devriez en faire des constantes VBA, ou – encore mieux – des paramètres de votre application.Questions fréquentes
Pourquoi ne pas livrer la bibliothèque directement sous forme de fichier .mdb ou .accdb ?
La réponse est dans la question 🙂 : parce que les formats des fichiers Access évoluent, et qu’il est difficile de fournir un fichier pour chaque version d’Access. L’approche retenue permet de livrer une version unique, compatible avec tous les Access du moment (au moins depuis 97 !).
Est-ce que je peux intégrer les modules et le formulaire directement dans ma base de données ?
C’est possible aussi, et ça marchera aussi bien…
Il y a quand même quelques petites choses à prendre en compte :
- Les inconvénients de gestion : si vous devez mettre à jour la bibliothèque, vous devrez remplacer manuellement les anciens modules VBA (et le formulaire SMTP) par les nouveaux. Et vous ne pourrez pas utiliser le module
Outils
pour cette opération (rappelons qu’il ne doit être utilisé que pour construire la bibliothèque « from scratch« ). - La bibliothèque est sous licence LGPL. Tant qu’elle est liée à votre application, votre base Access n’est pas concernée. Par contre, si le code de la bibliothèque est intégré à votre base, celle-ci passe également sous licence LGPL. Consultez la licence pour plus de détails.
Support
Si vous avez des questions ou des problèmes avec libMail, vous pouvez…
- les poster sur ce blog, comme commentaires ;
- les poster sur le forum Access de self-access.com ;
- écrire directement à l’auteur (Denis), dont l’adresse figure dans la documentation.
Change Log
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Version 1.10 - Mars 2009 ------------------------ ++ Support partiel des extensions SMTP (RFC2821). Connexion par EHLO, avec repli éventuel sur HELO. Les extensions SIZE, AUTH-LOGIN et AUTH-PLAIN sont prises en charge (RFC 2554). ++ ESMTPLance() pour les connexions avec authentification. SMTPLance() est toujours utilisable pour les connexions sans authentification. ++ Constantes et type défini par l'utilisateur pour l'authentification (voir la doc.). -- ** Le code de la fonction EnvoieTout() a été remanié. ** EnvoiCMD() ne renvoie que le premier caractère du code de retour (RFC 2821). ** Une estimation de la taille du mail est ajoutée à la commande MAIL si l'extension SIZE est prise en charge. Version 1.01 - Février 2009 --------------------------- ++ Fonction Dec_Base64() : décodage d'une chaîne codée en Base 64. ++ Fonction myCurrentUser() : retourne le login Windows. -- ** CreeMail() : le paramètre [sUtilisateur] est maintenant facultatif. Le login Windows est utilisé par défaut. ** SMTPRelance, SMTPSuspend et SMTPDecharge vérifient que le formulaire est chargé. ** SMTPLance : contrôle de la validité de la spec de fichier pour le journal. ** ChargeVB() positionne le nom de projet à 'libMail'. Ceci garantit une référence constante, même si le nom du fichier de BDD (utilisé par défaut pour la propriété) est différent de 'libMail'. |
Je suis hyper satisfait
nexeg > Content que ça puisse dépanner ! 🙂
(et merci à Denis pour son support)
Bonjour, j’ai suivi ton conseil. Denis m’a assisté, chaperonné je devrais plutôt dire.
C’est top. Merci de toute votre démarche Messieurs. Nous avons 1 chance inoui…
Je démarre avec son système de messagerie. Un vrai plaisir et des perspectives des plus intéressantes…
Je l’intègre dans 1 application de gestion interne que nous utilisons depuis plusieurs années. C’est je crois le module dont nous avions besoin…
Bien à vous tous
nexeg > S’il s’agit d’une question spécifique libMAIL, le meilleur endroit pour la poster est le forum dédié libMAIL. Denis se fera un plaisir de te répondre.
Bonjour, Semble-t-il, j’ai moins de chance que tout le monde… Je tente d’utiliser la bibliothèque libMAIL, qui me serait bien utile dans mon application, mais en vain. Mon serveur SMTP requiert 1 authentification… Il nécessite aussi 1 compte utilisateur déclaré ainsi que de son mot de passe…
J’aurai bien voulu disposer de la doc de libMAIL où tout cela doit être certainement commenté, mais je suis passé à côté.
Merci de vos bons conseils.
Excellente initiative que ce module qui va probablement résoudre ce problème récurrent de l’installation de MAPI sur les machines client. Ca va me donner du boulot perso pour intégrer le module en automatique sur les postes clients, mais ça vaut le coup. Je repasserai ici donner mes impressions.
Merci
Merci à vous deux pour cette appréciation 🙂
jb85 > Je suis d’accord ! Si DenisS passe par là, je plussoie… 🙂
Un immense merci au concepteur de cet extraordinaire programme. Je viens de l’utiliser pour 2 applications d’une association (épicerie sociale et solidaire). C’est impeccable.
Encore bravo, superbe travail !
Weric > Merci d’avoir continué la conversation sur le forum. La suite se trouve donc par là, pour ceux que ça intéresse aussi. 🙂
Bonjour à tous,
je viens de tester libmail (sous Access 97 et 2003), mais je n’arrive pas à le configurer pour qu’il utilise le serveur smtp de gmail.
Pouvez-vous me renseigner ?
Merci d’avance et bonne journée
Weric
merci bien 🙂
A priori, libMAIL fonctionne correctement sous Access 2007.
Toutefois, la version 1.10 pose un problème particulier sous Access 2007, dans le sens ou l’interface se fige complètement lorsqu’on laisse bLogData = False (la valeur par défaut) dans SMTPLance.
Un autre bug à été repéré, qui peut conduire à la corruption de certaines pièces jointes (lorsqu’elle dépassent les 600 Ko environ). Ce problème n’est pas spécifique à Access 2007.
Ces deux problèmes sont corrigés dans la version 1.20, qui devrait sortir très prochainement.
As-tu rencontré d’autres soucis dans l’utilisation de la bibliothèque ?
Bonjour,
est-il possible de paramétrer la bibliothèque pour l’utiliser sous Access 2007?
Merci de votre réponse!
Merci ! 🙂
Le tableau PJ() sert à transmettre les informations nécessaires à la procédure CreeMail.
Cela permet de passer un nombre quelconque de références de PJ à la procédure à l’aide d’un seul paramètre.
CreeMail va ensuite parcourir ce tableau, lire les fichiers correspondants, et enregistrer tout ça dans la table.
Le code de CreeMail s’attend à voir un tableau de type String, à deux dimensions. Il faudra donc déclarer un tableau pour appeler la procédure, même si ce tableau ne contient qu’une seule ligne.
Par contre, ce tableau peut parfaitement être initialisé à l’aide de tes variables.
Tu peux, bien entendu, modifier le code source et l’adapter à tes besoins, mais cette modif sera à refaire lors de la sortie de la prochaine version…
Bravo ! Superbe application ! que je viens de tester avec succès. Par contre dans mon programme je crée des états différents que je transforme en PDF et ensuite je les fusionnes en un seul et ensuite je dois le joindre systématiquement avec le mail du client en cours de traitement. Je n’ai donc pas besoin d’utiliser un tableau. Le nom du fichier et le chemin sont déjà stockés dans des variables.
Je pense qu’il est possible à la place de tbPJ() de faire référence à mes propres variables.
Merci pour vos conseils.
Alain
Merci beaucoup cher Deniss et salut à Mr Hervé
Test réussi . A bientot
smtp.provider.com n’est là que pour l’exemple. Ce paramètre doit être remplacé par le nom du serveur SMTP de *TON* fournisseur d’accès.
Ex. smtp.free.fr si tu es chez Free, etc…
Ton FAI a dû te fournir ces informations.
Tu dois avoir une adresse mail valide chez ce FAI, que tu dois mettre en adresse d’expéditeur, sinon le serveur refusera la connexion.
bonjour cher Deniss
j’ai crée un fichier journal sur C:Temp
apres le test j’y ai trouvé un fichier avec la ligne suivante :
Erreur de conversion de smtp.provider.com vers IP.
12/02/2009 09:24:25 Fermeture du socket… (884) [0]
12/02/2009 09:24:25 Libération des ressources. [0]
12/02/2009 09:24:25 Déchargement du serveur.
12/02/2009 09:24:25
Merci bien cher Hervé
Access 2002 2003
le formulaire frm_SMTP existe ds la bd libMAIL.mdb . il s’ouvre en mode « minimized «
Par défaut, libMail va tenter de créer un fichier journal sur C:Temp. Si ce dossier n’existe pas, l’erreur vient probablement de là.
Au lieu de laisser le paramètre vide dans SMTPLance, met « ». Le log ne se fera que dans la fenêtre, pas vers le disque dur.
hamid > Quelle est ta version d’Access ?
Est-ce que le formulaire existe bien dans la base libMAIL.mdb ?
Bonjour .
je reçois ce message :
run time error 76
path not found
code à deboguer:
Sub SMTPRelance()
Call Application.Forms.frm_SMTP.Demarrer
End Sub
Amicalement votre