ESP32 : Contrôle pièce jointe bien attachée avant envoi

Bonjour à tous,

Il n' y a que 6 mois que je me suis mis à programmer un ESP32 pour un routeur solaire.
Tous les jours, je crée un fichier csv dans la mémoire flash et à minuit je m'envoi un email avec en pièce jointe mon fichier csv, dés que c'est fait, je supprime le fichier et crée dans la foulé un nouveau avec les entêtes de colonne.
J'ai testé de supprimer le fichier et de faire l'envoi, celui-ci se fait mais sans pièce jointe puisqu'elle n'existe pas.
Le problème c'est que la librairie contrôle les connections, les envoies mais pas si il y a une erreur au moment d'ajouter une pièce jointe.
Je m'aimerais avoir deux bits, un pour le contrôle que la pièce jointe à bien été chargée et un second bit qui confirme que l'email à bien été envoyé pour être sur que la connexion, l'email avec sa pièce jointe soit bien parti.
J'utilise le code ci-dessous.
Il me manque juste la validation pour la pièce jointe et l'email bien envoyé pour bloquer la suppresion du fichier csv dans mon code après l'appel de cette fonction void send email():

void send_email() {
  ESP_Mail_Session session;
  char contenu_message[50]; // ici ajusté à 100 caractères maximum
  SMTP_Message message;

  session.server.host_name = SMTP_HOST;
  session.server.port = SMTP_PORT;
  session.login.email = AUTHOR_EMAIL;
  session.login.password = AUTHOR_PASSWORD;

  message.sender.name = "ESP32";
  message.sender.email = AUTHOR_EMAIL;
  message.subject = EMAIL_TITLE;
  message.addRecipient(RECIPIENT_NAME, RECIPIENT_EMAIL);

  sprintf(contenu_message, "Total produit : %d w", puissanceTotJournee);
  message.text.content = contenu_message;

 
  // Envoi message
  message.priority = esp_mail_smtp_priority::esp_mail_smtp_priority_normal;
  message.response.notify = esp_mail_smtp_notify_success | esp_mail_smtp_notify_failure | esp_mail_smtp_notify_delay;

 /* The attachment data item */
  SMTP_Attachment att;

  // Set the attachment info e.g. 
  // file name, MIME type, file path, file storage type,
  // transfer encoding and content encoding
  
  message.resetAttachItem(att);
  att.descr.filename = "document.csv";
  att.descr.mime = "text/plain";
  att.file.path = "/document.csv";
  att.file.storage_type = esp_mail_file_storage_type_flash;
  att.descr.transfer_encoding = Content_Transfer_Encoding::enc_base64;

  /* Add attachment to the message */
  message.addAttachment(att);

  if (!smtp.connect(&session))   // connexion au serveur SMTP
    return;

  if (!MailClient.sendMail(&smtp, &message))   // envoi du email
    Serial.println("Erreur lors de l'envoi du email, " + smtp.errorReason());
}

// Affichage d'infos dans le moniteur série pendant l'envoi du email
void smtpCallback(SMTP_Status status) {
  Serial.println(status.info());
}

Je me doute que la solution ne doit pas être loin mais en fouillant sur https://github.com/mobizt/ESP-Mail-Client je n'y suis pas arrivé :thinking:
Merci de m'aider à résoudre mon problème.
:hugs:

Il suffit de tester l'existence du fichier avant de faire l'attachement.
Voir, par exemple, la fonction existed() dans ESP-Mail-Client/src/extras/MB_FS.h

Le problème n'est pas de tester si il existe dans mon cas mais d'être sur qu'il est ajouter.
C'était juste pour vérifier le comportement de la fonction que j'avais manuellement supprimer est constater qu'il n'y avais pas de vérification de la pièce jointe.
Du coup, comme l'email est bien envoyé, je supprime le fichier pour recommencer une nouvelle journée mais dans ce cas je pars les données de 24h...

Pourquoi ne serait-il pas ajouté si il existe?

As-tu déjà constaté qu'un fichier existant n'a pas été envoyé?

Non, mais c'est hors sujet !
Je pensais qu'il n'y aurait jamais de soucie.
Hors, cette situation est arrivé.
Ma routine a tenter ou a envoyer l'email que je n'ai pas reçu et a planté l'esp.
Le lendemain comme j'avais pas recus le mail,j'ai vus que l'esp été planté, après un reset, j'ai un bouton pour envoyer l'email, ce qu'il a fait, je t'attendais a avoir mon fichier avec les données de la veille.
He bien non, pour l'esp, l'email a bien été envoyé et a donc supprimé le fichier csv puis planté avant la creation du nouveau.

Le fonctionnement du sktech est simple :

  • Toutes les minutes il enregistre les données dans le csv
  • A 23h59 il envoi le fichier et le supprime.
  • A 0h00 il crée new csv

Si par hasard le fichier n'est pas créé, ce n'est pas un souci, puisque tout les minutes lors de l'ajout, il vérifie si le fichier existe, si pas le crée.

Je veux juste éviter de perdre une journée de données dans le cas ou la pièce jointe n'est pas confirmé chargé a 100% et ensuite si l'email n'est pas validé envoyé.

Et dans le cas qui ne m'est jamais arrivé mais provoqué manuellement, si il n'est pas envoyé et donc pas supprimé, ma routine continu a la suite du csv tout simplement, donc un fichier pour deux jours.

Donc oui je suis quasi sur que le fichier existe donc pas besoin de faire cette vérif.

:slightly_smiling_face:

Quasi sur n'est pas égal à sûr.

Que te dit la boule de cristal ?
Que coute de faire une vérification simple comme celle qui t'a été proposée ?

Un développeur ne croit que ce qu'il voit, il ne se base pas sur des suppositions..

Comme dit, je vérifie déjà 1440 fois sur la journée qu'il existe, je peux le faire une 1441 ème fois. :rofl:
Mais je préfère vérifier qu'il a bien été transféré, si pas le cas, il est possible qu'il n'existe pas, donc d'une pierre deux coup...
A partir du moment où on utilise une librairie, je ne dirais jamais sûr à 100% mise à part si je passe mon temps à décortiquer cette librairie mais c'est pas le but.
Et c'est bien parce je ne fais pas 100% confiance que je me mets des sécurité à gauche et à droite, ce que je fais sur I²C (qui est aussi une librairie) je contrôle si j'ai des erreur de bus sur la journée.
:grin:

Il peut exister tout en n'étant pas à l'endroit indiqué.
Mais bon tu, fais comme tu veux.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.