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

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

Marsh Posté le 27-09-2011 à 09:33:22    

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
Reply

Marsh Posté le 27-09-2011 à 09:33:22   

Reply

Marsh Posté le 27-09-2011 à 11:12:17    

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

Marsh Posté le 27-09-2011 à 11:47:09    

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.

Reply

Marsh Posté le 27-09-2011 à 12:44:15    

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

Marsh Posté le 27-09-2011 à 18:49:29    

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?

Reply

Marsh Posté le 27-09-2011 à 21:35:10    

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

Marsh Posté le 27-09-2011 à 23:06:32    

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__

Reply

Marsh Posté le 28-09-2011 à 00:02:16    

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

Marsh Posté le 28-09-2011 à 10:19:41    

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 :)

Reply

Sujets relatifs:

Leave a Replay

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