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

  FORUM HardWare.fr
  Programmation
  Perl

  [Résolu] MIME::Lite Comment attacher plusieurs fichiers dans un mail?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Résolu] MIME::Lite Comment attacher plusieurs fichiers dans un mail?

n°2103470
Sethenssen
Posté le 27-09-2011 à 09:33:22  profilanswer
 

Bonjour,
 
Le script ci-dessous fonctionne.
Le but étant d'envoyer un mail avec une pièce jointe.
 
Le soucis que j'ai, est que tant bien même j'essaye d'y inclure un foreach pour envoyer plusieurs fichiers, je n'y arrive pas.
Comment modifier ce script pour envoyer plusieurs fichiers joints?
 
Deuxième chose, je voudrais le faire fonctionner avec le "use strict" mais je n'y arrive pas non plus.
 
Merci d'avance.
 
 

Code :
  1. #!/usr/bin/perl -w
  2. use warnings;
  3. #use strict;
  4. use MIME::Lite;
  5. package Net::SMTP::TLS;
  6. use MIME::Base64;
  7. use Authen::SASL;
  8. use Net::SSL;
  9.  
  10. # set up email
  11. $To = "toto\@hotmail.fr";
  12. $From = "toto\@gmail.com";
  13. $Cc = "titi\@gmail.com";
  14. $Subject = "Test Perl 20";
  15. $Message = "This email was sent by Perl.\nThanks for using.\Regards.\n";
  16. $File = "dbi.pl";
  17.  
  18. my $DIR="/cygdrive/d/_.compil/";
  19. my $SEARCH_FILE = "^127|^ALICE";
  20.  
  21. opendir(DIR, $DIR) or die "Can't open $DIR: $!";
  22. my @attach_files = grep(/$SEARCH_FILE/,readdir(DIR));
  23. closedir(DIR) or warn "Can't close $DIR: $!";
  24.  
  25. foreach (@attach_files)    {
  26.     print $_."\n";
  27. }
  28.  
  29. # send email
  30. email($To, $From, $Cc, $Subject, $Message, $File);
  31.  
  32. # email function
  33. sub email
  34. {
  35.     # get incoming parameters
  36.     local ($To, $From, $Cc, $Subject, $Message, $File) = @_;
  37.     # create a new message
  38.     $msg = MIME::Lite->new(
  39.  From => $From,
  40.  To => $To,
  41.  Cc => $Cc,
  42.  Subject => $Subject,
  43.  Data => $Message
  44.     ) or die "Error creating multipart container: $!\n";
  45.  
  46.     # add the attachment
  47.     $msg->attach(
  48.     Type => "text/plain",
  49.     Path => $File,
  50.     Filename => $File,
  51.     Disposition => "attachment"
  52.     ) or die "Error adding the text message part: $!\n";
  53.  
  54.     # send the email
  55.     MIME::Lite->send('smtp',
  56.                                     'smtp.numericable.com',
  57.                                     HELLO=>'smtp.numericable.com',
  58.                                     PORT=>'25',
  59.                                     Debug => 0,
  60.                                     Timeout => 60);
  61.     $msg->send();
  62.     print Mail: $Subject : OK\n";
  63. }
  64. __END__


Message édité par Sethenssen le 27-09-2011 à 23:06:53
mood
Publicité
Posté le 27-09-2011 à 09:33:22  profilanswer
 

n°2103498
gilou
Modérateur
Modzilla
Posté le 27-09-2011 à 11:12:17  profilanswer
 

Pour que use strict passe, il faut déclarer les variables comme locales avec my

