Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

envoi mail avec perl : erreur

3 réponses
Avatar
Newsgroups
Bonjour,

J'ai un problème lors de l'envoi de certains emails avec MIME::Lite, j'ai
vu d'autres personnes dans le même cas, mais je ne vois pas la solution.
C'est pourquoi je vous propose mon exemple qui ne fonctionne pas en
espérant que vous pourrez m'aider à le solutionner.

En fait, j'ai ce message d'erreur :
Wide character in syswrite at /usr/share/perl/5.8/Net/Cmd.pm line 436

Voici mon exemple sachant que les fichiers perl et xml sont encodés en
utf-8 sur le disque dur :

J'ai un fichier "reports.xml" comme suit :
<?xml version="1.0" encoding="UTF-8"?>
<reports>
<report>
<texte>texte avec des caractères spéciaux « » … – ’ “ ”</texte>
</report>
</reports>


et j'ai un fichier perl (.pl) comme suit :
#!/usr/bin/perl
use XML::Simple;
use MIME::Lite;
my $XML = new XML::Simple();
$reports = $XML->XMLin("reports.xml", forcearray => 0 );
$texte = $reports->{"report"}->{"texte"};
$from='monEmail@free.fr';
$to='monEmail@free.fr';


$msg = MIME::Lite->new(
From =>$from,
To =>$to,
Subject =>$subject,
Type =>'TEXT',
Data =>$texte
);
MIME::Lite->send('smtp', "smtp.free.fr");
$msg->send || die "Can not send message via SMTP server\n";


Merci de votre aide à tous.

3 réponses

Avatar
Nicolas George
Newsgroups wrote in message :
$texte = $reports->{"report"}->{"texte"};


Si XML::Simple est bien fait, $texte doit être à ce niveau une chaîne de
caractères Unicode. Or de toute évidence, MIME::Lite attend une chaîne
d'octets. Pour passer de l'une à l'autre, il faut utiliser Encode::encode.

D'autre part, le paramètre Type passé m'a tout l'air de ne pas être valide.
Je propose ceci :

$msg = MIME::Lite->new(
From =>$from,
To =>$to,
Subject =>$subject,
Type =>'TEXT',
Data =>$texte
);


$msg = MIME::Lite->new(
From =>$from,
To =>$to,
Subject =>$subject,
Type =>'text/plain; charset=utf-8',
Data =>Encode::encode("utf-8", $texte)
);

Avatar
Newsgroups
Le Tue, 25 Apr 2006 23:27:11 +0000, Nicolas George a écrit :

$msg = MIME::Lite->new(
From =>$from,
To =>$to,
Subject =>$subject,
Type =>'text/plain; charset=utf-8',
Data =>Encode::encode("utf-8", $texte)
);


Bon, je vais m'en sortir !! cette solution fonctionne : le mail ets bien
envoyé. ouf
bon, j'ai mis "utf-8" en majuscule, j'espere que ca va pas géner pour la
suite...

Mais, il est dommage que je me retrouve avec des caractères mal encodés
ex : "Français qui ont déjà voté"

donc mon nouveau probleme viens du fait que je ne sais pas trop comment
gérer mon $texte : je ne sais jamais dans quel encodage il est car il
provient de fil RSS de divers sites internet (xml)

Avatar
Nicolas George
Newsgroups wrote in message :
Mais, il est dommage que je me retrouve avec des caractères mal encodés
ex : "Français qui ont déjà voté"


C'est tout à fait bien encodé, et tel que je l'ai écrit, la déclaration est
également bonne. C'est à l'arrivée, au niveau du client mail, qu'il y a un
problème.

donc mon nouveau probleme viens du fait que je ne sais pas trop comment
gérer mon $texte : je ne sais jamais dans quel encodage il est car il
provient de fil RSS de divers sites internet (xml)


Le XML a des règles très précises pour les encodages. Si XML::Simple fait
son boulot de manière un minimum correcte, $texte devrait être une chaîne de
caractères Unicode, pour laquelle Perl prend entièrement en charge les
questions d'encodage. On peut vérifier ceci avec :

utf8::is_utf8 $texte or die "XML::Simple sucks, utilisez une bibliothèque
correctement écrite."

(le nom « utf8 » pour cette famille de fonction est hélas très mal choisi,
et ne traduit pas ce que la fonction fait réellement)