Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2729 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  [Résolu] MIME::Lite Fichier Excel corrompu lors de l'envoi par mail

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Résolu] MIME::Lite Fichier Excel corrompu lors de l'envoi par mail

n°2108790
Sethenssen
Posté le 30-10-2011 à 17:38:02  profilanswer
 

Bonjour,
 
J'ai un problème où je ne comprends pas du tout la logique de l'erreur.
Je pars d'un fichier .csv déjà crée, où j'ai juste besoin de le convertir en fichier Excel puis de l'envoyer par email.
 
Hors, le fichier Excel arrive avec une taille de 300Byte au lieu de faire 6Ko
Impossible de l'ouvrir via l'email, il est corrompu.
Alors qu'une fois le script terminé, même si le fichier Excel par mail arrive vide, sur mon PC le fichier Excel est bien là, converti comme il se doit et fonctionne.
 
Si j'envoi le fichier .csv ça passe sans problème et l'Excel non.
De même, si j'envoi ce même fichier Excel dans un second script, cela fonctionne (car le second script n'est pas à l'origine de la création de ce fichier Excel, il ne fait que l'envoyer)
 
Moi je ne veux pas passer par 2 scripts pour faire ce que je veux, je veux tout faire dans un seul.
 
Donc que j'envoi ce fichier Excel fraîchement converti sur un serveur ou par mail, il est vide.
Pourquoi?
 
J'ai même tenté de faire un sleep de 60s juste avant de faire le mail, histoire de mettre une tempo me disant qu'il n'avait sans doute pas eu le temps de créer le fichier Excel, et bien non même résultat.
 
Je ne comprends pas du tout.
 
Voici le script ci-dessous
 
Merci de votre aide
 

Code :
  1. #!/usr/bin/perl -w
  2. use warnings;
  3. use strict;
  4.  
  5. use MIME::Lite;
  6. use Net::Ping;
  7. use File::Copy;
  8. use File::Find;
  9. use Encode;
  10. use POSIX qw/strftime/;
  11. use Carp;
  12. use Spreadsheet::WriteExcel;    #module pour creer des fichiers excel
  13.  
  14. # email
  15. my $To = 'toto@numericable.fr';
  16. my $From = 'toto@gmail.com';
  17. my $Cc = '';
  18. my $Bcc = '';
  19. my $Subject = "TEST";
  20. my $DIR="/home/Toto/";
  21.  
  22. my $separateur;            #le separateur
  23. my $fichier_a_transformer = "TOP10_SEMAINE42.csv";
  24.  
  25. my $fichier_excel = $fichier_a_transformer;
  26. #si c'est un fichier csv
  27. if ($fichier_a_transformer =~ /\.csv$/i) {
  28.  $fichier_excel =~ s/(.+)\.csv$/$1\.xls/gi;
  29.  $separateur = ";";        #le separateur est un point vigule
  30. }
  31.  
  32. # Creer une page excel ayant pour le même nom que le fichier txt
  33. my $workbook = Spreadsheet::WriteExcel->new($fichier_excel) || die "impossible de creer $fichier_excel ou fichier ouvert";
  34.  
  35. # nom de la feuille
  36. my $worksheet = $workbook->add_worksheet("TOP10_SEMAINE" );
  37.  
  38. my %font = (
  39.                 font  => 'Calibri',
  40.                 size  => 11,
  41.                 color => 'black',
  42.                 bold  => 0,
  43.              );
  44. my $gris = $workbook->set_custom_color(40, 216, 216, 216);  
  45. my %shading = (
  46.                bg_color => $gris,
  47.                pattern  => 1,
  48.              );
  49.  
  50. #  Definition d'un format d'ecriture
  51. my $format = $workbook->add_format(%font);  #creation du format
  52. $format->set_align('left');    #caracteres centres
  53.  
  54.  
  55. my $format2 = $workbook->add_format(%font, %shading);  #creation du format
  56. $format2->set_align('left');    #caracteres centres
  57. $format2->set_bold();    #caracteres centres
  58.  
  59. # recuperer les donnees du fichier txt et mise dans le fichier excel
  60. my $colonne_excel = 0;
  61. my $ligne_excel = 0;
  62. my $ligne;
  63. my @tab_ligne;
  64. my $last_case;
  65.  
  66. open (FILE, "$fichier_a_transformer" ) || die ("impossible de d'ouvrir $fichier_a_transformer $!" );
  67. while ($ligne = <FILE> ) {
  68.  chomp($ligne);            #suppression des retour à la ligne
  69.  @tab_ligne = split ($separateur, $ligne);
  70.  $last_case = $#tab_ligne;        #dernier index du tableau
  71.  for ($colonne_excel = 0; $colonne_excel<= $last_case; $colonne_excel++) {
  72.      #remplissage du fichier excel
  73.      if ($ligne_excel == 0) {
  74.        $worksheet->write($ligne_excel, $colonne_excel, $tab_ligne[$colonne_excel], $format2);
  75.    }
  76.    else {
  77.        $worksheet->write($ligne_excel, $colonne_excel, $tab_ligne[$colonne_excel], $format);
  78.    }
  79.  }
  80.  $colonne_excel = 0;        #reinitialise la colonne à 0      
  81.  $ligne_excel++;            #on passe a la ligne suivante dans le fichier excel
  82. }
  83. close (FILE);
  84.  
  85. my $CSV_FILE2 = "TOP10_SEMAINE42.xls";
  86.  
  87. sub sub1{
  88.  print "coucou\n";
  89.  #sleep 10;
  90. }
  91.  
  92. sub1;
  93.  
  94. system ("scp -P2000 $fichier_a_transformer toto\@localhost:/home/toto/" );
  95. system ("scp -P2000 $CSV_FILE2 toto\@localhost:/home/toto/" );
  96.  
  97. email($To, $From, $Cc, $Bcc, $Subject);
  98.  
  99.  
  100. # email function
  101. sub email
  102. {
  103.     # get incoming parameters
  104.     my ($To, $From, $Cc, $Bcc, $Subject, $Message) = @_;
  105.     # create a new message
  106.     my $msg = MIME::Lite->new(
  107.  From => $From,
  108.  To => $To,
  109.     Cc => $Cc,
  110.     Bcc => $Bcc,
  111.  Subject => $Subject,
  112.  Data => $Subject
  113.     ) or die "Error creating multipart container: $!\n";
  114.  
  115.     $msg->attr("content-type" => "text/html; charset=iso-8859-1" );
  116.     # add the attachment
  117.         $msg->attach(
  118.         Type => "application/msexcel",
  119.         Path => $DIR.$fichier_excel,
  120.         Filename => $fichier_excel,
  121.         Disposition => "attachment"
  122.         ) or die "Error adding the text message part: $!\n";    
  123.     
  124.     # send the email
  125.     MIME::Lite->send('smtp',
  126.                                     'smtp.numericable.com',
  127.                                     HELLO=>'smtp.numericable.com',
  128.                                     PORT=>'25',
  129.                                     Debug => 0,
  130.                                     Timeout => 60);
  131.     $msg->send();
  132.     print "\n***** $Subject *****\n\n";
  133. }
  134.  
  135. __END__