Code :
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5.  
  6. use MIME::Lite;
  7. package Net::SMTP::TLS;
  8. use MIME::Base64;
  9. use Authen::SASL;
  10. use Net::SSL;
  11. # set up email
  12. my $To = 'toto@hotmail.fr';
  13. my $From = 'toto@gmail.com';
  14. my $Cc = 'titi@gmail.com';
  15. my $Subject = "Test Perl 20";
  16. my $Message = "This email was sent by Perl.\nThanks for using.\nRegards.\n";
  17. my $File = "dbi.pl";
  18. my $DIR="/cygdrive/d/_.compil/";
  19. my $SEARCH_FILE = "^127|^ALICE";
  20.  
  21. opendir(DIR, $DIR) or die "Can't open $DIR: $!";
  22. my @attach_files = grep(/$SEARCH_FILE/, readdir(DIR));
  23. closedir(DIR) or warn "Can't close $DIR: $!";
  24. foreach (@attach_files)    {
  25.  print $_."\n";
  26. }
  27. # send email
  28. email($To, $From, $Cc, $Subject, $Message, $File);
  29.  
  30. # email function
  31. sub email {
  32. # get incoming parameters
  33. local ($To, $From, $Cc, $Subject, $Message, $File) = @_;
  34. # create a new message
  35. my $msg = MIME::Lite->new(From => $From,
  36.                To => $To,
  37.                Cc => $Cc,
  38.                Subject => $Subject,
  39.                Data => $Message
  40.               ) or die "Error creating multipart container: $!\n";
  41. # add the attachment
  42. $msg->attach(Type => "text/plain",
  43.          Path => $File,
  44.          Filename => $File,
  45.          Disposition => "attachment"
  46.         ) or die "Error adding the text message part: $!\n";
  47. # send the email
  48. MIME::Lite->send('smtp',
  49.          'smtp.numericable.com',
  50.          HELLO=>'smtp.numericable.com',
  51.          PORT=>'25',
  52.          Debug => 0,
  53.          Timeout => 60);
  54. $msg->send();
  55. print "Mail: $Subject : OK\n";
  56. }
  57. __END__


 
Pour les attachements multiples, ça devrait marcher, mais il faut sans doute ajouter
Type => 'multipart/mixed'
dans ton appel à MIME::Lite->new
 
A+,


Message édité par gilou le 27-09-2011 à 11:41:48

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2103516
Sethenssen
Posté le 27-09-2011 à 11:47:09  profilanswer
 

Bonjour Gilou,
 
En déclarant les variables en locale avec my j'ai maintenant cette erreur qui apparaît:

Code :
  1. Can't localize lexical variable $To at ./test.pl line 34.


 
Quand j'ajoute : Type => 'multipart/mixed'  
Les mails envoyés ne contiennent plus le corps de ma variable $Message
J'ai toujours un fichier joint mais je n'arrive pas à en envoyer plusieurs.

n°2103528
gilou
Modérateur
Modzilla
Posté le 27-09-2011 à 12:44:15  profilanswer
 

Citation :

En déclarant les variables en locale avec my j'ai maintenant cette erreur qui apparaît:

Chez moi, ça marche (le code donné en exemple avec mon post)
Si vous postez pas votre code, je peux pas savoir ce qu'il y a ligne 34 et avant.
 

Citation :

Les mails envoyés ne contiennent plus le corps de ma variable $Message

Ca devrait.
Essayez de faire:
 
$msg->attach( Type  =>'TEXT',
  Data  => $Message);
 

Citation :

J'ai toujours un fichier joint mais je n'arrive pas à en envoyer plusieurs.

Il y a pas de raison, ça devrait marcher.
Vous avez essayé d'en ajouter deux pour voir?
$msg->attach(Type => "text/plain",
         Path => $File1,
         Filename => $File1,
         Disposition => "attachment"
        ) or die "Error adding the text message part: $!\n";
$msg->attach(Type => "text/plain",
         Path => $File2,
         Filename => $File2,
         Disposition => "attachment"
        ) or die "Error adding the text message part: $!\n";
A+,
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2103610
Sethenssen
Posté le 27-09-2011 à 18:49:29  profilanswer
 

Bonjour Gilou,
 
La ligne 34 c'est celle là, ces celles du script que j'ai posté à 2-3 lignes prêts car j'en ai commenté certaines.
 
 local ($To, $From, $Cc, $Subject, $Message, $File) = @_;
 
 
Sinon en ajoutant un second attachement avec $File2 cela fonctionne.
Mais comment je fais pour ajouter des fichiers joints d'une liste dont je ne connais pas encore à l'avance le nombre?

n°2103630
gilou
Modérateur
Modzilla
Posté le 27-09-2011 à 21:35:10  profilanswer
 

Ca c'est facile, tu mets les noms de fichier (ou path? bref ce que tu let dans ta variable $File) dans un array (avec un push ou autre), et tu fais une boucle
 
foreach my $file (@filelist) {
$msg->attach(Type => "text/plain",  
         Path => $file,  
         Filename => $file,  
         Disposition => "attachment"  
        ) or die "Error adding the text message part: $!\n";  
}
 
Bon, si c'est des attachements de type différent, il vaudra mieux que tu fasses un array de hashes, avec pour clés de tes hashes Type, Path, Filename, etc.
 
 

Citation :

La ligne 34 c'est celle là, ces celles du script que j'ai posté à 2-3 lignes prêts car j'en ai commenté certaines.  
 
 local ($To, $From, $Cc, $Subject, $Message, $File) = @_;

Oui, mais elle est comme ça chez toi? ou tu as rajouté des my dans cette ligne? (il faut pas, puisque my et local sont deux indications de même niveau et donc incompatibles)
Si tu a pas rajouté de my, le pb vient d'ailleurs (ce pour quoi il faudrait que je voie le code), car chez moi ça marche.
De toute façon, tu peux remplacer ce local ($To, ...) par un my ($To, ...), ça ne devrait rien changer et ce serait mieux.
 
A+,


Message édité par gilou le 27-09-2011 à 21:35:37

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2103639
Sethenssen
Posté le 27-09-2011 à 23:06:32  profilanswer
 

Impeccable !
Merci Gilou tu as résolu mon problème.
 
Une dernière chose, qui est plus un problème d'environnement qu'autre chose j'imagine.
J'utilise cygwin avec mintty 0.9.2
J'ai  perl, v5.10.1
 
Via cygwin j'ai une crontab qui fonctionne depuis des lustres et j'ai des scripts qui tournent.
Cependant, quand j'ajoute mon script ci-dessus pour l'envoi de mail et bien rien ne se passe, aucun mail n'est envoyé.
Je ne sais même pas si la cron a tourné ou non pour ce script.
 
D'où pourrait bien venir le problème?
 
Voici mon crontab:

Code :
  1. # DO NOT EDIT THIS FILE - edit the master and reinstall.
  2. # (/tmp/crontab.UulrQJb0Ib installed on Tue Sep 27 22:15:34 2011)
  3. # (Cron version V5.0 -- $Id: crontab.c,v 1.12 2004/01/23 18:56:42 vixie Exp $)
  4. 0 * * * * perl /cygdrive/d/_.compil/hier.pl > /dev/null 2>&1
  5. 10 2 * * * sftp -oPort=6572 -b /cygdrive/d/_.compil/jollyjumper root@localhost
  6. 12 2 * * * sh /cygdrive/d/_.compil/compil.sh > /dev/null 2>&1
  7. 14 2 * * * perl /cygdrive/d/_.compil/sarko.pl > /dev/null 2>&1
  8. 20 * * * * perl /cygdrive/d/_.compil/idtv/CAN/gmail.pl > /dev/null 2>&1


 
Le script que je veux faire tourner est : gmail.pl
 
Voici ce script:

