Web‑серверы и прикладные web‑сервисы: Nginx, Apache, HAProxy, панели управления и скрипты для администрирования.
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
-
JaNet
- сержант
- Сообщения: 195
- Зарегистрирован: 2008-09-16 16:15:04
- Откуда: Питер
-
Контактная информация:
Непрочитанное сообщение
JaNet » 2008-11-19 12:52:06
... 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: регистрация".
вопрос - как можно и при помощи чего отконвертировать данный параметр?
JaNet
-
Хостинг HostFood.ru
-
Хостинг HostFood.ru
Тарифы на хостинг в России, от 12 рублей:
https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.:
https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах:
https://www.host-food.ru/domains/
-
zg
- полковник
- Сообщения: 5845
- Зарегистрирован: 2007-12-07 13:51:33
- Откуда: Верх-Нейвинск
Непрочитанное сообщение
zg » 2008-11-19 13:44:49
JaNet писал(а):по-нормальному это звучит "MАYВE.RU: регистрация".
это кдированная в base64 строка в кодировке koi8-r, формат такой
Код: Выделить всё
=?кодировка?B?кодированная в base64 строка?
JaNet писал(а): если в переменной url[1] (путь к файлу) есть пробелы, либо имя файла с пробелами - то письмо не уходит.
их надо экранировать или передавать в кавычках
zg
-
JaNet
- сержант
- Сообщения: 195
- Зарегистрирован: 2008-09-16 16:15:04
- Откуда: Питер
-
Контактная информация:
Непрочитанное сообщение
JaNet » 2008-11-19 15:14:45
уже откопал, спасибо
а как ее правильно сконвертировать?
Код: Выделить всё
... 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?=
- значение, если отправляешь себе письмо с таким же сабжектом.
JaNet
-
zg
- полковник
- Сообщения: 5845
- Зарегистрирован: 2007-12-07 13:51:33
- Откуда: Верх-Нейвинск
Непрочитанное сообщение
zg » 2008-11-19 15:37:20
JaNet писал(а): значение, если отправляешь себе письмо с таким же сабжектом.
оно просто разделено на две строки, для пущей красявости и по рекомендации спецификации. Но никто не обидется если ты запихнёшь всё в одну строку
Код: Выделить всё
Subject: =?koi8-r?B?ICIvID9hdF8/PyBfMTItMDggICAgLzMyNDIzNCAgMzQzMi8wMjNfQ2F0XzEyLTA4LnBkZiI=?=
будет давать тот же результат
JaNet писал(а):а как ее правильно сконвертировать?
либо base64 либо 7bit
zg
-
zg
- полковник
- Сообщения: 5845
- Зарегистрирован: 2007-12-07 13:51:33
- Откуда: Верх-Нейвинск
Непрочитанное сообщение
zg » 2008-11-19 16:04:37
Ну у меня так реализовано
Код: Выделить всё
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));
}
пашет нормально
zg
-
JaNet
- сержант
- Сообщения: 195
- Зарегистрирован: 2008-09-16 16:15:04
- Откуда: Питер
-
Контактная информация:
Непрочитанное сообщение
JaNet » 2008-11-20 13:15:59
а что делать, коль выходной текст противоречит
Код: Выделить всё
Выходной поток (закодированные байты) должен иметь длину строк не более 76 символов
возможно ли как-нить разбить его?
JaNet
-
zg
- полковник
- Сообщения: 5845
- Зарегистрирован: 2007-12-07 13:51:33
- Откуда: Верх-Нейвинск
Непрочитанное сообщение
zg » 2008-11-20 16:47:57
zg писал(а):Но никто не обидется если ты запихнёшь всё в одну строку
JaNet писал(а):возможно ли как-нить разбить его?
по идее этим должна заниматься функция quoted_printable (как в перле она называется я не в курсе). Ну либо своими силами, в зависимости в формата кодирования.
zg
-
ProFTP
- подполковник
- Сообщения: 3388
- Зарегистрирован: 2008-04-13 1:50:04
- Откуда: %&й
-
Контактная информация:
Непрочитанное сообщение
ProFTP » 2008-11-20 20:24:59
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;
}
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'


ProFTP