Message édité par Sethenssen le 30-10-2011 à 21:30:56
mood
Publicité
Posté le 30-10-2011 à 17:38:02  profilanswer
 

n°2108815
gilou
Modérateur
Modzilla
Posté le 30-10-2011 à 20:13:08  profilanswer
 

A tout hasard, fais ton open en mode binaire.
 
open (FILE, "$fichier_a_transformer" ) || die ("impossible de d'ouvrir $fichier_a_transformer $!" );
binmode(FILE);  # ça en plus
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2108817
Sethenssen
Posté le 30-10-2011 à 20:19:33  profilanswer
 

Bonsoir gilou,
 
Je viens d'essayer, hélas sans succès.
Le fichier reste "vide" par mail alors qu'il est bien généré sur le PC.

n°2108825
gilou
Modérateur
Modzilla
Posté le 30-10-2011 à 21:02:15  profilanswer
 

Sans binmode, mais avec un $workbook->close();
avant le close (FILE);
ça change qque chose?
Parce que ça a de bonne chance d'être ce $workbook->close() qui écrit tout dans le fichier.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2108827
gilou
Modérateur
Modzilla
Posté le 30-10-2011 à 21:06:12  profilanswer
 

En fait, c'est même documenté dans la doc du module: http://search.cpan.org/dist/Spread [...] pm#close()
 

Citation :

An explicit close() is required if the file must be closed prior to performing some external action on it such as copying it, reading its size or attaching it to an email.

:whistle:  
 
Dans le code indépendant ou ça marche, c'est parce que à la sortie de perl, on appelle le destructeur de l'objet workbook, et que ce destructeur appelle close. Le fichier est donc généré quand on sort du script.
 
A+,


Message édité par gilou le 30-10-2011 à 21:15:04

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2108829
Sethenssen
Posté le 30-10-2011 à 21:30:32  profilanswer
 

Erf j'ai parcouru cette doc mais ce point m'a échappé  :pt1cable:  
 
C'est corrigé et cela fonctionne !
Merci gilou  :jap:  

n°2108831
Sethenssen
Posté le 30-10-2011 à 21:48:53  profilanswer
 

Dernière p'tite question,
J'ai cherché mais sans succès sur la question de l'autofit.
De ce que j'ai pu lire ce n'est pas possible de le faire avec ce module.
 
Quand j'ouvre le fichier Excel j'ai une colonne naturellement plus grande que la largeur par défaut, je suis obligé de tout sélectionner puis double cliquer sur la largeur d'une colonne pour qu'Excel size automatiquement les largeurs des colonnes à la longeur de mes champs.
 
Gilou,
Je voudrai avoir ton avis d'expert sur ça, est-ce vraiment pas disponible ou penses-tu qu'il existe un moyen?
 
Le but étant de minimiser au max les actions utilisateurs, afin qu'il est le minimum de chose à faire quand il ouvre le fichier Excel.
 
Merci pour tes lumières.


Message édité par Sethenssen le 30-10-2011 à 21:50:30
n°2108834
gilou
Modérateur
Modzilla
Posté le 30-10-2011 à 22:44:04  profilanswer
 

C'est dans la FAQ du module: http://groups.google.com/group/spr [...] b4cde64b93
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  [Résolu] MIME::Lite Fichier Excel corrompu lors de l'envoi par mail

 

Sujets relatifs
Servlet : faire un download d'un fichier zipfonction mail() php
VB pour envoyer par mail plusieurs lignes excelessai
Optimiser une macro de comparaison de feuilles ExcelExclure toute les extensions de fichier sauf une
Lire dans un fichier puis associer une variable à chaque ligne[Php/smtp/phpmailer] Envoi de mail smtp (pb ovh perso)
Plus de sujets relatifs à : [Résolu] MIME::Lite Fichier Excel corrompu lors de l'envoi par mail


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR