Re: PHP код для небольшой админки. Ошибка.
Написано: sendmail_path = "C:/Serv/xampp/sendmail/sendmail.exe -t"
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форум PHP-MyAdmin.RU → Курилка → PHP код для небольшой админки. Ошибка.
Написано: sendmail_path = "C:/Serv/xampp/sendmail/sendmail.exe -t"
Написано: sendmail_path = "C:/Serv/xampp/sendmail/sendmail.exe -t"
Очень хорошо, тогда ищите где подключается c:\Serv\xampp\sendmail\sendmail.php
А вы не могли бы посоветовать какой-нибудь бесплатный хост, на котором можно было бы проверить отправку почты? А то надоело мучиться с настройками.
А вы не могли бы посоветовать какой-нибудь бесплатный хост, на котором можно было бы проверить отправку почты?
Нет, бесплатный хостинг посоветовать не могу, не знаком с ними.
А как мне, хотя бы, проверить работоспособность кода из учебника?
P.S. А как считать value чекбоксов, если неизвестно, сколько чекбоксов на странице, но известно, что их имена имеют такой вид: to1 to2 to3... ?
А как мне, хотя бы, проверить работоспособность кода из учебника?
Если вы имеете в виду функцию mail(), то я уже давал рецепт выше.
А как считать value чекбоксов, если неизвестно, сколько чекбоксов на странице, но известно, что их имена имеют такой вид: to1 to2 to3
Если количество галочек заранее неизвестно, то их выводить надо в виде массива.
<input type="checkbox" name="check[]" value="on_1" />
<input type="checkbox" name="check[]" value="on_2" />
Далее в коде перебираем.
<?php
if (isset($_POST['check'])) {
foreach($_POST['check'] as $check) {
if (strlen($check) > 0) {
// Галочка отмечена и имеет какое-то значение value.
}
}
}
?>
Я хочу проверить, работает ли код из учебника. Сам код приведен в 72 посте. Лично у меня он никак не хочет работать. Пытался найти бесплатный хостинг, но мне сказали, что там, как правило, отключают отправку почты, чтоб не было спама.
И зачем там джаваскрипт и ссылка на сайт bigtip? У меня про этот скрипт в учебнике нет ни одного комментария.
Так, все. Забил на учебник.
Проверьте, пожалуйста, правильно ли я все понял.
<?php
// Выбираем email возле которых стоят галочки. (в переменной to содержаться email на которы хотим отправить письмо)
if (isset($_POST['check'])) {
foreach($_POST['check'] as $check) {
if (strlen($check) > 0) {
$to = $to . ", " . $check;
}
}
}
//Начинаем отправку почты.
//Пишем тему сообщения
$subject = "Birthday Reminders for August";
//Пишем сообщение
$message = '
<html>
<head>
<title>Birthday Reminders for August</title>
</head>
<body>
<p>Here are the birthdays upcoming in August!</p>
</body>
</html>';
// Указываем кодировку письма
$headers = "Content-type: text/html; charset=windows-1251 \r\n";
//Пишем, от кого письмо
$headers .= "From: Birthday Reminder <birthday@example.com>\r\n";
// Отправляем скрытую копию. Плохо понимаю, что это такое. Но мне кажется, что копия отправленного письма отправляется на тот email, который тут написан. (Поправьте, пожалуйста, если не правильно :))
$headers .= "Bcc: birthday-archive@example.com\r\n";
// Ну и отправляем письмо.
mail($to, $subject, $message, $headers);
?>
Теперь разбираюсь, как отправлять файлы. Вот пример кода с сайта http://phpclub.ru/detail/article/mail :
<?php
//Подключаем PEAR.
include('Mail.php');
include('Mail/mime.php');
// В переменных text и html содержится текст сообщения.
$text = 'Text version of email';
$html = '<html><body>HTML version of email</body></html>';
//Пишем расположение файла.
$file = '/home/richard/example.php';
//Дальше не могу понять строку.
$crlf = "\r\n";
//Тут пишем от кого послано письмо и тему письма.
$hdrs = array(
'From' => 'you@yourdomain.com',
'Subject' => 'Test mime message'
);
//Опять непонятная строка
$mime = new Mail_mime($crlf);
//Теперь вообще ничего не понятно, но есть предположения, как это может работать.
//Возможно, что дальше прикрепляется файл и определяется формат письма (html или простой текст.)
$mime->setTXTBody($text);
$mime->setHTMLBody($html);
$mime->addAttachment($file, 'text/plain');
//Тут, вроде бы, переменно body присваивается или переменная text или html, но как это делается я не пойму.
$body = $mime->get();
$hdrs = $mime->headers($hdrs);
$mail =& Mail::factory('mail');
//Теперь отправляется письмо на email postmaster@localhost, в hdrs содержиться тема письма и от кого оно отправлено, в body - текст письма.
$mail->send('postmaster@localhost', $hdrs, $body);
?>
Отправляем скрытую копию. Плохо понимаю, что это такое. Но мне кажется, что копия отправленного письма отправляется на тот email, который тут написан. (Поправьте, пожалуйста, если не правильно
)
Все верно, это копия письма. Если копию отправлять не надо, то строку можно удалить.
//Дальше не могу понять строку.
$crlf = "\r\n";
Эту строку трогать не надо, оставляйте ее всегда в таком виде. Из-за особенностей операционных систем, они по разному обрабатывают символы переноса строки, \r\n - это лучший вариант и его надо использовать.
//Опять непонятная строка
$mime = new Mail_mime($crlf);
Создание класса. В переменной $mime создается класс к которому дальше будет происходить обращение.
Здесь формируется тело письма. Если письмо состоит из текста, то используется функция setTXTBody(), при HTML письме используется функция setHTMLBody(). Не используйте обе функции, только одну из них.
$mime->setTXTBody($text);
$mime->setHTMLBody($html);
Здесь происходит прикрепление файла к письму. Обратите внимание, что кроме содержимого файла, вторым параметром надо передавать в функции его MIME тип; у текстового файла это будет text/plain.
$mime->addAttachment($file, 'text/plain');
Создается закодированное тело письма состоящее из текста и прикрепленного файла, все в виде одной кучи нечитаемых (закодированных) символов.
$body = $mime->get();
Формируются заголовки письма.
$hdrs = $mime->headers($hdrs);
Теперь создается ссылка на класс Mail, в виде параметра передается (mail), что указывает классу использовать функцию mail() PHP.
$mail =& Mail::factory('mail');
Отправка письма. Первый параметр - это адресат (кому), второй параметр - это сформированные заголовки письма, третий параметр - это тело письма вместе с прикрепленным файлом.
$mail->send('postmaster@localhost', $hdrs, $body);
Ага. Вроде понял.
И вот еще 2 вопросика:
1. На сайте написано, что надо поставить библиотеку http://pear.php.net/package/Mail_Mime. Но в коде библиотеку подключают так:
include('Mail.php');
include('Mail/mime.php');
В Mail_Mime файла Mail.php нет. Вы писали, что надо поставить еще http://pear.php.net/package/Mail. А вот как это правильно поставить? Сперва в папку со страницей отправки почты распаковать Mail, а потом распаковать туда же Mail_mime? Но тогда получается, что надо написать не include('Mail/mime.php');, а include('mime.php').
2. text/plain - это текстовый файл. Это файлы формата .txt .doc .pdf? И, например, файл .doc, в котором есть картинки, нормально отправится?
Так, с 1 вопросом разобрался. Переустановил сервер, снова настроил заглушку, написал пробный код:
<?php
include('Mail.php');
include('Mail/mime.php');
if (isset($_POST['check'])) {
foreach($_POST['check'] as $check) {
if (strlen($check) > 0) {
$to = $to . ", " . $check;
}
}
}
$text = 'Text version of email';
$file = '/atts/file.txt';
$crlf = "\r\n";
$hdrs = array(
'From' => 'you@yourdomain.com',
'Subject' => 'Test mime message'
);
$mime = new Mail_mime($crlf);
$mime->setTXTBody($text);
$mime->addAttachment($file, 'text/plain');
$body = $mime->get();
$hdrs = $mime->headers($hdrs);
$mail =& Mail::factory('mail');
$mail->send($to, $hdrs, $body);
?>
На выходе получаю:
To: , sfs@sdfs.ru, pupkin@gmail.com, bIbIbIbI@bIbI.com
Subject: Test mime message
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
From: you@yourdomain.com
Text version of email
Тут все правильно?
В Mail_Mime файла Mail.php нет.
Нет Mail.php - это другой класс, его надо брать отсюда http://pear.php.net/package/Mail . Установка не составит труда, просто скачайте оба архива с классами и распакуйте их в любой каталог, затем обязательно укажите относительный путь к подключаемым двум файлам. Где они будут находиться - значения не имеет.
Заголовки у всех файлов разные и если для текстового .txt файла можно писать text/plain, то для других нужны свои заголовки, иначе они будут неверно приниматься при попытке скачать файл из письма. При загрузке файла через POST, в массиве есть переменная содержащая тип файла $_FILES['userfile']['type'], ее можно использовать. Если файлы не загружаются, а берутся с сервера, то надо подставлять тип файла по расширению: для расширения .pdf подставлять application/pdf; картинка .gif будет image/gif; .doc файл имеет тип application/msword и т. д.
Наиболее распространенные типы файлов можно посмотреть здесь: http://www.w3schools.com/media/media_mimeref.asp
Тут все правильно?
Правильно, только ниже должен идти файл.
И еще один момент - изначально кодировка письма будет latin1, поэтому если вы захотите создать письмо в windows-1251, например, то придется сделать так:
$param = array(
'text_encoding' => '7bit',
'html_encoding' => 'quoted-printable',
'head_charset' => 'windows-1251',
'text_charset' => 'windows-1251',
'html_charset' => 'windows-1251'
);
$body = $mime->get($param);
Блин. После этого кода:
if (isset($_POST['check'])) {
foreach($_POST['check'] as $check) {
if (strlen($check) > 0) {
$to = $to . ", " . $check;
}
}
}
Перед первым emailом появляется запятая To: , sfs@sdfs.ru, pupkin@gmail.com, bIbIbIbI@bIbI.com
Если я на нее забью и оставлю ее тут, то на отправку почты это не повлияет?
То, что снизу нет файла, это, наверное, из-за заглушки.
Перепишите так.
$a_to = array();
if (isset($_POST['check'])) {
foreach($_POST['check'] as $check) {
if (strlen($check) > 0) {
$a_to[] = $check;
}
}
}
if (count($a_to) > 0) {
$to = implode(', ', $a_to);
}
То, что снизу нет файла, это, наверное, из-за заглушки.
Не уверен. Тело файла быть должно. Заглушка ничего с письмом обычно не делает, как оно формируется - так и передается на вывод.
Ага. Вроде все.
Значит в итоге такой код должен работать?
<?php
include('Mail.php');
include('Mail/mime.php');
$a_to = array();
if (isset($_POST['check'])) {
foreach($_POST['check'] as $check) {
if (strlen($check) > 0) {
$a_to[] = $check;
}
}
}
if (count($a_to) > 0) {
$to = implode(', ', $a_to);
}
$text = 'Text version of email';
$file = '/atts/file.txt';
$crlf = "\r\n";
$hdrs = array(
'From' => 'you@yourdomain.com',
'Subject' => 'Test mime message'
);
$param = array(
'text_encoding' => '7bit',
'html_encoding' => 'quoted-printable',
'head_charset' => 'windows-1251',
'text_charset' => 'windows-1251',
'html_charset' => 'windows-1251'
);
$mime = new Mail_mime($crlf);
$mime->setTXTBody($text);
$mime->addAttachment($file, 'text/plain');
$body = $mime->get($param);
$hdrs = $mime->headers($hdrs);
$mail =& Mail::factory('mail');
$mail->send($to, $hdrs, $body);
?>
Ну и остается только интерфейс для ввода текста письма прицепить, ну и там по-мелочам...
Значит в итоге такой код должен работать?
Да, должен работать. Только путь к прикрепляемому файлу проверьте с помощью функции file_exists().
Не все оказалось так хорошо.
1. Как с одной страницы на другую передать переменную $to? Я в других местах использовал глобальные переменные, которые у меня находились в отдельном файле. И если хотел получить переменную то просто писал global $to. А тбрать переменную как глобальную с другой страницу что-то не выходит...
2. При отправке сообщения на русском языке вместо текста отправляется вот такое: =CF=F0=E8=E2=E5=F2!
3. Вот этот код:
$hdrs = array(
'From' => 'you@yourdomain.com',
'Subject' => 'Test mime message'
);
Указывает тему сообщение и от кого оно отправлено. А если у меня есть переменные $From и $Subject, в которых содержится мыло отправителя и тема, то как мне их в этот код всунуть?
Как с одной страницы на другую передать переменную $to?
Не смог понять.
сообщения на русском языке вместо текста отправляется вот такое: =CF=F0=E8=E2=E5=F2
Правильно, именно так и кодируются данные в письмах.
Здесь все элементарно.
$hdrs = array(
'From' => $From,
'Subject' => $Subject
);
Ну, вот у меня на странице 1.php есть переменная $to. Дальше, при нажатии на кнопку, открывается страница 2.php. И надо как-то передать значение переменной со страницы 1 на страницу 2. Глобальные переменные что-то не хотят работать...
А если данные в письме так кодируются, то юзер то сможет увидеть нормальный текст?
И тема сообщения тоже выглядит так: =?windows-1251?Q?=D2=E5=EC=E0?=
Глобальные переменные что-то не хотят работать
Они и не должны работать. На разных скриптах разные переменные. Передать значения с одной страницы на другую можно только через урл методом GET или через POST, отправкой формы. Как вариант есть еще кукисы COOKIE (не рекомендуется для большого объема данных) и сессии SESSION.
А если данные в письме так кодируются, то юзер то сможет увидеть нормальный текст?
Разумеется, для того и кодируется, чтобы все выводилось нормально.
Вобщем, стал загонять emailы в отдельный файл, а потом считывать их оттуда.
Что-то странное происходит...
Щас попробовал запустить код на сервере. Он не заработал. На этом сервере был сайт, на котором уже была страница для отправки почты. Я скопировал оттуда код, изменил его. Код работает, но письмо почему-то на почту не приходит...
Код переписать забыл Самое смешное, что на моем локальном сервере в заглушку письмо приходит, а на сервере... все написано правильно, ошибок нет, код срабатывает, но письмо на почту не приходит
Есть какие-нибудь способы проверить, в чем проблема?
Есть какие-нибудь способы проверить, в чем проблема?
На сервере можно посмотреть журналы ошибок. Можно проверить простейший код отправки письма функцией mail(), здесь есть пример http://lv.php.net/manual/en/function.mail.php. Если пример не работает и функция mail() вернет false - значит не работает сама функция на сервере.
Да просто тут люди, с которыми я пытался запустить код. Могли только управлять сайтом. (странички новые создавать, например) А к настройкам сервера у них доступа нет.
А где этот журнал обычно находиться? А то я только в апаче знаю что, где лежит.
Форум PHP-MyAdmin.RU → Курилка → PHP код для небольшой админки. Ошибка.
Форум работает на PunBB, при поддержке Informer Technologies, Inc
Currently installed 7 official extensions. Copyright © 2003–2009 PunBB.