Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > функция кодирования полей е-мэйла


Автор: Forza 12.9.2004, 11:30
Подскажите, пожалуйста, функцию кодирования кириллицы в полях From, To и Subject сообщения электронной почты: чтобы, например, из "тест" получалось "=?KOI8-R?B?1MXT1A==?=" (только не для koi8, а для win-1251).

И вообще, как сейчас рекомендуется отправлять Перлом почту (MIME-вложения бинарных файлов не нужны)? Я это делаю так:
Код
use Mail::SendMail;
my %mail = (
From  => $sender,
To  => $recipient,
Subject => "I'm sending you mail",
Message => "This is the message body.\n"
);
sendmail (%mail) or die "sendmail failure sending to $mail{To}: $!\n";

Автор: korob2001 12.9.2004, 12:53
Цитата

И вообще, как сейчас рекомендуется отправлять Перлом почту (MIME-вложения бинарных файлов не нужны)?


Почитай здесь: http://forum.vingrad.ru/index.php?showtopic=29108

Автор: Forza 13.9.2004, 12:31
korob2001,

т.е. лучше использовать именно Net::SMTP, а не Mail::Sendmail? А почему, можно узнать?

Автор: korob2001 13.9.2004, 13:41
Цитата

т.е. лучше использовать именно Net::SMTP, а не Mail::Sendmail? А почему, можно узнать?

Я не сказал, что лучше. Лучше, когда способ пересылки соответствует требованиям.
Просто я отправляю почту через sendmail, способом какой привёл ElectricaStorm, другими словами без сторонних модулей.

А вообще тебе решать каким способом её отправлять.

Автор: Forza 13.9.2004, 14:12
korob2001, а что можешь сказать по существу вопроса, если отправлять почту через Mail::Sendmail? Какой функцией кодировать Фром, Ту и Сабджект с кириллицей?
Догадываюсь, что это можно найти в мануалах: просто надеялся, что тут мне быстрее подскажут.

Автор: ElectricalStorm 13.9.2004, 16:43
ёперный театр что значит
Цитата
какой функцией кодировать
... ?
выставляете нужную кодировку и вперед
Код


my $msg = "";
$msg .= qq|From: $from\n|;
$msg .= qq|To:   $to\n|;
$msg .= qq|Subject: $subj\n|;
$msg .= qq|Content-Type: text/plain; charset=windows-1251\n|;
$msg .= qq|\n|;
$msg .= qq|$text\n|;
$msg .= qq|\n|;

open MAIL, "|/usr/sbin/sendmail -t";
print MAIL $msg;
close MAIL;




Автор: wlad 13.9.2004, 17:07
Я вот самописной кодирую...

Код
sub pvd_base64_encode ($;$)
{
   my $res = "";
   my $eol = $_[1];
   $eol = "\n" unless defined $eol;
   pos($_[0]) = 0;
   while ($_[0] =~ /(.{1,45})/gs) {
   $res .= substr(pack('u', $1), 1);
   chop($res);
   }
   $res =~ tr|` -_|AA-Za-z0-9+/|;              
   my $padding = (3 - length($_[0]) % 3) % 3;
   $res =~ s/.{$padding}$/'=' x $padding/e if $padding;
   if (length $eol) {
   $res =~ s/(.{1,76})/$1$eol/g;
   }
   $res=~ s/\s+$//;
   $res;
}


Выглядит это так

Код
$subject="=?windows-1251?B?".pvd_base64_encode($subject)."?=";


И еще в заголовки я бы добавил

Код
$msg .= qq|Content-Transfer-Encoding: 8bit\n|;
$msg .= qq|MIME-Version: 1.0\n|;


Во избежание, так сказать......

Автор: Forza 14.9.2004, 11:36
Цитата(ElectricalStorm @ 13.9.2004, 16:43)
выставляете нужную кодировку и вперед


Здрасте, приехали! Кодировка, указываемая в Content-Type относится только к телу письма. Если же в Сабж, Ту и Фром оставить некодированную кириллицу, то почтовые клиенты будут это воспринимать непредсказуемо.

Цитата(wlad @ 13.9.2004, 17:07)
Я вот самописной кодирую...

Ну да. Самописную и я могу написать. В институте на лабах писал подобную функцию на Си.

Цитата(wlad @ 13.9.2004, 17:07)

И еще в заголовки я бы добавил
$msg .= qq|Content-Transfer-Encoding: 8bit\n|;
$msg .= qq|MIME-Version: 1.0\n|;

Эти поля заголовка по умолчанию прописаны в Mail::Sendmail.

Автор: ElectricalStorm 14.9.2004, 13:14
Код

use MIME::Base64;

$encoded = encode_base64('Aladdin:open sesame');
$decoded = decode_base64($encoded);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)