Страница 1 из 1
perl, отправка из скрипта мейла.
Добавлено: 2008-11-19 12:52:06
JaNet
... skipped ...
Код: Выделить всё
@url = split(/\,/, $diff_count[$i]);
#Кто положил
$user = substr("$diff_parts[8]", 1,-1);
#Если там пробелы, меняем на нижнее подчеркивание
$url[1] =~ s/\s/"_"/egs;
#Пишем в сабж юзера и полный путь
$subj = "$user$url[1]";
#Пишем в файл тех. инфу
open (HANDLE,">/home/message");
print HANDLE "$diff_count[$i]";
#Намыливаем письмо
`/bin/mail -s "$subj" user\@domain.ru < /home/save/message`;
Вопрос прозаический - если в переменной url[1] (путь к файлу) есть пробелы, либо имя файла с пробелами - то письмо не уходит.
Письма, когда получаешь с клиента любого почтового уходят с сабжектом вида
Код: Выделить всё
"=?koi8-r?B?TeFZ90UuUlU6INLFx8nT1NLBw8nR?="
по-нормальному это звучит "MАYВE.RU: регистрация".
вопрос - как можно и при помощи чего отконвертировать данный параметр?
Re: perl, отправка из скрипта мейла.
Добавлено: 2008-11-19 13:44:49
zg
JaNet писал(а):по-нормальному это звучит "MАYВE.RU: регистрация".
это кдированная в base64 строка в кодировке koi8-r, формат такой
Код: Выделить всё
=?кодировка?B?кодированная в base64 строка?
JaNet писал(а): если в переменной url[1] (путь к файлу) есть пробелы, либо имя файла с пробелами - то письмо не уходит.
их надо экранировать или передавать в кавычках
Re: perl, отправка из скрипта мейла.
Добавлено: 2008-11-19 15:14:45
JaNet
уже откопал, спасибо
а как ее правильно сконвертировать?
Код: Выделить всё
... skiped ...
@url = split(/\,/, $diff_count[$i]);
use MIME::Base64 qw(encode_base64);
use MIME::Base64 qw(decode_base64);
$encoded = encode_base64($url[1]);
print "$url[1]\n";
print "$encoded\n";
... skiped ...
Вывод на экран
Код: Выделить всё
"/ ?at_?? _12-08 /324234 3432/023_Cat_12-08.pdf"
- значение переменной $url[1]
Код: Выделить всё
ICIvID9hdF8/PyBfMTItMDggICAgLzMyNDIzNCAgMzQzMi8wMjNfQ2F0XzEyLTA4LnBkZiI=
- результат функции encode
Код: Выделить всё
Subject: =?koi8-r?B?ICIvID9hdF8/PyBfMTItMDggICAg0NLJzcXSINPPz8Ldxc7J0SAvMw==?=
=?koi8-r?B?MjQyMzQgIDM0MzIvMDIzX0NhdF8xMi0wOC5wZGYi?=
- значение, если отправляешь себе письмо с таким же сабжектом.
Re: perl, отправка из скрипта мейла.
Добавлено: 2008-11-19 15:37:20
zg
JaNet писал(а): значение, если отправляешь себе письмо с таким же сабжектом.
оно просто разделено на две строки, для пущей красявости и по рекомендации спецификации. Но никто не обидется если ты запихнёшь всё в одну строку
Код: Выделить всё
Subject: =?koi8-r?B?ICIvID9hdF8/PyBfMTItMDggICAgLzMyNDIzNCAgMzQzMi8wMjNfQ2F0XzEyLTA4LnBkZiI=?=
будет давать тот же результат
JaNet писал(а):а как ее правильно сконвертировать?
либо base64 либо 7bit
Re: perl, отправка из скрипта мейла.
Добавлено: 2008-11-19 16:04:37
zg
Ну у меня так реализовано
Код: Выделить всё
function send( $to, $subject = null, $replyTo = null )
{
$headers = array();
$headers[] = 'Mime-Version: 1.0';
$headers[] = 'X-Mailer: ZG-MAILER-SCRIPT';
$headers[] = 'Content-Type: multipart/mixed; boundary="'. $this->boundary .'"';
if ( isset($replyTo) )
{
if ( preg_match('/(?:"|\')?(.*)(?:"|\')?\s*<([^>]+)>/', $replyTo, $arr) )
{
$replyTo = '=?'. $this->charset .'?B?'. base64_encode(trim($arr[1])) .'?= <'. $arr[2] .'>';
}
$headers[] = 'Reply-To: '. $replyTo;
$headers[] = 'From: '. $replyTo;
}
//$headers[] = 'Subject: =?'. $this->charset .'?B?'. base64_encode($subject) .'?=';
//$headers[] = 'To: '. $to;
return mail($to, $subject, $this->toEml(), join("\n", $headers));
}
пашет нормально
Re: perl, отправка из скрипта мейла.
Добавлено: 2008-11-20 13:15:59
JaNet
а что делать, коль выходной текст противоречит
Код: Выделить всё
Выходной поток (закодированные байты) должен иметь длину строк не более 76 символов
возможно ли как-нить разбить его?
Re: perl, отправка из скрипта мейла.
Добавлено: 2008-11-20 16:47:57
zg
zg писал(а):Но никто не обидется если ты запихнёшь всё в одну строку
JaNet писал(а):возможно ли как-нить разбить его?
по идее этим должна заниматься функция quoted_printable (как в перле она называется я не в курсе). Ну либо своими силами, в зависимости в формата кодирования.
Re: perl, отправка из скрипта мейла.
Добавлено: 2008-11-20 20:24:59
ProFTP
http://search.cpan.org/~yappo/PHP-Funct ... ns/Mail.pm
http://search.cpan.org/~esummers/PHP-In ... Include.pm
Код: Выделить всё
#!perl
use strict;
use warnings;
use MIME::Entity;
use Net::SMTP;
my $TextMail = 'Тестовое сообщение';
my $Subject = 'Тест по проверке кодировки';
my $top = MIME::Entity->build(
From => '***@yandex.ru',
To => '***@yandex.ru',
Subject => $Subject,
Charset => 'Windows-1251',
Data => $TextMail,
Type => "text/html"
);
my $smtp = Net::SMTP->new('smtp.yandex.ru', Timeout => 30, Debug => 1);
$smtp->auth('***', '***');
$smtp->mail('***@yandex.ru');
$smtp->to('***@yandex.ru');
$smtp->data();
$smtp->datasend($top->stringify);
$smtp->dataend();
$smtp->quit;
Код: Выделить всё
sub encode_mimeheader($$)
{
my $string = shift;
my $charset = shift;
my $result = encode_base64($string);
$result =~ s/^(.*)$/=?$charset?B?$1?=/mg;
return $result;
}