|
|
|
| Проблема такая: функция send_mail не хочет работать в цикле, срабатывает только первая итерация цикла, письмо отправляется первому пользователю с файлом, которому задаётся непонятно какое расширение (но он читается) и с кучей непонятных символов.Дальше выполнение скрипта не происходит.
Скрипт выглядит так:
<?php
require_once("config.php");
if(empty($_FILES['xls']['tmp_name']))
{
echo ("Выберите файл прайс-листа");
}
else
{
$file=($_FILES['xls']['tmp_name']);
}
copy($file,"../../price/Price.xls");
$fp = fopen($file,"r");
if (!$fp)
{
print "Файл не может быть прочитан";
exit();
}
$file = fread($fp, filesize($file));
fclose($fp);
$boundary = "--".md5(uniqid(time())); // генерируем разделитель
$headers .= "MIME-Version: 1.0\n";
$headers .="Content-Type: multipart/mixed; boundary=\"$boundary\"\n";
$multipart .= "--$boundary\n";
$kod = 'koi8-r'; // или $kod = 'windows-1251';
$multipart .= "Content-Type: text/html; charset=$kod\n";
$multipart .= "Content-Transfer-Encoding: Quot-Printed\n\n";
$multipart .= "$html\n\n";
$message_part = "--$boundary\n";
$message_part .= "Content-Type: application/octet-stream\n";
$message_part .= "Content-Transfer-Encoding: base64\n";
$message_part .= "Content-Disposition: attachment; filename = \"".$file."\"\n\n";
$message_part .= chunk_split(base64_encode($file))."\n";
$multipart .= $message_part."--$boundary--\n";
$query = "SELECT mail FROM mail ORDER BY puttime ASC";
$m = mysql_query($query);
if ($m)
{
if (mysql_num_rows($m)>0)
{
while($mailto = mysql_fetch_array($m))
{
mail("".$mailto['mail']."", "тема", $multipart, $headers);
send_mail(" ".$mailto['mail']." ", "тема", "сообщение", $file);
}
}
}
else
{
puterror("Ошибка при обращении к странице");
}
?>
|
Если закоментировать, и использовать ф-цию mail,то работает всё как надо.
Пожалуйста,не оставляйте ссылки на скрипт, который представлен на сайте, т.к основа взята оттуда.
Не догоняю как работает send_mail и как задаётся кодировка для файлов :(.
Спасибо.Буду рад любому мнению | |
|
|
|
|
|
|
|
для: psychomc
(19.09.2008 в 10:14)
| | А может быть вам дать ссылку на РНР мануал, чтобы вы прочитали, что есть в нем функция mail(), но нет функции send_mail(). | |
|
|
|
|
|
|
|
для: sim5
(19.09.2008 в 10:21)
| | давайте,но вопрос не в этом. т.е send_mail пользовательская ф-ция,расскажите тогда как её правильно написать чтоыб она работала... | |
|
|
|
|
|
|
|
для: psychomc
(19.09.2008 в 11:42)
| | Ежу понятно, что send_mail не родная РНР, но вы можете ответить на вопрос, зачем две функции отправки почты в цикле?
Функция mail(). В дополнение, почитайте прикрепление из этой темы, где рассказывается как граматно оформить почтовое отправление, плюс даны ссылки на рекомендации RFC. | |
|
|
|
|
|
|
|
для: sim5
(19.09.2008 в 12:04)
| | что-то с файлами ничего не нашёл....
точнее ничего не понял | |
|
|
|
|
|
|
|
для: psychomc
(19.09.2008 в 12:14)
| | Какими файлами? | |
|
|
|
|
|
|
|
для: sim5
(19.09.2008 в 12:17)
| | которые прикрепляются... | |
|
|
|
|
|
|
|
для: psychomc
(19.09.2008 в 12:38)
| |
<?php
require_once("config.php");
if(empty($_FILES['xls']['tmp_name']))
{
echo ("Выберите файл прайс-листа");
}
else
{
$file=($_FILES['xls']['tmp_name']);
}
copy($file,"../../price.xls");
// $headers = "Content-type: text/html; charset=windows-1251 \r\n";
$file_name = $file;
$subj = "Прайс-лит от ICS";
$bound = "spravkaweb-1234";
$headers = "From: \"Evgen\" <admin@spravkaweb.ru>\n";
$headers .= "To: admin@localhost.ru\n";
$headers .= "Subject: $subj\n";
$headers .= "Mime-Version: 1.0\n";
$headers .= "Content-Type: multipart/alternative; boundary=\"$bound\"\n";
$body = "--$bound\n";
$body .= "Content-type: text/html; charset=windows-1251 \r\n";
$body .= "Content-Transfer-Encoding: 8bit\n\n";
$body .= "\n\n--$bound\n";
$body .= "Content-Type: image/jpeg; name=\"".basename($file_name)."\"\n";
$body .= "Content-Transfer-Encoding:base64\n";
$body .= "Content-ID: <spravkaweb_img_1>\n\n";
$f = fopen($file_name,"rb");
$body .= base64_encode(fread($f,filesize($file)))."\n";
$body .= "--$bound--\n\n";
?>
<?php
$query = "SELECT mail FROM mail
ORDER BY puttime ASC";
$m = mysql_query($query);
if ($m)
{
if (mysql_num_rows($m)>0)
{
while($mailto = mysql_fetch_array($m))
{
mail("".$mailto['mail']."", $subj, $body, $headers);
}
}
}
else
{
puterror("Ошибка при обращении к странице");
}
echo "<HTML><HEAD>
<META HTTP-EQUIV='Refresh' CONTENT='0; URL=index.php'>
</HEAD></HTML>";
?>
|
всё,данный вариант работает.
осталось только расширение поменять
спасибо sim5! | |
|
|
|
|
|
|
|
для: psychomc
(19.09.2008 в 12:41)
| | Вы сперва для скобок фигурных как-то выберите стиль записи, чтобы вы сами могла видеть, что у вас с ними полная лажа. Так как функция send_mail у вас закрывается после fclose($fp); Перенаправление будет выполнятся в любом случае. Прикрепление, на которое я вам давал ссылку, вы занчит не читали, иначе бы так не передавали тему письма на русском языуке. Вы сперва научитесь грамотно оформлять отправку обычного текста, заитем одного прикрепления, а уж потом...
PS. Пока писал, вы исправили баг. Похвально, но если вы не учитваете русский в теме письма, как это было привдено ранее, то исправьте это. | |
|
|
|
|
|
|
|
для: sim5
(19.09.2008 в 13:14)
| |
<?php
require_once(".config.php");
if(empty($_FILES['xls']['tmp_name']))
{
echo ("Выберите файл прайс-листа");
}
else
{
$file=($_FILES['xls']['tmp_name']);
}
copy($file,"../../price.xls");
$file_name = $file;
$subj = "Price ICS";
$bound = "spravkaweb-1234";
$headers = "From: \"Evgen\" <admin@spravkaweb.ru>\n";
// $headers .= "To: admin@localhost.ru\n";
$headers .= "Subject: $subj\n";
$headers .= "Mime-Version: 1.0\n";
$headers .= "Content-Type: multipart/alternative; boundary=\"$bound\"\n";
$body = "--$bound\n";
$body .= "Content-type: text/html; charset=windows-1251 \r\n";
$body .= "Content-Transfer-Encoding: 8bit\n\n";
$body .= "\n\n--$bound\n";
$body .= "Content-Type: file/xls; name=\"".basename($file_name)."\"\n";
$body .= "Content-Transfer-Encoding:base64\n";
$body .= "Content-Disposition: attachment; filename=\"$file\"\n";
$body .= "Content-ID: <spravkaweb_img_1>\n\n";
$f = fopen($file_name,"rb");
$body .= base64_encode(fread($f,filesize($file)))."\n";
$body .= "--$bound--\n\n";
if (mail("sasha@ics.by", $subj, $body, $headers))
{
echo "Письмо отправлено";
}
?>
<?php
// $query = "SELECT mail FROM mail
// ORDER BY puttime ASC";
// $m = mysql_query($query);
// if ($m)
// {
// if (mysql_num_rows($m)>0)
// {
// while($mailto = mysql_fetch_array($m))
// {
// }
// }
// }
// else
// {
// puterror("Ошибка при обращении к странице");
// }
// echo "<HTML><HEAD>
// <META HTTP-EQUIV='Refresh' CONTENT='0; URL=index.php'>
// </HEAD></HTML>";
?>
|
сделал вот так,но файл не переименовывается, ф-ция rename тоже не работает. файл приходит,читается но с именами типа _tmp_phpg93SkP и расширением dat. каким образом можно оставить старое название и старый формат????ну или любое новое имя и xls | |
|
|
|
|
|
|
|
для: psychomc
(19.09.2008 в 16:02)
| | Первое - при закачке файлов на сервер используйте функцию move_uploaded_file(), а не copy().
Второе - вы переменной $file присваиваете временный файл, и потом оперериуете им. | |
|
|
|
|
|
|
|
для: sim5
(19.09.2008 в 16:27)
| | спасибо,я понял что временный,но как потом из временного получить другой файл и потот его переименовать как надо? | |
|
|
|
|
|
|
|
для: psychomc
(19.09.2008 в 16:31)
| | Я же вам сказал, читайте офункции move_uploaded_file() в ней ответ на ваш вопрос. | |
|
|
|
|
|
|
|
для: sim5
(19.09.2008 в 16:38)
| | move_uploaded_file — Перемещает загруженный файл в новое место
Описание
bool move_uploaded_file ( string $filename , string $destination )
Эта функция проверяет, является ли файл filename загруженным на сервер (переданным по протоколу HTTP POST). Если файл действительно загружен на сервер, он будет перемещён в место, указанное в аргументе destination .
Если filename не является загруженным файлов, никаких действий не предпринимается и move_uploaded_file() возвращает FALSE.
Если filename является загруженным файлом, но не может быть перемещён по каким-либо причинам, никакие действия не предпринимаются и move_uploaded_file() возвращает FALSE. Кроме того, отображается предупреждение.
Такая проверка особенно важна в том случае, если существует шанс того, что какие-либо действия, производимые над загруженным файлом, могут открыть его содержимое пользователю или даже другим пользователям системы.
честно сказать не нашёл ответа.....опять приходит временный файл. есть какой-нибудь пример как переименовать???????????? | |
|
|
|
|
|
|
|
для: psychomc
(19.09.2008 в 16:43)
| | Вот ответ: string $filename , string $destination. А если еще почитать в мануале о массиве $_FILES, а так же о том как првильно закачивать файлы на сервер (проверка этого обязательна), то вы получите все ответы.
http://www.php.net/manual/ru/features.file-upload.php | |
|
|
|
|
|
|
|
для: sim5
(19.09.2008 в 16:52)
| | можно ссылку????? | |
|
|
|
|
|
|
|
для: psychomc
(19.09.2008 в 16:53)
| | Поставил ссылку. Почитайте. А уже потом, какие вопросы возникнут... | |
|
|
|
|
|
|
|
для: psychomc
(19.09.2008 в 16:53)
| | ок | |
|
|
|
|
|
|
|
для: psychomc
(19.09.2008 в 16:58)
| | единственный и последний вопрос:
что прописывать в Content-type?????
$body .= "Content-type: text/html; charset=windows-1251 \r\n";
|
| |
|
|
|
|
|
|
|
для: psychomc
(19.09.2008 в 16:58)
| | application/vnd.ms-excel
Вы можете узнать тип загружаемого файла, обратившись к элементу массива $_FILES['xls']['tmp_name']. Вы читаете или нет?
Прописывать то, что вы отправляете, если письмо в формате html, значит text/html, если текст, соответственно... Я ведь давал вам ссылку на прикрепление, чтобы почитать, а также читайте о функции mail(). Ну все же есть там. | |
|
|
|
|
|
|
|
для: sim5
(19.09.2008 в 17:07)
| | до этого не дошёл просто.спасибо,сразу бы сказали | |
|
|
|
|
|
|
|
для: psychomc
(19.09.2008 в 17:09)
| | хм,вот только файл не приходит | |
|
|
|
|
|
|
|
для: psychomc
(19.09.2008 в 17:12)
| | Во-первых, вы должны проверить закачан ли файл на сервер, а это можно сделать сразу при копировании его из временной папки в папку каталога. Если закачано, то прикрепляете файл в почтовое отправление не из временной папки, а из той куда вы его скопировали.
Если он у вас не прикрепляется (не получает адресат) то у вас неверно сформировано почтовое отправление. Про ошибки не спрашивайте - я вам указывал ссылку, где можно почитать о правильном оформлении почтовых сообщений. Если вы не будете торопиться, задавая вопросы, прежде чем все прочитать, то вы, надеюсь, разберетесь как все грамотно сделать. | |
|
|
|
|
|
|
|
для: sim5
(19.09.2008 в 17:19)
| | проверка закачки идёт сразу после отправки.файл закачан. проблема в том что действительно неверно отформатирвоано, при кодировке application/vnd.ms-excel приходит пустой файл, раньше приходил dat но читаемый. на самом деле я же сюда изначально обратился не затем чтобы взять ссылку почитать, иначе зачем тогда форумы если всё так просто, не для всех же просто... | |
|
|
|
|
|
|
|
для: psychomc
(19.09.2008 в 17:27)
| | всё,заработало,но только с функцией copy. понимаете какая ещё у меня проблема: чтобы проверить работает ли скрипт нужно каждый раз его по фтпшке передавать на сервер т.к на локалке smtp нету...адский геморрой | |
|
|
|
|
|
|
|
для: psychomc
(19.09.2008 в 17:34)
| | и ещё....
я так понял в этой строчке
$body .= "Content-Type: image/jpeg; name=\"".basename($file_name)."\"\n";
|
мы сохраняем передаваемое имя файла,т.е tmp
могу ли вместо .basename($file_name). вписать любое другое имя???? | |
|
|
|
|
|
|
|
для: psychomc
(19.09.2008 в 17:37)
| | Вы картинку прикрепляете или электронную таблицу? Читайте мануал, и не просто читайте, а изучайте, пробуйте! Когда все усвоите нормально, тогда можно и говорить, а по несколько раз вам указывать на одни и те же грабли, на которые вы наступаете, я устал. | |
|
|
|
|
|
|
|
для: psychomc
(19.09.2008 в 17:27)
| | Знаете что. Коли вы уверены что проблема в типе файла, то нет ничего проще. Созайте маленький тестовый скрипт на скачивание файла с сервера, и запустите его. Даю вам 100% гарантию, что скачиваемый файл будет файлом Excel и он откроется в соответсвующей программе без проблем. | |
|
|
|
|
|
|
|
для: sim5
(19.09.2008 в 17:38)
| | так он открывался в exel но был с раширением dat, некоторые пользователи бы просто кликнули 2 раза, появилось бы окно "открыть с помощью" они бы испугались и закрыли....
суть в другом:
1) файл начал опять закидывается на сервак у меня только когда поставил обратно функцию copy
2) файл приходит в том формате который надо
3) файл тот который надо.
в общем могу ли я здесь поменять имя:
name=\"".basename($file_name)."\"\n";
|
можно basename($file_name) поменять на любое другое? | |
|
|
|
|
|
|
|
для: psychomc
(19.09.2008 в 17:44)
| | У вас какая версия РНР используется? | |
|
|
|
|
|
|
|
для: sim5
(19.09.2008 в 17:47)
| | PHP Version 4.4.8 | |
|
|
|
|
|
|
|
для: psychomc
(19.09.2008 в 17:53)
| | Функция move_uploaded_file добавлена в версию начиная с 4.0.3. Именно ее нужно (рекомендуется) использовать, а не функцию copy(), так к при ее применении при закачивании файлов на сервер возможны различные ошибки.
Но даже, если вы используете функцию copy (string source, string dest), то в качестве первого аргумента вы используете временное имя файла под которым он закачан на сервер, а в качестве второго путь и имя, которое вы можете ему дать, либо использовать имя самого закачиваемого файла. Какие тут могут быть проблемы? Кроем одной - copy() не проверяет закачан ли реально файл или нет.
Что касается .dat - а вы хоть раз встречали чтобы Excel с таким расширением вам предлагал сохранить файл? | |
|
|
|
|
|
|
|
для: sim5
(19.09.2008 в 18:04)
| | да exel тут не причём, письмо кодировало файл в dat!
короче,я во всём разобрался.всё работает так как хотел.
у меня выводится сразу же время последнего обновление файла, я проверяю с помощью функции file_exists, так что copy для меня тоже катит.
sim5,спасибо большое за ответы. | |
|
|
|
|
|
|
|
для: psychomc
(19.09.2008 в 18:08)
| | Письмо не кодирует файл в dat, письмо может быть кодировано в base64, а по приему обратное... | |
|
|
|
|
|
|
|
для: sim5
(19.09.2008 в 18:15)
| | хм....ну тогда странно...а может это OutlooK???? | |
|
|
|
|
|
|
|
для: psychomc
(19.09.2008 в 18:32)
| | Вы каким сервером локальным пользуетесь? | |
|
|
|
|
|
|
|
для: sim5
(19.09.2008 в 18:35)
| | в общем у меня пакет Xampp 1.6.4 , в него входит:
+ Apache 2.2.6
+ MySQL 5.0.45
+ PHP 5.2.4 + PHP 4.4.7 + PEAR
+ PHP-Switch win32 1.0 (please use the "php-switch.bat")
+ XAMPP Control Version 2.5 from www.nat32.com
+ XAMPP Security 1.0
+ SQLite 2.8.15
+ OpenSSL 0.9.8e
+ phpMyAdmin 2.11.1
+ ADOdb 4.95
+ Mercury Mail Transport System v4.01b
+ FileZilla FTP Server 0.9.23
+ Webalizer 2.01-10
+ Zend Optimizer 3.3.0
+ eAccelerator 0.9.5.2 for PHP 5.2.4 (comment out in the php.ini) | |
|
|
|
|
|
|
|
для: psychomc
(19.09.2008 в 18:42)
| | Знаю что в него входит, ставил когда-то себе такую бодягу. Жаль. Например в Денвер работает sendmail заглушка, которая никуда ничего не отправляет реально, а складывает ваши почтовые отправления во временную папку. Просмотрев результат этих отправлений, можно проанализировать ошибки, ну и с того же Outlook отправить письмо далее, проверив прием на других почтовых серверах. | |
|
|
|
|
|
|
|
для: sim5
(19.09.2008 в 18:46)
| | скажите а на Ваш взгляд денвер лучше чем Xampp?Стоит его поставить?
У меня есть ещё HomeServer какой-то,но он мне не понравился.... | |
|
|
|
|
|
|
|
для: psychomc
(19.09.2008 в 18:48)
| | HomeServer это простой слишком, Xampp я забросил потому, что у меня постоянно были проблемы с MySQL в нем (может битый закачал такой, не знаю), пока разбирался, наткнулся (впервые) на Денвер - более после него мне ничего не надо. Ничего он при установке никуда не прописывает. Раз его распаковали, а потом можете его просто копировать, носить с собой на флешке и запускать его с флешки, никаких проблем, и все на нем есть для работы. Ну соответственно можно добавлять расширения. | |
|
|
|
|
|
|
|
для: sim5
(19.09.2008 в 18:52)
| | >HomeServer это простой слишком, Xampp я забросил потому, что у меня постоянно были проблемы с MySQL в нем (может битый закачал такой, не знаю), пока разбирался, наткнулся (впервые) на Денвер - более после него мне ничего не надо. Ничего он при установке никуда не прописывает. Раз его распаковали, а потом можете его просто копировать, носить с собой на флешке и запускать его с флешки, никаких проблем, и все на нем есть для работы. Ну соответственно можно добавлять расширения.
постоянно таскаю так с собой Xampp.Не разу проблем не было ни с php, ни с mysql, не с apache...
надеюсь и не будет )) | |
|
|
|
|
|
|
|
для: psychomc
(19.09.2008 в 18:53)
| | Ну тогда, если есть возможность, настройте почтовый сервер его так, чтобы он никуда ничего не слал, а ложил в папочку ваши отправки - проверяйте их. | |
|
|
|
|
|
|
|
для: sim5
(19.09.2008 в 18:56)
| | попробую | |
|
|
|