> Tech > Messages e-mail en texte clair

Messages e-mail en texte clair

Tech - Par Renaud ROSSET - Publié le 24 juin 2010
email

Les messages de courrier électronique sont des fichiers texte. Bien entendu, si un message e-mail contient des images, du son ou des pièces jointes, ces fichiers doivent être convertis sous une forme qui respecte les règles d’un fichier texte avant d’être envoyés. Ma démonstration est la suivante : j’envoie des

messages e-mail de notification d’expédition aux clients en lisant des fichiers qui contiennent les commandes qui ont été expédiées, je génère des fichiers texte contenant le message e-mail, et j’utilise l’API QtmmSendMail() pour envoyer les messages. Pour utiliser les exemples de programmes que je décris dans cette section, votre serveur SMTP doit être configuré et opérationnel sur l’iSeries.

Chaque message e-mail a deux parties : l’en-tête et le corps. L’en-tête est constitué des lignes de texte, chacune contenant un mot-clé et une valeur : ces deux éléments sont séparés par un signe deux-points. Les mots-clés les plus courants sont From, To, Date et Subject. Une ligne vierge (c’est-à-dire, constituée uniquement de CR et LF) indique qu’on a atteint la fin de l’en-tête. Le reste du document e-mail est le corps : un fichier texte simple contenant le message pour le destinataire.

J’ai créé un programme exemple, IFS3MAIL1, qui informe les clients de l’expédition de leurs commandes. Les fichiers physiques SHPORDERS et SHPDETAIL stockent des informations sur les commandes expédiées. La figure 7 montre la structure de ces fichiers. Une fois par jour, les fichiers sont lus et un message e-mail est généré pour chaque commande trouvée.

La figure 8 contient le programme IFS3MAIL1 qui lit ces fichiers. Dans la ligne principale, je lis simplement le contenu de la liste des commandes et, pour chaque commande trouvée, je crée un message e-mail dans un fichier texte, en appelant la sous-procédure CreateMsg(), puis j’envoie ce fichier texte en appelant la sous-procédure SendMsg() (A en figure 8).

J’utilise l’API QtmmSendMail() pour envoyer les messages à ma place. En effet, elle est incluse dans l’OS/400 et relativement simple à utiliser. Cette API a deux exigences : TCP/IP Connectivity Utilities (5722-TC1) doit être installé et le serveur SMTP OS/400 doit être configuré. Cette API requiert trois paramètres différents : un fichier texte ASCII en CCSID (Coded Character Set Identifier) 367, une adresse e-mail d’envoi dans CSSID 500, et une adresse e-mail du destinataire en CCSID 500. Cette API entre alors en action : elle crée un job d’arrière plan dont la mission est de charger mon fichier stream dans la file d’attente des messages e-mail, et elle supprime le fichier quand il ne lui est plus nécessaire.

La sous-procédure CreateMsg() entame ce processus en créant un nouveau fichier stream avec un nom unique. Pour créer un nom unique, j’ai passé le flag open O_EXCL à l’API open() (B en figure 8). O_EXCL signifie « créer exclusivement ». Autrement dit, si le fichier existe déjà, l’API open() échoue. L’API n’ouvre le fichier que s’il peut être créé comme un nouveau. Ainsi, je peux ajouter un numéro au nom du fichier et appeler open() dans une boucle jusqu’à ce qu’elle soit capable de créer un fichier avec un nom unique. Pour être certain que l’erreur file already exists est la seule qui laisse mon programme effectuer ces boucles, je vérifie la valeur de errno chaque fois que open() échoue. L’exécution des boucles ne continue que si l’erreur EEXISTS entraîne l’échec de l’API.

Ensuite, CreateMsg() écrit l’en-tête du message e-mail. Pour finir, elle écrit le corps du message et ferme le fichier. On peut voir un fichier texte fini dans la figure 9.

IBM fournit l’API iconv() pour convertir des données d’un CCSID en un autre. iconv() n’est pas nécessaire pour écrire un fichier texte parce que l’API open() peut assurer la conversion à votre place. Cependant, si l’on en croit la documentation, les adresses e-mail doivent être en CCSID 500 quand on appelle l’API QtmmSendMail(). C’est la première chose faite dans la sous-procédure SendMsg(). Ensuite, SendMsg() crée une structure de données pour l’adresse e-mail du destinataire, comme QtmmSendMail le demande. A noter que cette structure de données est un tableau ! Comme un message e-mail peut avoir plusieurs destinataires, il sera relativement facile d’ajouter d’autres éléments à ce tableau, un pour chaque destinataire. Enfin, SendMail() appelle l’API QtmmSendMail() pour envoyer le message proprement dit.

Les prototypes pour l’API QtmmSendMail() et pour la structure de données ADDTO0100 sont définis dans le membre /COPY appelé SENDMAIL_ H, non représenté ici mais qui est inclus dans le code téléchargeable sur www.itpro.fr Club abonnés.

Téléchargez cette ressource

Comment sécuriser une PME avec l’approche par les risques ?

Comment sécuriser une PME avec l’approche par les risques ?

Disposant de moyens financiers et humains contraints, les PME éprouvent des difficultés à mettre en place une véritable stratégie de cybersécurité. Opérateur de services et d’infrastructures, Naitways leur propose une approche pragmatique de sécurité « by design » en priorisant les risques auxquelles elles sont confrontées.

Tech - Par Renaud ROSSET - Publié le 24 juin 2010