[Perl] Mail avec MIME::lite

Mail avec MIME::lite [Perl] - Perl - Programmation

Marsh Posté le 02-03-2012 à 13:39:08    

Bonjour,
 
Je souhaite envoyer des mails dans un script Perl, réalisé avec MIME::lite.
 
Problème : les accents dans le titre du message sont remplacés par deux "XX". (Les accents dans le corps du message sont corrects.) Une idée pour résoudre le problème ?
 

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use MIME::Lite;
  5. if(1 && 1){
  6.    print("Envoi du mail...\n" );
  7.    my $msg = MIME::Lite->new(
  8.       From     => 'toto@tutu.fr',
  9.       To       => 'tutu@toto.fr',
  10.       Type     => 'text/plain; charset=UTF-8',
  11.       Subject  => "é à è ï ù ô ê",
  12.       Data     => "é à è ï ù ô ê"
  13.     );
  14.    if($msg->send){
  15.       print("Envoi du mail réussi !\n" );
  16.    } else {
  17.       print("échec de l'envoi du mail !\n" );
  18.    }
  19. }


 
Et j'obtiens :

Code :
  1. Sujet : XX XX XX XX XX XX XX
  2. De    : toto@tutu.fr
  3. Date  : 13:43
  4. Pour  : tutu@toto.fr
  5. Corps : é à è ï ù ô ê


Message édité par Titprem le 02-03-2012 à 13:51:13
Reply

Marsh Posté le 02-03-2012 à 13:39:08   

Reply

Marsh Posté le 02-03-2012 à 13:51:42    

Et avec
 

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use MIME::Lite;
  5. use Encode  qw(encode);
  6.  
  7.  
  8. if(1 && 1){
  9.   print("Envoi du mail...\n" );
  10.  
  11.   my $msg = MIME::Lite->new(
  12.      From     => 'toto@tutu.fr',
  13.      To       => 'tutu@toto.fr',
  14.      Type     => 'text/plain; charset=UTF-8',
  15.      Subject  => encode(“MIME-B”, "é à è ï ù ô ê" ),
  16.      Data     => "é à è ï ù ô ê"
  17.    );
  18.   if($msg->send){
  19.      print("Envoi du mail réussi !\n" );
  20.   } else {
  21.      print("échec de l'envoi du mail !\n" );
  22.   }
  23. }


ça donne quoi?
 
A+


Message édité par gilou le 02-03-2012 à 14:00:17

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

Marsh Posté le 02-03-2012 à 13:58:54    

"utf8::encode" n'accepte pas de modifier directement la variable.
 
En passant par des variables, j'ai "XXXX XXXX XXXX XXXX XXXX XXXX XXXX" pour le titre et "é à  Ã¨ ï ù ô ê" pour le corps...
 
(Mon source est en UTF8.)


Message édité par Titprem le 02-03-2012 à 14:00:03
Reply

Marsh Posté le 02-03-2012 à 13:59:53    

Oui, je viens de modifier ma réponse au vu de ceci: http://www.databasesandlife.com/us [...] -mimelite/
Réessayes le code que j'ai modifié
Et si ça colle pas, met le sujet dans une variable (je sais pas si encode essaye de modifier en place la string ou pas, et si elle est pas dans une variable, elle sera pas modifiable)
A+,


Message édité par gilou le 02-03-2012 à 14:02:17

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

Marsh Posté le 02-03-2012 à 14:01:56    

C'est mieux : le corps est bon, et le sujet est : "é à  Ã¨ ï ù ô ê".
 
Il faudrait rajouter un ptit truc...

Reply

Marsh Posté le 02-03-2012 à 14:06:11    

>> Mon source est en UTF8
 
Dans ce cas la, peut être qu'en mettant un use utf8; en tête (sans un no utf8; comme tout à l'heure) on réglera le pb.
En principe, use utf8; indique à Perl que le programme perl est en utf8.
 
A+,


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

Marsh Posté le 02-03-2012 à 14:09:20    

Avec use utf8, le sujet est bon ! Mais le corps du message devient "� � � � � � �" et les retours de mon script s'affiche avec des caractères tout aussi étranges : "Envoi du mail r▒ussi !"
 
J'adore les problèmes d'encodage ! :D


Message édité par Titprem le 02-03-2012 à 14:09:58
Reply

Marsh Posté le 02-03-2012 à 14:10:45    

Quoique non, tout bêtement, si ton source est en utf8, il suffit de faire  
Subject =>   "=?UTF-8?B?" ."é à è ï ù ô ê". "?=",
a priori.
Ça marche pas ça:
 

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use MIME::Lite;
  5.  
  6. if(1 && 1){
  7.   print("Envoi du mail...\n" );
  8.  
  9.   my $msg = MIME::Lite->new(
  10.      From     => 'toto@tutu.fr',
  11.      To       => 'tutu@toto.fr',
  12.      Type     => 'text/plain; charset=UTF-8',
  13.      Subject  => "=?UTF-8?B?" ."é à è ï ù ô ê". "?=",
  14.      Data     => "é à è ï ù ô ê"
  15.    );
  16.   if($msg->send){
  17.      print("Envoi du mail réussi !\n" );
  18.   } else {
  19.      print("échec de l'envoi du mail !\n" );
  20.   }
  21. }


A+,


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

Marsh Posté le 02-03-2012 à 14:14:45    

Non, il me sort "=?UTF-8?B?XX XX XX XX XX XX XX?=" pour le sujet.
 
C'est peut-être lié au fait que mon client mail est un vieux Thunderbird aussi... (Mais ça, je ne peux pas le changer !)

Reply

Marsh Posté le 02-03-2012 à 14:16:41    

Avec :

Code :
  1. Subject  => encode("MIME-B", Encode::decode_utf8("é à è ï ù ô ê" )),

tout marche !
 
Merci gilou pour ton aide ! :jap:

Reply

Marsh Posté le 02-03-2012 à 14:16:41   

Reply

Marsh Posté le 02-03-2012 à 14:22:01    

Sinon, il semble qu'en fait la méthode usuelle (au vu de Google) soit:
use MIME::QuotedPrint qw(encode_qp);
...
my $encoded = encode_qp("é à è ï ù ô ê" );  
...
Subject  => "=?utf-8?Q?$encoded?=",
...
 
(et si la ligne suivante passe
Subject  => "=?utf-8?Q?". encode_qp("é à è ï ù ô ê" ) ."?=",
On peut éviter la variable $encoded intermédiaire)
 
A+,
 


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

Marsh Posté le 02-03-2012 à 14:24:16    

J'étais aussi tombé dessus, mais ça ne marchait pas...
 
J'obtenais ça : "=?utf-8?Q?=C3=A9=C3=A9=C3=A9=C3=A9=C3=A9=C3=A9=C3=A9 =C3=A0=C3=A0=C3=A0=C3=A0=C3=A0= =C3=A0 =C3=AA=C3=AA=C3=AA=C3=AA= ?="


Message édité par Titprem le 02-03-2012 à 14:24:53
Reply

Marsh Posté le 02-03-2012 à 14:36:17    


Bon de toute façon, l'essentiel c'est que ça marche maintenant.
 
A+,


Message édité par gilou le 02-03-2012 à 14:37:50

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