mardi 3 juin 2014

Clipper: Envoi d'email via SMTP - L'entête/header email

En tant que développeur des années 2010-2015, vous avez probablement accès à des bibliothèques, outils ou API vous permettant d'envoyer facilement des email. Ce genre d'outils qui prend en charge tout le travail... mais aussi qui vous éloigne du savoir de base.
Ces outils, c'est magnifique tant que cela fonctionne... mais Quid si vous n'avez qu'une bibliothèque rudimentaire capable de faire un envoi STMP?
Encore une fois, ce seront les connaissances les plus anciennes (et les plus basique) qui seront les plus utiles... à savoir la constitution d'un header/entête d'émail. Vous trouverez d'ailleurs une excellente référence de documentation en fin d'article ;-)

C'est dans les vieilles casseroles que l'on fait les meilleurs soupes
Je trafficote toujours avec Harbour Project (Compilateur Clipper Open-Source).... et je me demandais s'il était possible d'envoyer directement des e-mails depuis notre logiciel de gestion.
Limiter le nombre de couches logiciels et ne pas devoir s'appuyer sur un programme externe est plutôt intéressant dans notre cas... inutile de perdre de longues heures à essayer de comprendre ce qui ne fonctionne pas... il suffit de gratter dans le programme.
SMTP est toujours d'actualité et nous offre les services dont nous avons besoin... pourquoi se compliquer la vie avec MAPI qui n'arrête pas de demander des autorisations à l'utilisateur pour l'email.

Harbour Project - TIPTest
Dans les contributions du compilateur Harbour, vous trouverez le répertoire hbtip pour "HarBour Tools IP".
HBTIP contient par ailleurs un objet TIpClientSmtp() permettant d'envoyer des e-mais directement via un serveur ou un relay SMTP
C'est génial, il est possible d'envoyer un e-mail directement sur le Net depuis un programme écrit en Clipper :-)

Pour résumer les éléments clés de l'envoi d'émail dans TipTest.prg.
J'ai encodé en dur la valeur de cURL dans le programme, juste avant la ligne tURL():New( cURL ), parce que nous avons un petit problème de conversion DOS <-> Windows.

   && Domeu test - TipTest.PRG
   &&   override cUrl because of translation issue between Windows and
   &&   dos around the & character

   &&  smtp://Adresse_Email_Emetteur@serveur_smtp/Adresse_Email_destinataire
   &&  A noter: l'adresse_Email_Emetteur DOIT UTILISER &at; à la place du @!!!
   cUrl := 'smtp://stock&at;mydomain.be@relay.our_provider.be/dominique@customer_domain.be'
   && cFile est le fichier contenant l'mail à envoyer... 

   &&    attention, ce fichier doit contenir le header du mail!
   && C'est là que le site de DAN intervient
   cFile := "+c:\tipmail.txt"
   oUrl := tURL():New( cUrl )


Plus loin dans le code, l'on retrouve l'envoi du contenu du mail

IF oClient:nAccessMode == TIP_WO .OR. ( oClient:nAccessMode == TIP_RW .AND. bWrite )
         oClient:exGauge := { | done, size| ShowGauge( done, size ) }

         IF oClient:WriteFromFile( cFile )
            @7, 5 SAY "Data sucessfully sent"
         ELSE
            @7, 5 SAY "ERROR: Data not sent " + oClient:lastErrorMessage()
         ENDIF
      ELSE

      ...

Le corps du mail
Comme précisé, le corps du mail est un fichier qui doit impérativement contenir le header du mail.
Qui sait encore comment constituer un tel header (il n'aura fallu quelques recherches pour y arriver)

Voici un exemple de corps d'émail avec son header

Return-Path: <noreply@our_domain.be>
From: Stock Program <noreply@our_domainbe>
To: Dominique MachinChose <dominique@customer_domain.be>
Subject: Notification de Changement de Prix - OUR_DOMAIN SPRL
MIME-Version: 1.0
Content-Type: text/plain;
    charset="iso-8859-1"
Cher client,

*** LE CONTENU DE CET EMAIL EST GENERE AUTOMATIQUEMENT ***
*** NE PAS REPONDRE A CE MESSAGE ***

Nous avons le plaisir de vous informer des modifications de prix suivantes:

xxx
xxx
xxx

Cordialement
L'équipe de OUR_DOMAIN SPRL.

En cas de problème, veuillez contacter celui_la@our_domain.be


Comme vous pouvez le constater, il y a un header relativement sommaire... ce dernier était pourtant nécessaire pour le bon acheminement du mail.
Chaque fournisseur de service à ses propres exigences concernant le contenu minimum du header

Résultat du test
Réceptions des messages sur un client mail
Contenu du message
Comment constituer le Header/Entete d'un Mail?
Vous n'imaginez pas combien il est difficile de trouver un bon site de documentation (abordable) à propos des Header de mail. Il y aura forcement les spécifications de notoriété publique mais si ces dernières sont complètes, elles sont souvent impossible à utiliser comme premier document d'apprentissage :-/

Je vous recommande chaudement le site de Dan, une perle dans le domaine