I. Introduction▲
Je vous propose une petite application d'envoi de lettres d'information (newsletters).
Cette application fonctionnelle est essentiellement destinée à démontrer qu'Access permet de concevoir des outils sympathiques en fonction des besoins.
Elle pourra être utilisée en tant que telle par une association par exemple, mais servira surtout de support aux développeurs débutants.
En effet, outre l'aspect messagerie, l'application utilise de nombreuses solutions proposées dans la Faq ou le Forum.
Afin de pouvoir bénéficier des options de texte enrichi, l'application a été développée en Accdb et ne peut donc être utilisée qu'avec Access 2007 ou plus. Si cette base est convertie en Mdb, cette option ne pourra pas être utilisée.
Vous pouvez également vous en servir avec le Runtime, mais dans ce cas le code ne sera pas accessible.
II. Applicatif▲
III. Quelques principes et règles sur les envois de newsletters▲
Ce type de logiciel est destiné à l'envoi en nombre. C'est ce que l'on appelle le mass mailing.
Il est soumis à la réglementation, car s'apparentant à du e-mail publicitaire.
En France, la loi stipule que les internautes doivent donner leur accord ou s'inscrire pour recevoir des e-mails publicitaires.
Un envoi publicitaire non désiré peut s'apparenter à un spam.
Cela concerne les envois de campagnes publicitaires, mais également les lettres d'information, etc.
Tout e-mail devra contenir un lien de désabonnement, ou la procédure à suivre pour ne plus recevoir de messages.
Vous pouvez avoir les renseignements précis sur le site de la CNIL.
À noter également que les fournisseurs d'accès peuvent limiter les envois à partir de leurs sites, ou au contraire refuser de recevoir ceux provenant d'adresses e-mail ou Ip considérées comme black-listées.
En conclusion ce type d'outil, peut servir à une petite association avec des envois ponctuels, et non à une grosse structure ayant des milliers d'envois par semaine.
Dans ce cas il vaut mieux passer par une entreprise spécialisée.
IV. Possibilités du logiciel▲
Fonctionnalités du logiciel :
- envoyer des newsletters à partir de plusieurs serveurs ;
- avoir autant de listes d'abonnés (listes de diffusion) que souhaité ;
- importer des listes de diffusion hébergées dans une base MySql d'un serveur Web (Free dans l'exemple) ;
- saisir les newsletters en texte enrichi ;
- copier le contenu des newsletters à partir de sources HTML provenant d'un logiciel tiers ;
- visualiser ce code HTML ;
- pouvoir insérer une pièce jointe ;
- ajouter un éventuel lien vers une page Web ;
- ajouter un éventuel lien de désinscription ;
- prévoir un nombre maximum d'envois ;
- conserver les messages ;
- suivre l'envoi à l'aide d'une barre de progression ;
- faire une reprise d'envoi après incident ou si le quota d'envois est atteint ;
- garder un historique des envois.
V. Notice d'utilisation▲
V-A. Paramètres généraux▲
V-A-1. Paramétrage des connexions▲
Ces paramètres sont dans la majorité des cas ceux donnés par votre fournisseur d'accès (FAI) ou votre prestataire de messagerie.
Si vous avez un logiciel de messagerie sur votre PC, vous pouvez récupérer les paramètres SMTP de votre compte de messagerie.
Bien lire le contrat de votre prestataire pour savoir si votre nombre d'envois quotidiens est limité.
S'il l'est, il faut remplacer le paramètre "Nb mails maxi/jour" illimité (9999) par celui qui vous est indiqué, sur lequel vous déduirez un nombre moyen d'autres messages.
Par exemple si votre nombre est limité à 100, notez 90 pour avoir la possibilité d'envoyer une dizaine de messages classiques.
Pour modifier un paramètre, cliquez sur le numéro de connexion dans la liste. Le détail de la fiche apparaît plus haut. Faites les modifications et validez.
Vous pouvez bien sûr ajouter ou supprimer un paramétrage, avec les boutons adéquats.
V-A-2. Paramétrage des tables d'abonnés▲
Cet onglet va nous permettre de paramétrer les tables d'abonnés :
V-A-2-a. Principe▲
Nous pouvons créer autant de listes d'abonnés (ou listes de diffusion) que nous voulons.
Chaque création fait l'objet d'une table spécifique.
Ces tables sont reconnues comme tables d'adhérents car possédant un champ spécifique "DateInscription".
Il est conseillé de leur donner des noms facilement identifiables.
V-A-2-b. Renommer les tables▲
Vous avez la possibilité de renommer ces tables, si la logique ne vous convient plus.
Pour cela :
- sélectionnez celle que vous voulez renommer dans la liste ;
- saisissez le nouveau nom dans la zone "Nom à donner" ;
- validez et passez éventuellement à la table suivante.
V-A-2-c. Copier une table▲
Vous pouvez créer de nouvelles listes de diffusion.
Vous pourrez le faire soit en créant une table vide (dans ce cas, seule la structure de la table sera créée), soit en recopiant une table existante et en lui donnant un autre nom.
Il est recommandé de créer une table de test, contenant une ou plusieurs adresses auxquelles vous avez accès, afin de simuler les envois et ainsi contrôler le contenu de vos messages.
V-A-2-d. Paramétrages d'import MySQL▲
Il peut être intéressant, pour faciliter les choses, que les inscriptions soient faites directement par les abonnés à l'aide d'un formulaire en ligne, dont les données seront stockées dans une base MySQL hébergée sur le serveur du fournisseur d'accès.
Dans ce cas si la structure est compatible, on peut envisager avant chaque envoi d'importer les données enregistrées sur cette base. Pour ce faire, nous aurons besoin de différents paramètres correspondant au script PHP présent sur ce serveur.
Pour pouvoir utiliser cette option, il est nécessaire d'avoir un minimum de connaissances sur l'hébergement et les scripts.
V-A-2-d-i. Script PHP▲
Dans un premier temps il vous faudra stocker sur le serveur un fichier PHP qui servira de passerelle avec Access.
<?PHP
$query=$_POST['sql'];
$link = mysql_connect("sql.free.fr", "Username", "password");
mysql_select_db("sqldvp", $link) or die(mysql_error());
mysql_query("SET NAMES 'utf8'");
$result = mysql_query($query, $link) or die(mysql_error());
$fields = mysql_num_fields( $result);
$rows=@mysql_numrows($result);
for ($ligne=0 ; $ligne<@mysql_numrows($result);$ligne++)
{
for ($colonne = 0;$colonne < $fields ; $colonne++)
{
$resultquery.= mysql_result($result, $ligne, $colonne).'|'; //separateur colonne |
}
$resultquery.='#'; // séparateur line #
}
echo $resultquery;
mysql_close();
?>
Il faut remplacer vos propres paramètres de connexion dans la ligne "$link = ...".
Il faudra également personnaliser vos propres séparateurs de ligne et colonne ('|' et '#' dans notre exemple).
Bien noter l'emplacement de ce script sur le serveur.
Comme vous le constatez dans la vue ci-dessus, il faut saisir l'URL du script ainsi que les séparateurs mentionnés plus haut.
Une requête "Select" est nécessaire pour pouvoir sélectionner les données à importer.
Par exemple :
Select Id_Abonne, Nom_Abonne, Email, Date_Inscription, Date_Modification, Valide from ListAbonnes1
Ou encore :
Select * from ListAbonnes2 Where Valide = 1
Pour vérifier que vos paramètres et que votre requête sont bien saisis cliquez sur le bouton "Test sur 5 enregistrements".
Si tout se passe bien et si votre table externe n'est pas vide, cinq enregistrements s'afficheront.
V-A-3. Tables d'abonnés▲
V-A-3-a. Saisie classique▲
Vous pourrez dans ce formulaire saisir directement des données, en supprimer ou en corriger.
Vous pouvez également sélectionner une table dans la liste déroulante et afficher ainsi tous les abonnés correspondant à cette table.
Si vous voulez modifier les données d'un adhérent, cliquez sur son code dans la liste et la fiche correspondante s'affichera.
N'oubliez pas de valider après chaque saisie ou modification, pour que les changements soient effectifs.
V-A-3-b. Saisie par import externe.▲
Vous pourrez au départ de ce menu, alimenter une table à partir des données saisies sur un serveur externe.
Il suffit de sélectionner un script prédéfini dans les paramètres, puis de choisir la table de destination.
Une demande de confirmation vous sera adressée avant le lancement de l'import.
Le fait d'importer des données supprime toutes celles que vous aviez auparavant dans la table choisie.
V-B. Messages▲
Vous accéderez à ce formulaire par le bouton "Liste des messages" du menu général.
V-B-1. Paramètres et contenu des messages▲
Vous pouvez à partir de la liste déroulante, sélectionner un des messages déjà créés et ainsi vérifier les paramètres de diffusion et l'historique des éventuels envois.
Vous pouvez également en saisir un nouveau, en supprimer, ou en modifier.
V-B-1-a. Quelques explications▲
Nom du message :
donnez un nom représentatif.
Mail expéditeur :
donnez votre adresse mail d'expéditeur correspondant au serveur d'envoi que vous choisirez.
Objet :
donnez là aussi un nom représentatif. C'est celui qui apparaîtra dans le mail.
Source d'envoi :
choix correspondant à l'onglet dans lequel vous aurez saisi votre message.
Lien page Web :
correspond à l'URL d'un page Web sur laquelle le destinataire pourra visualiser le message si celui-ci ne s'affiche pas correctement dans sa messagerie.
Cette zone est facultative et est surtout destinée aux envois par l'option "source HTML".
Lien désinscription :
ce lien est normalement obligatoire dans le cas d'envois en nombre.
Il peut être soit une adresse e-mail si vous choisissez d'être informé par e-mail, soit par un lien Web vers par exemple un formulaire de désinscription lié à votre table externe.
Lien pièce jointe :
il vous permet de choisir un fichier à mettre en pièce jointe.
V-B-1-b. Saisie du message▲
Vous pouvez soit saisir un message directement avec les mises en forme offertes par le texte enrichi, soit saisir ou copier les sources d'une page HTML éditées dans un logiciel spécialisé.
V-B-1-b-i. Saisie directe▲
Dans cet onglet une zone de saisie vous permet de rédiger le corps de votre message.
Pour la mise en forme vous pouvez utiliser les menus appropriés dans le ruban :
Vous pouvez également vous servir de la barre d'outils flottante :
V-B-1-b-ii. Copie sources HTML▲
Dans cet onglet vous pourrez saisir (si vous en avez les compétences) ou recopier les sources d'une page HTML.
Vous pourrez visualiser la cohérence de cette source dans l'onglet "Aperçu source HTML".
V-B-2. Envoi des messages▲
Une fois le message rédigé, il reste à l'envoyer. Il faut obligatoirement :
- sélectionner un message ;
- choisir une liste de destinataires ;
- choisir un serveur d'envoi ;
- cliquer sur "Envoi".
Vous devrez répondre à un message de confirmation.
L'opération d'envoi va se dérouler.
Une barre de progression en bas du formulaire vous indiquera l'avancement.
Vous serez averti à la fin de l'opération.
Une ligne sera ajoutée dans l'historique.
Le destinataire recevra suivant le cas :
ou bien :
Il y a bien en entête le lien HTML et en pied de message le lien de désinscription.
V-B-3. Reprise▲
Il peut arriver qu'il y ait un problème pendant l'envoi ou que vous ayez atteint le nombre maximum de messages défini dans les paramètres SMTP.
Dans votre historique, vous aurez par exemple 90/110. Cela voudra dire que vingt messages n'ont pas fait l'objet d'un envoi.
Dans ce cas il faut de nouveau sélectionner le message, ainsi qu'un serveur et la liste des destinataires concernée. Puis cliquez sur "Reprise". L'envoi va reprendre là où il s'était arrêté.
Attention : dans ce type d'envoi, le résultat se fait sur les messages envoyés correctement.
Il ne préjuge pas de ceux qui seront reçus, bloqués par des firewalls et autres antispams ou surtout effectivement lus.
VI. Développement▲
Comme écrit dans l'introduction, cette application est surtout destinée à aider les développeurs débutants.
Une petite application comme celle-ci permet de mettre en œuvre des problématiques variées.
Sont abordés en effet entre autres :
- manipulations sur les tables (création, copie, renommage, mise à jour de champs, parcours recordset) ;
- IHM avec l'alimentation de zones de liste, le double affichage dans des sous-formulaires, ou encore une barre de progression... ;
- importation de données externes dans une table ;
- envoi d'e-mails en CDO.
Nous allons consacrer ce chapitre à ce dernier point.
VI-A. Envoi d'e-mails en CDO▲
VI-A-1. Présentation▲
CDO ou "Collaboration Data Objects" est une bibliothèque permettant d'envoyer des mails sans disposer d'une messagerie sur son PC.
Différentes versions ont vu le jour :
- CDO 1.21 ("Collaboration Data Objects") est (était) installé avec Exchange/Outlook ;
- CDONTS ("Collaboration Data Objects pour Windows NT Server") est la version CDO de Windows NT et 98 ;
- CDOSYS ("Collaboration Data Objects pour Windows 2000") a remplacé CDONTS à partir de Windows 2000/XP ;
- CDOEX ("CDO for Exchange Server") s'appuie sur CDOSYS et est installé avec Exchange (n'est apparemment plus installé avec la version 2010).
Si CDOEX est installé, il remplace CDOSYS :
À partir de Office 2010, CDO n'est plus inclus dans le pack et ne fonctionnera pas avec les versions Office 64 bits.
Vous pourrez donc l'utiliser sans problème de Office 2000 à 2007.
Pour les versions ayant été mises à jour vers 2010 en 32 bits, les tests que nous avons effectués se sont révélés positifs.
VI-A-2. Options d'envoi▲
Dans un premier temps, il vous faut connaître les paramètres SMTP nécessaires.
Si vous avez une messagerie installée, il vous suffit d'aller dans les paramètres d'un de vos comptes :
Le principe en est simple. Il faut créer l'objet CDO puis lui assigner plusieurs paramètres d'envoi obligatoires ou optionnels.
VI-A-2-a. Envoi d'un message simple▲
Voici l'exemple d'un code utilisé pour envoyer un message tout simple.
Option
Compare Database
Option
Explicit
Private
Sub
envoiCdo)
On
Error
GoTo
Error_send
Dim
oCdo As
Object
Set
oCDO =
CreateObject
(
"CDO.Message"
)
With
oCDO
With
.Configuration.Fields
.Item
(
"http://schemas.microsoft.com/cdo/configuration/sendusing"
) =
2
'ou CdoSendUsingPort : utilisation réseau
.Item
(
"http://schemas.microsoft.com/cdo/configuration/smtpserver"
) =
"smtp.free.fr"
'nom ou IP du serveur SMTP
.Item
(
"http://schemas.microsoft.com/cdo/configuration/smtpserverport"
) =
"25"
'port utilisé
.Update
End
With
.Subject
=
"envoi exemple"
' objet du message
.From
=
"expediteur@free.fr"
' adresse de l'expéditeur
.To
=
"destinataire@free.fr"
' adresse du destinataire
.TextBody
=
"Ceci est un message de test."
' corps du message en format texte brut
.Send
End
With
Fin
:
Set
oCdo =
Nothing
Exit
Sub
Error_send
:
MsgBox
"Erreur d'envoi "
&
Err
.Number
&
" "
&
Err
.Description
Resume
Fin
End
Sub
Voici le résultat dans la messagerie du destinataire :
VI-A-2-b. Envoi d'un message en mode HTML▲
Dans le message précédent, nous avons envoyé un message en texte brut.
Rendons ce message un peu plus attractif en utilisant les possibilités du HTML.
Option
Compare Database
Option
Explicit
Private
Sub
envoiCdo
(
)
On
Error
GoTo
Error_send
Dim
oCdo As
Object
Dim
strHtml As
String
'variable contenu du corps de message
' Définit le contenu du message au format HTML
strHtml =
"<HTML><HEAD><BODY>"
strHtml =
strHtml &
"<b> Ceci est un message de test au format <i><Font Color=#ff0000 > HTML </Font></i></b>"
strHtml =
strHtml &
"</BODY></HEAD></HTML>"
Set
oCdo =
CreateObject
(
"CDO.Message"
)
With
oCdo
With
.Configuration.Fields
.Item
(
"http://schemas.microsoft.com/cdo/configuration/sendusing"
) =
2
'ou CdoSendUsingPort : utilisation réseau
.Item
(
"http://schemas.microsoft.com/cdo/configuration/smtpserver"
) =
"smtp.free.fr"
'nom ou IP du serveur SMTP
.Item
(
"http://schemas.microsoft.com/cdo/configuration/smtpserverport"
) =
"25"
'port utilisé
.Update
End
With
.Subject
=
"envoi exemple"
' objet du message
.From
=
"expediteur@free.fr"
' adresse de l'expéditeur
.To
=
"destinataire@free.fr"
' adresse du destinataire
.HtmlBody
=
strHtml ' corps du message HTML
.Send
End
With
Fin
:
Set
oCdo =
Nothing
Exit
Sub
Error_send
:
MsgBox
"Erreur d'envoi "
&
Err
.Number
&
" "
&
Err
.Description
Resume
Fin
End
Sub
Le message reçu est déjà plus sympathique :
VI-A-2-c. Envoi en Cc ou Bcc▲
Vous pouvez également envoyer vos messages avec les options Cc (Copie carbone) ou Bcc (Copie carbone aveugle).
Option
Compare Database
Option
Explicit
Private
Sub
envoiCdo
(
)
On
Error
GoTo
Error_send
Dim
oCdo As
Object
Dim
strHtml As
String
'variable contenu du corps de message
' Définit le contenu du message au format HTML
strHtml =
"<HTML><HEAD><BODY>"
strHtml =
strHtml &
"<b> Ceci est un message de test au format <i><Font Color=#ff0000 > HTML </Font></i></b>"
strHtml =
strHtml &
"</BODY></HEAD></HTML>"
Set
oCdo =
CreateObject
(
"CDO.Message"
)
With
oCdo
With
.Configuration.Fields
.Item
(
"http://schemas.microsoft.com/cdo/configuration/sendusing"
) =
2
'ou CdoSendUsingPort : utilisation réseau
.Item
(
"http://schemas.microsoft.com/cdo/configuration/smtpserver"
) =
"smtp.free.fr"
'nom ou IP du serveur SMTP
.Item
(
"http://schemas.microsoft.com/cdo/configuration/smtpserverport"
) =
"25"
'port utilisé
.Update
End
With
.Subject
=
"envoi exemple"
' objet du message
.From
=
"expediteur@free.fr"
' adresse de l'expéditeur
.To
=
"destinataire@free.fr"
' adresse du destinataire
.HtmlBody
=
strHtml ' corps du message HTML
.Bcc
=
"yyyy@hotmail.fr"
' adresse destinataire en copie carbone cachée
.Cc
=
"xxxx@orange.fr"
' adresse destinataire en copie carbone
.Send
End
With
Fin
:
Set
oCdo =
Nothing
Exit
Sub
Error_send
:
MsgBox
"Erreur d'envoi "
&
Err
.Number
&
" "
&
Err
.Description
Resume
Fin
End
Sub
VI-A-2-d. Envoi avec pièce jointe▲
Un fichier peut être ajouté en pièce jointe.
Option
Compare Database
Option
Explicit
Private
Sub
envoiCdo
(
)
On
Error
GoTo
Error_send
Dim
oCdo As
Object
Dim
strHtml As
String
'variable contenu du corps de message
' Définit le contenu du message au format HTML
strHtml =
"<HTML><HEAD><BODY>"
strHtml =
strHtml &
"<center><b> Ceci est un message de test au format <i><Font Color=#ff0000 > HTML. </Font></i></b></center>"
strHtml =
strHtml &
"</br>Veuillez prendre connaissance de la pièce jointe."
strHtml =
strHtml &
"</BODY></HEAD></HTML>"
Set
oCdo =
CreateObject
(
"CDO.Message"
)
With
oCdo
With
.Configuration.Fields
.Item
(
"http://schemas.microsoft.com/cdo/configuration/sendusing"
) =
2
'ou CdoSendUsingPort : utilisation réseau
.Item
(
"http://schemas.microsoft.com/cdo/configuration/smtpserver"
) =
"smtp.free.fr"
'nom ou IP du serveur SMTP
.Item
(
"http://schemas.microsoft.com/cdo/configuration/smtpserverport"
) =
"25"
'port utilisé
.Update
End
With
.Subject
=
"envoi exemple"
' objet du message
.From
=
"expediteur@free.fr"
' adresse de l'expéditeur
.To
=
"destinataire@free.fr"
' adresse du destinataire
.HtmlBody
=
strHtml ' corps du message HTML
.Bcc
=
"yyyy@hotmail.fr"
' adresse du destinataire en copie carbone cachée
.Cc
=
"xxxx@orange.fr"
' adresse du destinataire en copie carbone
.AddAttachment
"C:\Test\Document texte.txt"
' lien vers pièce jointe
.Send
End
With
Fin
:
Set
oCdo =
Nothing
Exit
Sub
Error_send
:
MsgBox
"Erreur d'envoi "
&
Err
.Number
&
" "
&
Err
.Description
Resume
Fin
End
Sub
VI-A-2-e. Envoi avec demande d'accusé de réception▲
Vous pouvez envoyer une demande d'accusé de réception.
MDNrequested | Commentaire |
---|---|
True | Accusé de réception demandé |
False | Pas d'accusé de réception demandé (par défaut) |
Option
Compare Database
Option
Explicit
Private
Sub
envoiCdo
(
)
On
Error
GoTo
Error_send
Dim
oCdo As
Object
Dim
strHtml As
String
'variable contenu du corps de message
' Définit le contenu du message au format HTML
strHtml =
"<HTML><HEAD><BODY>"
strHtml =
strHtml &
"<center><b> Ceci est un message de test au format <i><Font Color=#ff0000 > HTML. </Font></i></b></center>"
strHtml =
strHtml &
"</br>Veuillez prendre connaissance de la pièce jointe."
strHtml =
strHtml &
"</BODY></HEAD></HTML>"
Set
oCdo =
CreateObject
(
"CDO.Message"
)
With
oCdo
With
.Configuration.Fields
.Item
(
"http://schemas.microsoft.com/cdo/configuration/sendusing"
) =
2
'ou CdoSendUsingPort : utilisation réseau
.Item
(
"http://schemas.microsoft.com/cdo/configuration/smtpserver"
) =
"smtp.free.fr"
'nom ou IP du serveur SMTP
.Item
(
"http://schemas.microsoft.com/cdo/configuration/smtpserverport"
) =
"25"
'port utilisé
.Update
End
With
.Subject
=
"envoi exemple"
' objet du message
.From
=
"expediteur@free.fr"
' adresse de l'expéditeur
.To
=
"destinataire@free.fr"
' adresse du destinataire
.HtmlBody
=
strHtml ' corps du message HTML
.Bcc
=
"yyyy@hotmail.fr"
' adresse du destinataire en copie carbone cachée
.Cc
=
"xxxx@orange.fr"
' adresse du destinataire en copie carbone
.AddAttachment
"C:\Test\Document texte.txt"
' lien vers pièce jointe
.MDNrequested
=
True
' accusé de réception demandé
.Send
End
With
Fin
:
Set
oCdo =
Nothing
Exit
Sub
Error_send
:
MsgBox
"Erreur d'envoi "
&
Err
.Number
&
" "
&
Err
.Description
Resume
Fin
End
Sub
VI-A-2-f. Envoi avec notification▲
Ce paramètre vous permet de définir les messages de notification d'envoi que vous voulez recevoir.
Six valeurs peuvent être données :
DSNOptions | Constante | Commentaire |
---|---|---|
0 | CdoDSNDefault | Pas de notification par défaut |
1 | CdoDSNNever | Pas de notification |
2 | CdoDSNFailure | Notification sur échec d'envoi |
4 | CdoDSNSuccess | Notification si succès |
8 | CdoDSNDelay | Notification si délai dépassé |
14 | CdoDSNSuccessFailOrDelay | Notification pour tous les envois |
Option
Compare Database
Option
Explicit
Private
Sub
envoiCdo
(
)
On
Error
GoTo
Error_send
Dim
oCdo As
Object
Dim
strHtml As
String
'variable contenu du corps de message
' Définit le contenu du message au format HTML
strHtml =
"<HTML><HEAD><BODY>"
strHtml =
strHtml &
"<center><b> Ceci est un message de test au format <i><Font Color=#ff0000 > HTML. </Font></i></b></center>"
strHtml =
strHtml &
"</br>Veuillez prendre connaissance de la pièce jointe."
strHtml =
strHtml &
"</BODY></HEAD></HTML>"
Set
oCdo =
CreateObject
(
"CDO.Message"
)
With
oCdo
With
.Configuration.Fields
.Item
(
"http://schemas.microsoft.com/Cdo/configuration/sendusing"
) =
2
'ou CdoSendUsingPort : utilisation réseau
.Item
(
"http://schemas.microsoft.com/Cdo/configuration/smtpserver"
) =
"smtp.free.fr"
'nom ou IP du serveur SMTP
.Item
(
"http://schemas.microsoft.com/Cdo/configuration/smtpserverport"
) =
"25"
'port utilisé
.Update
End
With
.Subject
=
"envoi exemple"
' objet du message
.From
=
"expediteur@free.fr"
' adresse de l'expéditeur
.To
=
"destinataire@free.fr"
' adresse du destinataire
.HtmlBody
=
strHtml ' corps du message HTML
.Bcc
=
"yyyy@hotmail.fr"
' adresse du destinataire en copie carbone cachée
.Cc
=
"xxxx@orange.fr"
' adresse du destinataire en copie carbone
.AddAttachment
"C:\Test\Document texte.txt"
' lien vers pièce jointe
.MDNrequested
=
True
' accusé de réception demandé
.DSNOptions
=
2
' notification sur échec
.Send
End
With
Fin
:
Set
oCdo =
Nothing
Exit
Sub
Error_send
:
MsgBox
"Erreur d'envoi "
&
Err
.Number
&
" "
&
Err
.Description
Resume
Fin
End
Sub
S'il y a une erreur dans une adresse par exemple, l'expéditeur recevra un message automatique :
VI-A-3. Options de paramétrage SMTP▲
Dans les exemples ci-dessus, nous avons utilisé les options minimales SMTP qui seront utilisées dans la grande majorité des cas.
With
oCdo
With
.Configuration.Fields
.Item
(
"http://schemas.microsoft.com/cdo/configuration/sendusing"
) =
2
'ou CdoSendUsingPort : utilisation réseau
.Item
(
"http://schemas.microsoft.com/cdo/configuration/smtpserver"
) =
"smtp.free.fr"
'nom ou IP du serveur SMTP
.Item
(
"http://schemas.microsoft.com/cdo/configuration/smtpserverport"
) =
"25"
'port utilisé
.Update
End
With
Il en existe d'autres :
VI-A-3-a. Serveur SMTP▲
Ce paramètre va vous permettre de déterminer si vous utilisez un serveur externe ou interne. Deux valeurs sont possibles :
SendUsing | Constante | Commentaire |
---|---|---|
1 | CdoSendUsingPickup | Serveur interne |
2 | CdoSendUsingPort | Serveur externe |
Dans le premier cas, il faudra indiquer l'emplacement du fichier de configuration.
.Item
(
"http://schemas.microsoft.com/cdo/configuration/sendusing"
) =
1
.Item
(
"http://schemas.microsoft.com/cdo/configuration/smtpserverpickupdirectory"
) =
"c:\inetpub\mailroot\pickup"
Sinon :
.Item
(
"http://schemas.microsoft.com/cdo/configuration/sendusing"
) =
2
C'est sur ce critère que nous étudierons les paramètres suivants.
VI-A-3-b. Port utilisé▲
En prolongement du paramètre précédent, il est bon de préciser le numéro de port.
Par défaut, c'est le port 25.
.Item
(
"http://schemas.microsoft.com/cdo/configuration/smtpserverport"
) =
25
VI-A-3-c. Délai de connexion▲
.Item
(
"http://schemas.microsoft.com/Cdo/configuration/smtpconnectiontimeout"
) =
10
Ce paramètre va vous permettre de fixer en secondes la durée maximum pendant laquelle la procédure va essayer de se connecter au serveur.
VI-A-3-d. Authentification demandée▲
Ce paramètre vous permet de définir si votre connexion nécessite une authentification ou non.
Trois valeurs peuvent être données :
smtpauthenticate | Constante | Commentaire |
---|---|---|
0 | CdoAnonymous | Pas d'authentification |
1 | CdoBasic | Authentification de base demandée |
2 | CdoNTLM | Authentification par le processus actuel de sécurité |
.Item
(
"http://schemas.microsoft.com/Cdo/configuration/smtpauthenticate"
) =
0
VI-A-3-e. Identification▲
.Item
(
"http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"
) =
1
.Item
(
"http://schemas.microsoft.com/cdo/configuration/sendusername"
) =
"UserName"
.Item
(
"http://schemas.microsoft.com/cdo/configuration/sendpassword"
) =
"PassWord"
Ces deux paramètres sont à utiliser en cas d'authentification demandée ("smtpauthenticate" = CDOBasic).
Si "smtpauthenticate" = Cdoanonymous, vous pouvez ne pas utiliser ces paramètres ou mettre la valeur à blanc.
.Item
(
"http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"
) =
0
.Item
(
"http://schemas.microsoft.com/cdo/configuration/sendusername"
) =
""
.Item
(
"http://schemas.microsoft.com/cdo/configuration/sendpassword"
) =
""
VI-A-3-f. Connexion SSL▲
Dans certains cas une sécurité SSL (Secure Sockets Layer) peut être utilisée.
Les informations entre votre ordinateur et le serveur sont chiffrées et passent dans un tunnel SSL.
smtpusessl | Commentaire |
---|---|
True | Utilisation SSL |
False | Pas d'utilisation SSL (par défaut) |
.Item
(
"http://schemas.microsoft.com/cdo/configuration/smtpusessl"
) =
True
VI-A-4. Variante en utilisant la messagerie du PC▲
Nous avons choisi jusqu'à présent d'envoyer directement le message.
Nous aurions pu éventuellement le faire en envoyant les données dans le logiciel de messagerie par défaut de votre PC.
Le paramétrage du serveur SMTP externe deviendrait donc inutile.
Option
Compare Database
Option
Explicit
Private
Sub
envoiCdo
(
)
On
Error
GoTo
Error_send
Dim
oCdo As
Object
Dim
strHtml As
String
'variable contenu du corps de message
' Définit le contenu du message au format HTML
strHtml =
"<HTML><HEAD><BODY>"
strHtml =
strHtml &
"<b> Ceci est un message de test au format <i><Font Color=#ff0000 > HTML </Font></i></b>"
strHtml =
strHtml &
"</BODY></HEAD></HTML>"
Set
oCdo =
CreateObject
(
"CDO.Message"
)
With
oCdo
.Subject
=
"envoi exemple "
' objet du message
.From
=
"expediteur@free.fr"
' adresse de l'expéditeur
.To
=
"destinataire@free.fr"
' adresse du destinataire
.HtmlBody
=
strHtml ' corps du message HTML
.Send
End
With
Fin
:
Set
oCdo =
Nothing
Exit
Sub
Error_send
:
MsgBox
"Erreur d'envoi "
&
Err
.Number
&
" "
&
Err
.Description
Resume
Fin
End
Sub
Malheureusement souvent une erreur est levée :
Il va donc falloir gérer cette erreur pour que si elle intervient, on puisse donner la possibilité de passer par le serveur SMTP.
Option
Compare Database
Option
Explicit
Private
Sub
envoiCdo
(
)
On
Error
GoTo
Error_send
Dim
oCdo As
Object
Dim
strHtml As
String
'variable contenu du corps de message
' Définit le contenu du message au format HTML
strHtml =
"<HTML><HEAD><BODY>"
strHtml =
strHtml &
"<center><b> Ceci est un message de test au format <i><Font Color=#ff0000 > HTML. </Font></i></b></center>"
strHtml =
strHtml &
"</br>Veuillez prendre connaissance de la pièce jointe."
strHtml =
strHtml &
"</BODY></HEAD></HTML>"
Set
oCdo =
CreateObject
(
"CDO.Message"
)
With
oCdo
GoTo
Envoi
ConfigSmtp
:
With
.Configuration.Fields
.Item
(
"http://schemas.microsoft.com/cdo/configuration/sendusing"
) =
2
'ou CdoSendUsingPort : utilisation réseau
.Item
(
"http://schemas.microsoft.com/cdo/configuration/smtpserver"
) =
"smtp.free.fr"
'nom ou IP du serveur SMTP
.Item
(
"http://schemas.microsoft.com/cdo/configuration/smtpserverport"
) =
"25"
'port utilisé
.Update
End
With
Envoi
:
.Subject
=
"envoi exemple"
' objet du message
.From
=
"expediteur@free.fr"
' adresse de l'expéditeur
.To
=
"destinataire@free.fr"
' adresse du destinataire
.HtmlBody
=
strHtml ' corps du message HTML
.MDNrequested
=
True
.Send
End
With
Fin
:
Set
oCdo =
Nothing
Exit
Sub
Error_send
:
If
Err
.Number
=
-
2147220960
Then
Select
Case
MsgBox
(
"Une erreur est survenue lors du transfert sur votre messagerie."
_
&
vbCrLf
&
"Voulez-vous envoyer votre message directement ?"
_
, vbOKCancel
Or
vbExclamation
Or
vbDefaultButton1
, "Erreur"
)
Case
vbOK
' Si réponse OK : on passe sur la configuration SMTP.
GoTo
ConfigSmtp
Case
vbCancel
' Si réponse Non : on abandonne.
GoTo
Fin
End
Select
Else
MsgBox
"Erreur d'envoi "
&
Err
.Number
&
" "
&
Err
.Description
Resume
Fin
End
If
End
Sub
VI-A-5. Insertion de données▲
Il peut être intéressant également d'envoyer le résultat de requêtes directement dans le corps du message.
Imaginons dans notre application que nous voulions envoyer le résultat de notre historique d'envois.
En début de code nous ajouterons les lignes nécessaires pour récupérer les données que nous exploiterons :
Option
Compare Database
Option
Explicit
Private
Sub
envoiCdo
(
)
On
Error
GoTo
Error_send
Dim
oDb As
DAO.Database
Dim
oRst As
DAO.Recordset
Dim
strSql As
String
Dim
oCdo As
Object
Dim
strHtml As
String
' variable contenu du corps de message
Dim
strLettre As
String
' variable nom lettre
Dim
dateEnvoi As
Date
' variable date d'envoi
Dim
strResultat As
String
' variable résultat envoi
Dim
strAbonnes As
String
' variable liste de diffusion
Dim
strSynthese As
String
' variable récapitulative des résultats.
' Établit la requête
StrSql =
"SELECT tblHistorique.DateEnvoi, tblHistorique.ListeAbonnes, "
&
_
"tblMessages.NomMessage, tblHistorique.Resultat "
&
_
"FROM tblHistorique "
&
_
"INNER JOIN tblMessages ON tblHistorique.IdMessage = tblMessages.IdMessage "
&
_
"ORDER BY tblHistorique.IdEnvoi DESC;"
Set
oDb =
CurrentDb
Set
oRst =
oDb.OpenRecordset
(
StrSql, dbOpenSnapshot)
strSynthese =
""
'Crée la boucle qui va déterminer les résultats
While
Not
oRst.EOF
strLettre =
Nz
(
oRst.Fields
(
2
))
dateEnvoi =
Nz
(
Format
(
oRst.Fields
(
0
), "dd/mm/yy"
))
strResultat =
Nz
(
oRst.Fields
(
3
))
strAbonnes =
Nz
(
oRst.Fields
(
1
))
'Crée la chaîne de résultats
strSynthese =
strSynthese _
&
"- Le "
&
dateEnvoi &
": "
&
strLettre &
" à "
&
strAbonnes &
" "
&
strResultat &
"</br>"
oRst.MoveNext
Wend
'Ferme la connexion et libère les variables
If
Not
oRst Is
Nothing
Then
oRst.Close
If
Not
oDb Is
Nothing
Then
oDb.Close
Set
oDb =
Nothing
Set
oRst =
Nothing
'Définit le contenu du message au format HTML en récupérant le résultat défini auparavant
strHtml =
"<HTML><HEAD><BODY>"
strHtml =
strHtml &
"<center><b> Ceci est un message de test au format <i><Font Color=#ff0000 > HTML. </Font></i></b></center>"
strHtml =
strHtml &
"</br><b>Veuillez prendre connaissance des résultats suivants : </b>"
strHtml =
strHtml &
"<p><left>"
&
strSynthese
strHtml =
strHtml &
"</p></BODY></HEAD></HTML>"
Set
oCdo =
CreateObject
(
"CDO.Message"
)
With
oCdo
With
.Configuration.Fields
.Item
(
"http://schemas.microsoft.com/cdo/configuration/sendusing"
) =
2
'ou CdoSendUsingPort : utilisation réseau
.Item
(
"http://schemas.microsoft.com/cdo/configuration/smtpserver"
) =
"smtp.free.fr"
'nom ou IP du serveur SMTP
.Item
(
"http://schemas.microsoft.com/cdo/configuration/smtpserverport"
) =
"25"
'port utilisé
.Update
End
With
.Subject
=
"envoi exemple de données"
' objet du message
.From
=
"expediteur@free.fr"
' adresse de l'expéditeur
.To
=
"destinataire@free.fr"
' adresse du destinataire
.HtmlBody
=
strHtml ' corps du message HTML
.Send
End
With
Fin
:
Set
oCdo =
Nothing
Exit
Sub
Error_send
:
MsgBox
"Erreur d'envoi "
&
Err
.Number
&
" "
&
Err
.Description
Resume
Fin
End
Sub
Le message reçu par le destinataire contient bien les données.
VI-A-6. Attributions de variables aux paramètres▲
Dans les exemples ci-dessus, tous les paramètres d'envoi ou les paramétrages de connexion sont attribués en "dur". Dans la grande majorité des cas, ils feront appel à des données variables provenant de tables ou formulaires.
Pour voir comment traiter cela, je vous invite à accéder au code de l'application jointe. (Alt + F11).
VII. Liens▲
VII-A. Liens se référant au courrier▲
Vous pouvez prendre connaissance des tutoriels suivants qui abordent également le sujet.
Publipostage avec Access de Olivier Lebeau.
Modèles et papiers à lettres dans Outlook de Morgan BILLY.
VII-B. Liens se référant aux interactions avec internet▲
Ces tutoriels traitent également du développement VBA avec Internet.
Interaction avec internet via VBA Excel de Qwazerty.
VBA et développement Web de Arkham46.
VIII. Conclusion▲
Avec la combinaison de l'application et de la synthèse associée, vous devriez pouvoir mettre en œuvre dans vos propres développements, le code nécessaire à vos besoins d'envoi avec CDO.
Il ne faut pas hésiter à faire des tests en faisant un envoi sur une ou plusieurs adresses auxquelles vous pouvez accéder.
IX. Remerciements▲
Un grand merci à toute l'équipe de Dvp et plus particulièrement :
pour leurs remarques et conseils avisés :
. Argyronet,
. Arkham46,
. Pierre Fauconnier ;
pour ses corrections orthographiques et syntaxiques :
. Claude Leloup.