Application et méthode d'envoi de
lettres d'information en CDO

Application Access destinée à l'envoi de lettres d'information (newsletters) en CDO.

16 commentaires Donner une note à l'article (5)

Article lu   fois.

L'auteur

Profil ProSite personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Introduction

Image non disponible


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.

Image non disponible

V-A-2. Paramétrage des tables d'abonnés

Cet onglet va nous permettre de paramétrer les tables d'abonnés :

Image non disponible

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.

Image non disponible

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.

Script PHP
Sélectionnez

<?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.

Image non disponible


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 :

 
Sélectionnez

Select  Id_Abonne, Nom_Abonne, Email, Date_Inscription, Date_Modification, Valide from ListAbonnes1


Ou encore :

 
Sélectionnez

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.

Image non disponible

V-A-3. Tables d'abonnés

V-A-3-a. Saisie classique

Image non disponible


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.

Image non disponible

V-A-3-b. Saisie par import externe.

Image non disponible


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.

Image non disponible

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.

Image non disponible


Pour la mise en forme vous pouvez utiliser les menus appropriés dans le ruban :

Image non disponible


Vous pouvez également vous servir de la barre d'outils flottante :

Image non disponible
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.

Image non disponible


Vous pourrez visualiser la cohérence de cette source dans l'onglet "Aperçu source HTML".

Image non disponible

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".

Image non disponible


Vous devrez répondre à un message de confirmation.

Image non disponible


L'opération d'envoi va se dérouler.
Une barre de progression en bas du formulaire vous indiquera l'avancement.

Image non disponible


Vous serez averti à la fin de l'opération.

Image non disponible


Une ligne sera ajoutée dans l'historique.

Image non disponible


Le destinataire recevra suivant le cas :

Image non disponible

ou bien :

Image non disponible


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 :

Image non disponible


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.

envoi CDO
Sélectionnez

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 :

Image non disponible

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.

envoi CDO
Sélectionnez

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 :

Image non disponible

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).

envoi CDO
Sélectionnez

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
Image non disponible

VI-A-2-d. Envoi avec pièce jointe

Un fichier peut être ajouté en pièce jointe.

envoi CDO
Sélectionnez

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
Image non disponible

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)



envoi CDO
Sélectionnez

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
Image non disponible

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



envoi CDO
Sélectionnez

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 :

Image non disponible

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.

envoi CDO
Sélectionnez

    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.

envoi CDO
Sélectionnez

            .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 1
            .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverpickupdirectory") = "c:\inetpub\mailroot\pickup"               


Sinon :

envoi CDO
Sélectionnez

            .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.


envoi CDO
Sélectionnez

            .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25            

VI-A-3-c. Délai de connexion


envoi CDO
Sélectionnez

            .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é



envoi CDO
Sélectionnez

            .Item("http://schemas.microsoft.com/Cdo/configuration/smtpauthenticate") = 0           

VI-A-3-e. Identification


envoi CDO
Sélectionnez

            .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.

envoi CDO
Sélectionnez

            .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)



envoi CDO
Sélectionnez

            .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.

envoi CDO
Sélectionnez

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 :

Image non disponible


Il va donc falloir gérer cette erreur pour que si elle intervient, on puisse donner la possibilité de passer par le serveur SMTP.

envoi CDO
Sélectionnez

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 :

envoi CDO
Sélectionnez

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 & ":&nbsp; &nbsp;&nbsp;" & strLettre & "&nbsp;&nbsp;à &nbsp;" & strAbonnes & "&nbsp;&nbsp;&nbsp;" & 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.

Image non disponible

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.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Copyright © 2012 Jean-Damien GAYOT. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.