Jakiś czas temu miałem do napisania prosty skrypt, który sprawdzi czy hasło domenowe użytkownika jest jeszcze ważne i jeśli zachodzi potrzeba wyśle maila z informacją. Pojawił się jeden problem – wszystkie polskie znaki były „psute” przy wysyłaniu maila na maszynach z Red Hatem.

Wszystko było ok na Fedorze – z niej wszystkie znaczki były poprawnie kodowane przy wysyłaniu. Próbowałem w prosty sposób użyć modułów Encode do zapisania zmiennych w utf8, ale bez skutku. W końcu znalazłem pewną japońską stronę, w której znalazłem to czego szukałem :) (poglądowy obrazek jak wygląda zdobywanie wiedzy)

W dużym skrócie najważniejszy dla poprawnego działania skryptu na różnych platformach jest kodowanie zmiennych do utf8 za każdym razem. Poniżej jak można to osiągnąć:

 

use Encode;
use MIME::Base64;
use utf8;
use strict;
use Net::SMTP;
my $smtpHeader='Subject:'.encode('MIME-Header',"Temat w zawierający polskie znaki")."\n";
 $smtpHeader.='To:'.encode('MIME-Header',"odbiorca@adres.com")."\n";;
 $smtpHeader.="MIME-Version: 1.0\n";
 $smtpHeader.="Content-type:text/plain;charset=UTF-8\n";
 $smtpHeader.="Content-Transfer-Encoding: base64\n";
 $smtpHeader.="\n";
 my $message = "Widomość z polskimi znakami\n";
my $smtpMessage = Net::SMTP->new('localhost');
 $smtpMessage->mail('adresat@adres.com');
$smtpMessage->recipient('odbiorca@adres.com'', {SkipBad=>1});
 $smtpMessage->data();
 $smtpMessage->datasend($smtpHeader);
 $smtpMessage->datasend(encode_base64(encode('utf8',$message)));
 $smtpMessage->datasend();
 $smtpMessage->quit;

 

No i koniec z walką z poprawnym kodowaniem znaków w mailach. Biorąc pod uwagę, skąd wziąłem przykład jak to zrobić to chyba nie jest zbyt powszechny problem :)