Extraire et envoyer des pièces jointes avec Talend et Gmail

Partons d’un scénario simple pour illustrer l’extraction et l’envoi de pièce jointe par Talend Studio :

  • Récupérer les données d’un serveur mail POP ou IMAP
  • Extraire les pièces jointes de chaque mail
  • Renvoyer chaque pièce jointe au même destinataire par un relai SMTP

 

L’objectif est d’avoir un job design de base auquel il est facile de rajouter des étapes de transformation de données (comme un simple tmap sur chaque pièce jointe). Pour pouvoir proposer un job Talend de transformation de fichier par envoi de mail.

Prérequis

 

Il nous faut donc un serveur mail entrant POP (ou IMAP) et sortant SMTP, ça tombe bien si vous avez un compte Gmail tout est à votre disposition moyennant quelques manipulations très bien détaillées Lire les messages Gmail dans d’autres clients de messagerie« >ici. Il se peut que vous ayez besoin de Autoriser les applications moins sécurisées« >coAutoriser les applications moins sécurisées« >nfigurer aussi les paramètres de votre compte pour qu’il accepte que talend puisse lire vos email. 

Dans cet exemple on utilisera un dossier dédié à ce job. Enfin vous avez bien sur besoin de Talend Studio (Open ou Entreprise) dans une version 6 et plus (ici 6.4).[

Les sous-jobs et composants

Premier sous-job : Récupération et extraction des pièces jointes

  • Ajouter un composant tPOP, un tFileInputMail, un tFileDelete et un tSetGlobalVar.
  • Relier le tPOP au tFileInputMail par un lien Row Iterate.
  • Relier le tFileInputMail au tSetGlobalVar par un lien Row Main.
  • Relier enfin le tFileInputMail au tFileDelete par un lien Trigger OnCOmponentOk.

 

Pour chaque mail (lien Iterate) récupéré sur le serveur mail on utilise le composant tFileInputMail pour extraire les pièces jointes dans le même dossier. On supprime ensuite le fichier mail (tFileDelete) et on sauvegarde en variable globale le nom de l’expéditeur et le sujet du mail (pour pouvoir lui renvoyer correctement). 

Deuxième sous-job : renvoi des pièces jointes

 
  •  Ajouter maintenant un composant tFileList, tSendMail et tFileDelete.
  • Relier le tFileList au tSendMail par un lien Row Iterate.
  • Relier le tSendMail au tFileDelete par un lien Trigger OnComponentOk.

 

Le deuxième sous-job va donc pour chaque fichier listé dans le dossier de notre choix (celui ou l’on va extraire nos pièces jointes dans notre cas) envoyer un mail avec ce fichier en pièce jointe avant de le supprimer.

On relie enfin le premier sous-job au second en liant le tSetGlobalVar au tFileList par un lien Trigger OnComponentOk.

Le tout en image :

Il y a en plus 2 composants tWarn pour le log des erreurs. 

Configurer les composants du sous-job d’extraction

 

tPOP

 

Le répertoire de sortie doit être un dossier qui existe sur votre espace de travail. Si vous utilisez gmail l’utilisateur et le mot de passe sont vos identifiants google (remplacer context.mailServer par « votremail@gmail.com » ). La case « Utiliser le protocole de sécurisation des messages » est obligatoire. Vous pouvez choisir de cocher la case « Supprimer les email du serveur » et les emails traités par le job n’apparaitront pas dans votre boîte de réception. Malheureusement cette dernière option n’est pas disponible sur gmail avec le protocole POP, il faut passer par le protocole Imap.

Vous pouvez configurer dans Advanced Settings des filtres sur la récupération d’email. Pour que le job ne s’effectue que sur les email d’un certain expéditeur par exemple. 

tFileInputMail

 

Les parties de l’email sont optionnelles pour la plupart, seul FROM, CC et SUBJECT seront utilisés dans la suite. Le schéma du composant dépend des parties de l’email que vous souhaitez utilisées :

6 colonnes STRING : TO, FROM, SUBJECT, CC, BODY, Received.

On utilise la variable tPOP_1_CURRENT_FILEPATH pour le Nom de fichier, elle correspond au nom du fichier courant ainsi que son chemin d’accès (du lien Iterate tPOP).

tSetGlobalVar

 

Le lien Row Main entre tFileInputMail et tSetGlobalVar a été renommé en mail_input dans l’exemple.

tDeleteFile

On supprime le fichier mail si l’extraction s’est bien passé.

Nom de fichier : ((String)globalMap.get(« tPOP_1_CURRENT_FILEPATH »))[/vc_column_text][vc_empty_space height= »10px »][vc_column_text]

Configurer les composants du sous-job d’envoi

 

tFileList

Modifiez le répertoire pour qu’il corresponde au répertoire ou vous avez extrait les pièces jointes dans le premier sous-job (tFileInputMail). Dans mon cas il s’agit toujours du répertoire « C:/Users/Tom/workspace/mails_process ».

tSendMail

 

On utilise les variables définies par le tSetGlobalVar pour ce composant. La pièce jointe correspond donc au fichier courant du tFileList. Vous pouvez optionnellement cocher la case « Afficher le nom de l’expéditeur » et modifier « somewhat@somewhere.com » en y mettant le nom de votre choix.

Pour la configuration des paramètre SMTP, à remplir selon votre server.

Pour google :

 

tDeleteFile

On supprime le fichier pièce jointe si l’envoi s’est bien passé.

Nom de fichier : ((String)globalMap.get(« tFileList_3_CURRENT_FILEPATH »))[/vc_column_text][vc_empty_space height= »10px »][vc_column_text]

Pour aller plus loin

 Ici on utilise le même dossier pour récupérer l’email et les pièces jointes. Il est possible et plus courant d’utiliser deux dossiers différents. On peut aussi intercaler entre les deux sous-job un ou plusieurs jobs de transformation et envoyer les fichiers de sorties de ce nouveau sous-job.

Important : Dans ce cas le lien entre le composant de départ de ce sous-job et le sous-job d’envoi doit être un lien Trigger OnSubJobOk.

Exemple avec un simple tmap et tFileOutputDelimited : 

Le tFileOutputDelimited enregistre les fichiers transformés dans un nouveau répertoire qui est le répertoire d’entrée dans la configuration du tFileList_3. Un mail d’erreur est aussi envoyé si une erreur a lieu à la lecture du fichier.

Si vous êtes intéressé par les bonnes pratiques de design de job talend je vous conseille grandement les excellents articles de Dave Anderson :

Tom

1 Comment

Sorry, the comment form is closed at this time.

fr_FRFrançais