Code :
  1. #!/usr/bin/perl -w
  2. use warnings;
  3. use strict;
  4. use MIME::Lite;
  5. package Net::SMTP::TLS;
  6. use MIME::Base64;
  7. use Authen::SASL;
  8.  
  9. # set up email
  10. my $To = "roberto\@orange.fr";
  11. my $From = "no reply <vivaldi\@gmail.com>";
  12. my $Cc = "toto\@gmail.com";
  13. my $Subject = "Test Perl 51";
  14. my $Message = "This email was sent using Perl.\nThanks.\n\nRegards,\nPerl\n\n.";
  15. my $File = "gmail.pl";
  16.  
  17. my $DIR="/cygdrive/d/_.compil/idtv/CAN/";
  18. my $SEARCH_FILE = "^127|^ALICE";
  19.  
  20. opendir(DIR, $DIR) or die "Can't open $DIR: $!";
  21. my @attach_files = grep(/$SEARCH_FILE/,readdir(DIR));
  22. closedir(DIR) or warn "Can't close $DIR: $!";
  23.  
  24. #print join("\n", @attach_files);
  25.  
  26. open(IN, "<", $DIR."compter_ligne.pl" ) or die "Can't open $!";
  27. while (<IN> )    {
  28.     chomp $_;
  29.     $Message = $Message . $_ . "\r";
  30. }
  31. close(IN) or warn "Can't close $!";
  32.  
  33. # send email
  34. email($To, $From, $Cc, $Subject, $Message, $File);
  35.  
  36. # email function
  37. sub email
  38. {
  39.     # get incoming parameters
  40.     my ($To, $From, $Cc, $Subject, $Message, $File) = @_;
  41.     # create a new message
  42.     my $msg = MIME::Lite->new(
  43.  From => $From,
  44.  To => $To,
  45.  Cc => $Cc,
  46.  Subject => $Subject,
  47.  #Type => 'multipart/mixed',
  48.  Data => $Message
  49.     ) or die "Error creating multipart container: $!\n";
  50.  
  51.     # add the attachment
  52.     foreach my $File (@attach_files) {
  53.         $msg->attach(
  54.         Type => "TEXT",
  55.         Path => $File,
  56.         Filename => $File,
  57.         Disposition => "attachment"
  58.         ) or die "Error adding the text message part: $!\n";
  59.     }
  60.  
  61.     # send the email
  62.     MIME::Lite->send('smtp',
  63.                                     'smtp.numericable.com',
  64.                                     HELLO=>'smtp.numericable.com',
  65.                                     PORT=>'25',
  66.                                     Debug => 0,
  67.                                     Timeout => 60);
  68.     $msg->send();
  69.     print "$Subject : OK\n";
  70. }
  71. __END__

n°2103642
gilou
Modérateur
Modzilla
Posté le 28-09-2011 à 00:02:16  profilanswer
 

Citation :

Via cygwin j'ai une crontab qui fonctionne depuis des lustres et j'ai des scripts qui tournent.  
Cependant, quand j'ajoute mon script ci-dessus pour l'envoi de mail et bien rien ne se passe, aucun mail n'est envoyé.  
Je ne sais même pas si la cron a tourné ou non pour ce script.  
 
D'où pourrait bien venir le problème?

La ce n'est plus un problème perl, alors je ne peux te répondre, je n'ai jamais aimé cygwin, et ne l'ai plus sur ma machine depuis un bail.
A+,


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

Ok Gilou,
T'en fais pas c'est réglé après un restart de la crontab
Bizarre m'enfin bon.
 
Merci pour ton aide précieuse sur les questions Perl,
Sympas de prendre du temps pour nous les 'tits novice :)


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

  [Résolu] MIME::Lite Comment attacher plusieurs fichiers dans un mail?

 

Sujets relatifs
Tester la présence de plusieurs fichiers dans un même répertoireInterface Graphique et gestion de fichiers
log4j, 2 fichiers de logs[RESOLU] En bash, curl avec du POST et plusieurs variable GET
Passage en SPAM chez Hotmail avec Mail PHP[Divers] Configuration Visual Studio 2010 pour fichiers sources
CMS pour échange de fichiers prorépliquer un texte à plusieurs endroits ( sans signets si possible ! )
[PHP, MYSQL] Réaliser un classement avec données de plusieurs tables 
Plus de sujets relatifs à : [Résolu] MIME::Lite Comment attacher plusieurs fichiers dans un mail?


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