Отправка аттачем АРХИВА, разбитого По ТОМАМ.

anufriy

Новичок
Отправка аттачем АРХИВА, разбитого По ТОМАМ.

Такое дело:
Я при помощи PEAR собрал скриптец, который по введённой в него ссылке скачивает к себе на удалённый серв файл, а потом шлёт его на мыло в виде аттача.

В чём идея:
У нас в далёкой постсоветской стране трафик пока дороговат, и файлы с таких ресурсов как рапидшара лить на выделенке обломно, а по диалапу невозможно из-зи перезвонов. Но вот почта на выделенке с халявным трафиком, и движок в ней собран на сквирел майл.

Что нужно:
1) Хотелось бы знать, каким образом можно архивировать большие файлы на удалённом сервере с разбитием по томам. Я не просто так этот вопрос задаю. Я уже много чего про это почитал, ZIP вроде как бить на тома не позволяет, а RAR библиотека неподдерживает создание архивов из-за лицензии.
2) И ещё сервак на попытку отправки даже 13 метрового файла аттачем выдаёт ошибку:
Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 13441019 bytes)
3) Есть конечно идея просто бить по частям файл а потом собирать... Но я не знаю что на это можно сказать.

Заранее спасибо всем кто согласится над этим поломать голову
 

SiMM

Новичок
1. Юзать консольный zip/rar (zip'ы бывают многотомными).
2. Работать через fsockopen, читая файл небольшими блоками и тут же отправляя в сокет.
 

anufriy

Новичок
а есть какие-нибудь идеи по использованию архиваторов? В PEAR я чёта не нашёл такого удовольствие, как разбитие по томам... а с консольными архиваторами я не сталкивался ещё. где можно про это почитать?

спасибо.

-~{}~ 14.05.06 01:33:

и я кстати так и не нашёл упоминания того, чтобы ZIP архивы можно было бить на части... : (
 

anufriy

Новичок
да... это конечно всё хорошо, но видимо сложновато для моего уровня.

Ладно, покачто буду дальше читать про сокеты.
Спасибо за информацию.
:) Но я так думаю вопросы у меня только начались.

-~{}~ 18.05.06 03:07:

упорно не могу найти в нете описаний того, как же мне прикреплять в аттачмент большие файлы.
Такое ощущение, что об этом никто не задумывался никогда.
Я всё стараюсь исполнить это при помощи PEAR

поиски способов с использованием архиватора тож мало к чему привели..

Единственно что более менее можно представить - читать файл понемноу, аттачить, а потом батником клеить. Но не нашёл я кода такого батника покачто :(

-~{}~ 18.05.06 03:16:

Вот мой код:

$data = file_get_contents ($_GET['link_addr']);
if($data){
$text .= " - FILE EXISTS AND HAD READ!<br>";
//-----------------определение имени и типа файла ------------------------------------
$filename = basename ($_GET['link_addr']); //Реальное имя файла
$text .= " - FILENAME: $filename<br>";
require_once "mimetype.php";
$mimetype = new mimetype();
$filetype = $mimetype->getType($filename);
$text .= " - FILETYPE: $filetype<br>";
//------------------------------------------------------------------------------------

$fp = fopen ($filename, "w");
if($fp){
$text .= " - FILE SUCCESSFULLLY OPENED</br>";
}
$fsize = fwrite ($fp, $data);
$fsize = $fsize/1048576;
$data="";
$text .= " - FILESIZE OF CREATED FILE = $fsize MB<br>";
$ok = fclose($fp);
if($ok){
$text .= " - FILE SUCCESSFULLLY CLOSED<br><br>";
}

//------------------------------------------МЕЙЛ---------------------------------------------------------------------------

include('Mail.php');
include('Mail/mime.php');

if($_GET['mail_addr'] = 1){
$mail_addr = "[email protected]";
}elseif($_GET['mail_addr'] = 2){
$mail_addr = "[email protected]";
}elseif($_GET['mail_addr'] = 3){
$mail_addr = "[email protected]";
}

$t_body = 'Это письмо не СПАМ! Это очень хорошее и доброе письмо.';
$html = '<html><body>Товарищи! Это письмо <b>не спам!</b> Это очень хорошее письмо.</body></html>';
$file = "TEMPFILE";
if($file)
{
$text .= " - FILE 4 MAIL SUCCESSFULLY OPENED<br>";
}
$crlf = "\r\n";
$hdrs = array(
'From' => '[email protected]',
'Subject' => 'Good anonsment 4 U, dear subscriber!'
);

$mime = new Mail_mime($crlf);

$mime->setTXTBody($t_body);
$mime->setHTMLBody($html);
$mime->addAttachment($filename, $filetype);

$body = $mime->get();
$hdrs = $mime->headers($hdrs);

//$params['sendmail_path'] = '/usr/lib/sendmail';

$mail =& Mail::factory('mail');
if($mail->send($mail_addr, $hdrs, $body) ){
$text .= " - MAIL SENT OK<br>";
}else{
$text .= " - MAIL SENT ERROR<br>";
}
if (PEAR::isError($mail)){
$text .= "***ERROR<br>";
}
unlink($filename);
}else{
$text = "ФАЙЛ НЕ СУЩЕСТВУЕТ.";
}

-~{}~ 18.05.06 03:18:

Всё это дело выдаёт фразу, что мемори лимит превышен, если размер обрабатываемого файла больше 3 метров, хотя на серве мемори лимит = 16м
 

SiMM

Новичок
> упорно не могу найти в нете описаний того, как же мне прикреплять в аттачмент большие файлы.
Искать надо не как прикреплять в аттачмент большие файлы, а как прикреплять их вообще. А дальше уже дело техники.
http://www.phpclub.ru/detail/article/mail
http://phpclub.ru/faq/mail

> Единственно что более менее можно представить - читать файл понемноу
> $data = file_get_contents ($_GET['link_addr']);
> Всё это дело выдаёт фразу, что мемори лимит превышен
Говоришь - одно, делаешь - другое. Не надо держать файл в памяти целиком. Работаешь с мылом через сокеты, т.е. пишешь свой mail. При этом создаёшь письмо не в памяти, а выплёвываешь его мелкими порциями в сокет. Теми самыми порциями, которыми читаешь файл.
 

anufriy

Новичок
болшое спасибо.
сижу, изучаю сокеты и уже написанные майл библиотеки.
покачто всё, с чем сталкиваюсь, это описание тех сложностей, которые возникают при попытке написания этого дела сходу самому :)

Возвращаясь к камню предкновения:
Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 9626623 bytes) in /home2/omega/public_html/autodoma/a_mail/Mail/mimePart.php on line 293

