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

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

Marsh Posté le 30-10-2011 à 17:38:02    

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
Reply

Marsh Posté le 30-10-2011 à 17:38:02   

Reply

Marsh Posté le 30-10-2011 à 20:13:08    

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é!  --
Reply

Marsh Posté le 30-10-2011 à 20:19:33    

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.

Reply

Marsh Posté le 30-10-2011 à 21:02:15    

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é!  --
Reply

Marsh Posté le 30-10-2011 à 21:06:12    

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é!  --
Reply

Marsh Posté le 30-10-2011 à 21:30:32    

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

Reply

Marsh Posté le 30-10-2011 à 21:48:53    

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
Reply

Marsh Posté le 30-10-2011 à 22:44:04    

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é!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed