perl, отправка из скрипта мейла.

И всё прочее, что касается HTML
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
JaNet
сержант
Сообщения: 195
Зарегистрирован: 2008-09-16 16:15:04
Откуда: Питер
Контактная информация:

perl, отправка из скрипта мейла.

Непрочитанное сообщение 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: регистрация".
вопрос - как можно и при помощи чего отконвертировать данный параметр?

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.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
Откуда: Верх-Нейвинск

Re: perl, отправка из скрипта мейла.

Непрочитанное сообщение zg » 2008-11-19 13:44:49

JaNet писал(а):по-нормальному это звучит "MАYВE.RU: регистрация".
это кдированная в base64 строка в кодировке koi8-r, формат такой

Код: Выделить всё

=?кодировка?B?кодированная в base64 строка?
JaNet писал(а): если в переменной url[1] (путь к файлу) есть пробелы, либо имя файла с пробелами - то письмо не уходит.
их надо экранировать или передавать в кавычках

JaNet
сержант
Сообщения: 195
Зарегистрирован: 2008-09-16 16:15:04
Откуда: Питер
Контактная информация:

Re: perl, отправка из скрипта мейла.

Непрочитанное сообщение 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?=
- значение, если отправляешь себе письмо с таким же сабжектом.

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: perl, отправка из скрипта мейла.

Непрочитанное сообщение zg » 2008-11-19 15:37:20

JaNet писал(а): значение, если отправляешь себе письмо с таким же сабжектом.
оно просто разделено на две строки, для пущей красявости и по рекомендации спецификации. Но никто не обидется если ты запихнёшь всё в одну строку :smile:

Код: Выделить всё

Subject: =?koi8-r?B?ICIvID9hdF8/PyBfMTItMDggICAgLzMyNDIzNCAgMzQzMi8wMjNfQ2F0XzEyLTA4LnBkZiI=?=
будет давать тот же результат
JaNet писал(а):а как ее правильно сконвертировать?
либо base64 либо 7bit

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: perl, отправка из скрипта мейла.

Непрочитанное сообщение 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));
	}
пашет нормально

JaNet
сержант
Сообщения: 195
Зарегистрирован: 2008-09-16 16:15:04
Откуда: Питер
Контактная информация:

Re: perl, отправка из скрипта мейла.

Непрочитанное сообщение JaNet » 2008-11-20 13:15:59

а что делать, коль выходной текст противоречит

Код: Выделить всё

Выходной поток (закодированные байты) должен иметь длину строк не более 76 символов
возможно ли как-нить разбить его?

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: perl, отправка из скрипта мейла.

Непрочитанное сообщение zg » 2008-11-20 16:47:57

zg писал(а):Но никто не обидется если ты запихнёшь всё в одну строку
:smile:
JaNet писал(а):возможно ли как-нить разбить его?
по идее этим должна заниматься функция quoted_printable (как в перле она называется я не в курсе). Ну либо своими силами, в зависимости в формата кодирования.

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: perl, отправка из скрипта мейла.

Непрочитанное сообщение 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'
ИзображениеИзображение