я посмотрел, это ошибка функции _getEncodedData($data, $encoding)
когда та пытается сделать следующее:
return rtrim(chunk_split(base64_encode($data), 76, MAIL_MIMEPART_CRLF));
(ну, я это всё тут расписываю для тех, кто не рылся в своё время в этой библиотеке, простите меня те, кто рылся :) )
я как понял ошибки можно избежать делая это постепенно, но тогда как там быть с кодировкой в base64? Так бы просто можно было создать цикл, читать файл кусками и подцеплять..
Короче всё опять упирается в создание собственной библиотеки! :)
И кстати, ПИАРовская библиотека MailMime не работает без библиотеки Socket, и использует её как я понял при передаче через смтп. Но вот вопрос: А может можно её приспособить под всё это дело? Просто я не видел, чтоб теда какие-то пользовательские параметры передавались, она там сама как-то работает... и работает ли гдето вообще - неизвестно. Но без неё MailMime скандалит.
Пожалуйста, может кто в общих чертах подкинет в общих чертах код для подцепки в аттач по кускам файла? А я доработаю уж вмеру своих способностей?
 

SiMM

Новичок
> я как понял ошибки можно избежать делая это постепенно, но тогда как там быть с кодировкой в base64? Так бы просто можно было создать цикл, читать файл кусками и подцеплять..
Вот так и делайте. Просто читайте порциями, кратными 3м. При чтении последней порции это правило соблюдать необязательно. Чтобы было понятнее - изучите вопрос изнутри: http://ru.wikipedia.org/wiki/Base64
 

anufriy

Новичок
Добрые люди, объясните пожалуйста, как соединяться с smtp сервером через сокет, если сервер требует аутификации?
У моего хостера например требует.
поэтому простые примеры с fsockopen не работают.
Пробывал разобраться с работой phpMailer-а и других готовых решений, но с налёту это сложновато.
Заранее большое спасибо.
 

anufriy

Новичок
спасибо, читаю...

-~{}~ 26.05.06 11:52:

Пробую я значит использовать класс Net SMTP:

require_once 'SMTP.php';

define('TEST_HOSTNAME', 'localhost');
define('TEST_PORT', 25);
define('TEST_LOCALHOST', 'localhost');
define('TEST_AUTH_USER', 'stream');
define('TEST_AUTH_PASS', 'stream');
define('TEST_FROM', '[email protected]');
define('TEST_TO', '[email protected]');
define('TEST_SUBJECT', 'Test Subject');
define('TEST_BODY', 'Test Body');

if (! ($smtp = new Net_SMTP(TEST_HOSTNAME, TEST_PORT, TEST_LOCALHOST))) {
die("Unable to instantiate Net_SMTP object\n");
}else{echo'OK<br>';}

$smtp->setDebug(true);

if (PEAR::isError($e = $smtp->connect())) {
die($e->getMessage() . "\n");
}else{echo'OK<br>';}

//if (PEAR::isError($e = $smtp->auth(TEST_AUTH_USER, TEST_AUTH_PASS))) {
// die('Unable to Authif');
//}else{echo'OK<br>';}

if (PEAR::isError($smtp->mailFrom(TEST_FROM))) {
die('Unable to set sender to <' . TEST_FROM . ">\n");
}else{echo'OK<br>';}

if (PEAR::isError($res = $smtp->rcptTo(TEST_TO))) {
die('Unable to add recipient <' . TEST_TO . '>: ' .
$res->getMessage() . "\n");
}else{echo'OK<br>';}

if (PEAR::isError($smtp->data(TEST_SUBJECT . "\r\n" . TEST_BODY))) {
die("Unable to send data\n");
}else{echo'OK<br>';}

$smtp->disconnect();

echo 'Success!';

Это уже вариант когда я пробую без аутификаци.
На что при включении дебага получаю:
OK
DEBUG: Recv: 220-serv4.slavhost.ru ESMTP Exim 4.52 #1 Fri, 26 May 2006 11:34:19 +0400
DEBUG: Recv: 220-We do not authorize the use of this system to transport unsolicited,
DEBUG: Recv: 220 and/or bulk e-mail.
DEBUG: Send: EHLO localhost
DEBUG: Recv: 250-serv4.slavhost.ru Hello localhost [127.0.0.1]
DEBUG: Recv: 250-SIZE 52428800
DEBUG: Recv: 250-PIPELINING
DEBUG: Recv: 250-AUTH PLAIN LOGIN
DEBUG: Recv: 250-STARTTLS
DEBUG: Recv: 250 HELP OK
DEBUG: Send: MAIL FROM:
DEBUG: Recv: 250 OK OK
DEBUG: Send: RCPT TO:
DEBUG: Recv: 451 Could not complete sender verify callout Unable to add recipient : Invalid response code received from server

При использовании же аутификации (раскомментирования 3х строк в коде), получаю:
OK
DEBUG: Recv: 220-serv4.slavhost.ru ESMTP Exim 4.52 #1 Fri, 26 May 2006 11:25:09 +0400
DEBUG: Recv: 220-We do not authorize the use of this system to transport unsolicited,
DEBUG: Recv: 220 and/or bulk e-mail.
DEBUG: Send: EHLO localhost
DEBUG: Recv: 250-serv4.slavhost.ru Hello localhost [127.0.0.1]
DEBUG: Recv: 250-SIZE 52428800
DEBUG: Recv: 250-PIPELINING
DEBUG: Recv: 250-AUTH PLAIN LOGIN
DEBUG: Recv: 250-STARTTLS DEBUG: Recv: 250 HELP OK
DEBUG: Send: AUTH LOGIN
DEBUG: Recv: 334 VXNlcm5hbWU6
DEBUG: Send: c3RyZWFt
DEBUG: Recv: 334 UGFzc3dvcmQ6
DEBUG: Send: c3RyZWFt
DEBUG: Recv: 535 Incorrect

Скажите мне, пожалуйста, что мне с этим делать. (Хотя ответ конечно известен - читать мануалы).
Но просто мне не ясно: изходя из всего вышеизложенного какой вариант больше всего похож на правильный?

Спасибо.
 
Сверху